2010-12-06 180 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