6

我正在尝试编写一个简单的几何着色器,它在尝试修改内容之前只通过顶点。

我的顶点着色器是

#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来自我的顶点着色器的输入,如果需要,那是如何完成的?

4

1 回答 1

7

我的几何着色器与该页面上列出的完全一样

是的,但您的免费顶点和片段着色器不是.

信息流经 OpenGL 管道如下:首先,顶点着色器获取内容。如果存在,它将其输出传递给几何着色器。几何着色器将其输出传递给片段着色器(当然是在习惯的三角形光栅化之后)。片段着色器将其输出传递到混合阶段。

您的顶点着色器有两个输出:gl_PositionvertexColor。但是,您的几何着色器只需要一个输入:gl_in[0].gl_Position. 这在 GLSL 中是不合法的:如果一个阶段输出一个值,则下一个阶段必须输入它。唯一的例外是 GLSL 定义的值,例如gl_Position,由光栅化器使用。

如果您希望传递数据,则传递GS 需要实际传递数据。您需要在 GS 中正确输入:

in vec4 vertexColor[];

但是,GLSL 中的全局变量不能命名相同。因此,您不能将vertexColor其作为输入输出。因此,您必须更改输出的名称(或使用接口块):

out vec4 gsColor;

您的片段着色器现在必须接受in vec4 gsColor;并使用它。

当您尝试链接这些着色器时,您的编译器应该会为您提供适当的信息日志来解释不匹配的情况。当您的着色器无法链接时,您是否正在获取您的信息日志?如果没有,你应该。

于 2012-01-12T20:51:42.980 回答