GLSL几何着色器:遍历整个网格

时间:2011-09-04 21:41:27

标签: glsl geometry-shader

我的目标是根据它们的顺序为顶点着色

编辑:长时间目标:访问前后顶点以模拟重力行为

我使用了以下代码

#version 120
#extension GL_EXT_geometry_shader4 : enable
void main( void ) {
    for( int i = 0 ; i < gl_VerticesIn ; i++ ) {
        gl_FrontColor = vec4(float(i)/float(gl_VerticesIn),0.0,0.0,1.0);
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
}

但所有顶点都是黑色的,似乎 i 总是被评估为0,我错过了什么或做错了吗?

编辑:找出元问题:如何将所有模型几何体提供给单个几何着色器调用,因此主循环迭代所有顶点,而不是每个三角形。

1 个答案:

答案 0 :(得分:2)

您不要让单个几何着色器调用遍历所有顶点,而是为每个原始基元(点,线,三角形......)调用它。

解决方案更容易:在顶点着色器(实际上为每个顶点调用)中,您可以读取包含顶点索引的特殊变量gl_VertexID。该索引或者只是针对每个顶点递增的计数器(如果使用glDrawArrays)并且通过每个绘制调用重置,或者来自索引数组的索引(如果使用glDrawElements)。

编辑:关于长期目标。不是直接的,但您可以使用texture buffer。这基本上使您能够直接线性数组访问缓冲区对象(在您的情况下是顶点缓冲区),然后您可以使用此顶点索引进行索引。但也可能有其他方法可以实现这一点,这可能足以解决另一个问题。