文明5渲染分析:樹林

dx9下的植被渲染

乍一看Geometry里沒多少三角形,在屏幕上卻渲染出了很多個,而且位置都有很大差異。仔細看下Geometry就能發現起始裡面有720個三角形,但這個模型看起來也就16個三角形,剩下的哪去了?

看一下vs

有個treeLocation數組,再看下面紅色部分,這是類似骨骼動畫的方式來做的。因為視角固定,所以一個VewProjMatrix就夠了,每個位置也只要一個Vector4,這麼看還是很省寄存器的。雖然這個shader寫的用了90個位置,但其實寄存器有256個,用到200多個位置也不是問題,只是這個應用環境下沒用那麼多。紅框內shader是位置變化意思就是

outputPosition = (vertexPosition + treeLocation) * ViewProjMatrix

再看開頭的問題,720個三角形分成了位置完全一樣的45份(45=720/16)。45剛好是90的一半,一份模型能分成2部分,寬一些的矩形和窄一些的矩形,這倆骨骼索引不同的,每份佔2個索引。

再看貼圖和渲染結果,雖然每份位置相同,但是uv是不一樣的,可以增加豐富程度,這應該就是不用Geometry Instancing API的原因吧。其實這種方法就是GPU Gems2 chapter3 Inside Geometry Instancing中提到的Vertex constants instancing

總結

1,用做骨骼動畫的方式實現一次drawcall渲染一塊樹林,每個樹的位置可以動態設置,樹片的模型和uv都可以有差異。如果不需要每個樹片有差異,則可以使用Geometry Instancing API.

2,因為視角固定,樹片都以一個方向面向相機,可以優化為只用一個ViewProjMatrix,且每個treeLocation只佔vector4

推薦閱讀:

3D遊戲開發團隊使用git進行版本控制時,怎麼處理二進位文件?
為什麼遠程合作的遊戲項目不好做(1)
ActionScript3現在是否還值得學?
遊戲伺服器全服廣播消息正確的做法?
橙光遊戲的製作和適應人群都是學生么?該怎麼看待這一點

TAG:文明5 | 计算机图形学 | 游戏开发 |