使用几何着色器进行实例化

时间:2011-02-14 18:36:33

标签: opengl graphics directx shader geometry-shader

所以我想绘制很多四边形(甚至是立方体),偶然发现了这个叫做几何着色器的可爱之物。

我现在知道它是如何工作的,我可能会操纵它为顶点缓冲区中的每个顶点绘制一个立方体,但我不确定它是否是正确的方法。几何着色器在顶点着色器和片段着色器之间发生,因此它适用于屏幕空间中的顶点。但我需要他们在世界空间进行转换。

那么,可以让我的顶点着色器简单地将输入传递给几何着色器,并在创建基元后使几何着色器乘以modelviewproj矩阵吗?统一着色器架构应该没有问题,但在使顶点着色器冗余时我仍感到不安。

有替代品吗?或者这真的是'正确'的方式吗?

1 个答案:

答案 0 :(得分:3)

完全没问题。

除此之外,请考虑使用带有顶点属性除数(glDrawArraysInstanced)的实例化渲染(glDrawElementsInstancedglVertexAttribDivisor)。这样,您可以在没有几何着色器的情况下完成相同的任务。

例如,您可以绑定常规立方体几何体。然后,您有一个特殊的顶点属性,可以为每个实例提供所需的立方体位置。你应该用divisor = 1绑定它,它将使每个绘制的实例前进。然后使用glDraw*Instanced绘制多维数据集,指定实例数。

您还可以使用gl_VertexIDgl_InstanceID为坐标对纹理中的输入数据进行采样。