dx9下的植被渲染
乍一看Geometry里沒多少三角形鲸鹦,在屏幕上卻渲染出了很多個斤富,而且位置都有很大差異葵诈。仔細看下Geometry就能發(fā)現(xiàn)起始里面有720個三角形塑悼,但這個模型看起來也就16個三角形劲适,剩下的哪去了?
看一下vs
有個treeLocation數(shù)組厢蒜,再看下面紅色部分霞势,這是類似骨骼動畫的方式來做的。因為視角固定斑鸦,所以一個VewProjMatrix就夠了愕贡,每個位置也只要一個Vector4,這么看還是很省寄存器的巷屿。雖然這個shader寫的用了90個位置固以,但其實寄存器有256個,用到200多個位置也不是問題嘱巾,只是這個應(yīng)用環(huán)境下沒用那么多憨琳。紅框內(nèi)shader是位置變化意思就是
outputPosition = (vertexPosition + treeLocation) * ViewProjMatrix
再看開頭的問題,720個三角形分成了位置完全一樣的45份(45=720/16)旬昭。45剛好是90的一半篙螟,一份模型能分成2部分,寬一些的矩形和窄一些的矩形稳懒,這倆骨骼索引不同的闲擦,每份占2個索引。
再看貼圖和渲染結(jié)果场梆,雖然每份位置相同墅冷,但是uv是不一樣的,可以增加豐富程度或油,這應(yīng)該就是不用Geometry Instancing API的原因吧寞忿。其實這種方法就是GPU Gems2 chapter3 Inside Geometry Instancing中提到的Vertex constants instancing
總結(jié)
1,用做骨骼動畫的方式實現(xiàn)一次drawcall渲染一塊樹林顶岸,每個樹的位置可以動態(tài)設(shè)置腔彰,樹片的模型和uv都可以有差異。如果不需要每個樹片有差異辖佣,則可以使用Geometry Instancing API.
2霹抛,因為視角固定,樹片都以一個方向面向相機卷谈,可以優(yōu)化為只用一個ViewProjMatrix杯拐,且每個treeLocation只占vector4