2

我一直在使用 DirectX(带有 XNA)一段时间,最近切换到了 OpenGL。我真的很喜欢它,但有一件事让我很生气。

我一直在尝试在顶点着色器中实现需要动态索引的东西,但有人告诉我这需要 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 不公开的硬件功能?

4

2 回答 2

0

从您的链接:

请注意,没有一种完美的实例化技术。与 Xbox 360 相比,这必须在 Windows 上以不同的方式实现,并且在 Windows 上,理想的技术需要着色器 3.0,但也有一种可用于着色器 2.0 的后备方法。此示例实现了几种不同的实例化技术,因此它可以在平台和着色器版本上工作。

不是胆大的部分。因此,在此基础上,您应该能够在着色器模型 3 上进行类似的实例化。着色器模型 2 的实例化通常使用矩阵调色板执行。这意味着您可以通过一次上传大量转换矩阵来一次调用渲染多个网格。这减少了绘制调用并提高了速度。

无论如何,对于 OpenGL,最终确定此扩展存在很多麻烦,因此您需要着色器 4。但是,您仍然可以在 yoru 顶点结构中粘贴每个顶点矩阵调色板索引并使用着色器进行矩阵调色板渲染......

于 2010-12-06T18:13:34.897 回答
0

您可以使用 glUniform3fv 之类的东西为您的光线方向上传一个数组,然后(假设我理解您正在尝试正确执行的操作)您只需要您的顶点格式在该数组中包含一个索引(因此这些有很多重复如果索引仅在每个网格或某物上更改一次,则为索引)。如果您还不知道,您可以使用 glGetAttribLocation + glVertexAttribPointer 将这样的任意顶点属性发送到着色器(而不是使用已弃用的内置属性,如 gl_Vertex、gl_Normal 等)。

于 2011-01-04T07:18:24.150 回答