我只是搞乱了一些几何着色器,它们列出了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();
}
我可能错过了一些愚蠢的东西。
答案 0 :(得分:3)
将顶点着色器中的每个顶点乘以gl_ModelViewMatrix
。在世界空间中推理起来要容易得多。
之后,您可以在几何着色器中执行操作,但不要忘记在发射顶点之前将顶点乘以投影矩阵。这应该可以解决您的问题。
编辑:我忘记了转换为查看空间的ModelViewMatrix,抱歉。只需传递VS中的顶点而不对其执行任何操作。这意味着你仍然会在GS的模型空间中。您的偏移是否在GS中工作,然后在发射之前,使用gl_ModelViewProjectionMatrix
进行变换。
答案 1 :(得分:1)
几何着色器在顶点着色器之后运行。因此,您对顶点所做的更改是在屏幕坐标中进行的,而不是世界。