2011-02-14 62 views
3

所以我想繪製大量的四邊形(甚至立方體),並偶然發現了這個可愛的東西,叫做幾何着色器。使用幾何着色器進行實例化

現在我已經知道它是如何工作的,我可能會操縱它爲頂點緩衝區中的每個頂點繪製一個立方體,但我不確定這是否是正確的方式。幾何着色器發生在頂點着色器和片段着色器之間,所以它在屏幕空間的頂點上工作。但我需要他們在世界空間做轉變。

那麼,讓我的頂點着色器只需將輸入管道輸入到幾何着色器,並在創建基元之後讓幾何着色器乘以modelviewproj矩陣即可?統一着色器架構應該沒有問題,但是在使頂點着色器變得冗餘的時候,我仍然感到不自在。

有替代品嗎?或者這真的是「正確」的方式嗎?

回答

3

完全沒問題。

除此之外,考慮使用實例化渲染(glDrawArraysInstancedglDrawElementsInstanced)與頂點屬性除數(glVertexAttribDivisor)。這樣你就可以完成同樣的任務,而不需要幾何着色器。

例如,您可以有一個常規的立方體幾何結構。然後你有一個特殊的頂點屬性,它攜帶你想要的每個實例的立方體位置。你應該用一個除數= 1來綁定它,對於每個繪製的實例,什麼會使它前進。然後使用glDraw*Instanced繪製立方體,指定實例的數量。

您還可以使用gl_VertexIDgl_InstanceID作爲座標採樣來自紋理的輸入數據。

+0

感謝您的實例提示,但速度很慢。它將我限制在整個立方體中,所以我無法剔除任何隱藏的面孔,並且每個四邊形的實例化是毫無意義的,因爲描述每個四邊形變換的4x4矩陣幾乎比直接使用4個vert更大。 – Hannesh 2011-02-19 21:44:29