2010-12-06 88 views
2

我一直在使用DirectX(與XNA)一段時間,並且最近切換到了OpenGL。我真的很喜歡它,但有一件事讓我很煩惱。GLSL動態索引陣列

我一直在試圖實現一些需要在頂點着色器中進行動態索引的東西,但我被告知這需要SM 4.0的平等。但是我知道,即使使用SM 2.0,甚至可能使用1.0,DX也能工作。 XNA的實例化示例使用此示例在SM2.0唯一卡http://create.msdn.com/en-US/education/catalog/sample/mesh_instancing上進行實例化。

編譯器不能將其「展開」爲if語句的巨大列表,因爲這肯定會超過SM2上250個實例的指令限制。

所以DX做了一些我不能用OpenGL做的技巧,我可以操縱OpenGL來做同樣的事,還是OpenGL不公開的硬件功能?

+0

我不知道答案,但出於好奇,什麼是SM? – LarsH 2010-12-06 17:14:42

+0

[「着色器模型」](http://en.wikipedia.org/wiki/High_Level_Shader_Language#Shader_model_comparison) – genpfault 2010-12-06 17:17:30

回答

0

你可以上傳一個類似glUniform3fv的光照方向的數組,然後(假設我明白你想要做的是正確的),你只需要你的頂點格式在這個數組中包含一個索引如果索引每個網格只改變一次或者某種東西,那麼這些索引會大量重複)。如果您還不知道,可以使用glGetAttribLocation + glVertexAttribPointer向着色器發送像這樣的任意頂點屬性(與使用不推薦使用的內置屬性(如gl_Vertex,gl_Normal等)不同)。

0

從你的鏈接:

注意,沒有一個統一的完美 實例化技術。這必須在 的Windows不同的方式相比,到Xbox 360 實施,並在 Windows中的理想技術需要 着色器3.0,但也有 回退的方法,將與 着色器2.0工作。此示例實現了 幾種不同的實例 技術,因此它可以在 平臺和着色器版本上工作。

不是有膽量的部分。因此,您應該能夠在着色器模型3上執行類似的實例。着色器模型2的實例化通常使用矩陣調色板來執行。它意味着你可以通過一次性上傳一個轉換矩陣的負載來在一次調用中渲染多個網格。這可以減少平局並提高速度。

無論如何,對於OpenGL來說,最終確定這個擴展有很多麻煩,因此需要着色器4.然而,您仍然可以在yoru頂點結構中粘貼每個頂點矩陣調色板索引,並使用着色器進行矩陣調色板渲染。

+0

SM3技術使用2個頂點流,完全不同。這個矩陣調色板就是我的意思,但是在DX中我也可以將vec3作爲一個數組傳遞,我可以在OpenGL中做到這一點嗎? – Hannesh 2010-12-07 09:43:08