几何着色器 - 指向不保持世界位置的三角形条带

时间:2010-10-31 14:34:46

标签: opengl geometry glsl shader

我只是搞乱了一些几何着色器,它们列出了GL_POINTS并输出了一个带有三角形条的盒子。我有它基本上工作,但当我放大/缩小或平移三角形条带遍布整个地方,并没有保持他们在世界上的位置,但仍然正确绘制框。

例如,如果我给出输入(5,5,0),它将绘制带有这些点的三角形条带以形成一个框:

(5,5,0)
(5.5,5,0)
(5,5.5,0)
(5.5,5.5,0)

顶点着色器:


// Vertex Shader
#version 130

in vec4 vVertex;

void main(void)
{ 
    gl_Position = gl_ModelViewProjectionMatrix * vVertex;
}

几何着色器:


version 130 
#extension GL_EXT_geometry_shader4 : enable

void main(void)
{
    vec4 a;
    vec4 b;
    vec4 c;
    vec4 d;

    int i = 0;
    for(i = 0; i  gl_VerticesIn; i++)
    {
        a = gl_PositionIn[i];
        //a.x -= 0.5;
        //a.y -= 0.5;
        //a.z = 0.0;
        gl_Position = a;
        EmitVertex();

        b = gl_PositionIn[i];
        b.x += 0.5;
        //b.y -= 0.5;
        //b.z = 0.0;
        gl_Position = b;
        EmitVertex();

        d = gl_PositionIn[i];
        //d.x -= 0.5;
        d.y += 0.5;
        //d.z = 0.0;
        gl_Position = d;        
        EmitVertex();

        c = gl_PositionIn[i];
        c.x += 0.5;
        c.y += 0.5;
        //c.z = 0.0;
        gl_Position = c;
        EmitVertex();

    }
    EndPrimitive();

}
我可能错过了一些愚蠢的东西。

2 个答案:

答案 0 :(得分:3)

将顶点着色器中的每个顶点乘以gl_ModelViewMatrix。在世界空间中推理起来要容易得多。

之后,您可以在几何着色器中执行操作,但不要忘记在发射顶点之前将顶点乘以投影矩阵。这应该可以解决您的问题。

编辑:我忘记了转换为查看空间的ModelViewMatrix,抱歉。只需传递VS中的顶点而不对其执行任何操作。这意味着你仍然会在GS的模型空间中。您的偏移是否在GS中工作,然后在发射之前,使用gl_ModelViewProjectionMatrix进行变换。

答案 1 :(得分:1)

几何着色器在顶点着色器之后运行。因此,您对顶点所做的更改是在屏幕坐标中进行的,而不是世界。