我正在尝试编写一个简单的几何着色器,它在尝试修改内容之前通过顶点。
我的顶点着色器是
#version 150 core
in vec3 inPosition;
in vec4 inColor;
out vec4 vertexColor;
void main() {
vertexColor = inColor;
gl_Position = vec4(inPosition, 1.0);
}
我的几何着色器是
#version 150 core
layout (triangles) in;
layout (triangle_strip, max_vertices=3) out;
void main() {
gl_Position = gl_in[0].gl_Position;
EmitVertex();
gl_Position = gl_in[1].gl_Position;
EmitVertex();
gl_Position = gl_in[2].gl_Position;
EmitVertex();
EndPrimitive();
}
我的片段着色器是
#version 150 core
in vec4 vertexColor;
out vec4 fragColor;
void main() {
fragColor = vertexColor;
}
如果没有链接几何着色器,一切正常。但是,当我在几何着色器中链接时,它会停止工作。我错过了什么?我的几何着色器是否需要来自我的顶点着色器的vertexColor
的输入,如果是这样,那么它是如何完成的?
答案 0 :(得分:7)
我的几何着色器与该页面上列出的几何着色器完全相同
是的,但您的免费顶点和片段着色器不是。
信息流经OpenGL管道,如下所示:首先,顶点着色器获取内容。如果存在,它会将其输出传递给几何着色器。几何着色器将其输出传递给片段着色器(当然,在常规三角形光栅之后)。片段着色器将其输出传递给混合阶段。
您的顶点着色器有两个输出:gl_Position
和vertexColor
。但是,几何着色器只需要一个输入:gl_in[0].gl_Position
。这在GLSL中是不合法的:如果一个阶段输出一个值,则下一个阶段必须输入它。唯一的例外是GLSL定义的值,例如gl_Position
,它由光栅化器使用。
如果你想要传递数据,你的传递GS需要实际通过传递数据。您需要在GS中输入正确的输入:
in vec4 vertexColor[];
但是,GLSL中的全局变量不能相同。因此,您不能将vertexColor
作为输入和作为输出。因此,您必须更改输出的名称(或使用interface blocks):
out vec4 gsColor;
您的片段着色器现在必须使用in vec4 gsColor;
并使用它。
当您尝试链接这些着色器时,您的编译器应该已经为您提供了适当的信息日志,解释了不匹配。当着色器无法链接时,您是否收到了信息日志?如果没有,你应该。