GLSL 1.5 简单几何着色器

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,如果需要,那应该如何实现?

请返回已翻译的文本。 - n0rd
那并没有回答我的问题。我的几何着色器与该页面上列出的完全相同,唯一的区别是去掉了for循环。然而它不起作用。什么也没有被绘制。此外,该页面上显示的顶点和片段着色器适用于glsl 1.20。我无法理解如何将它们全部链接在一起,也找不到任何有关如何修复的信息。 - user1139069
1个回答

7

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

是的,但您的顶点和片段着色器并非如此。

OpenGL管线中的信息流如下:首先,顶点着色器获取内容。如果有几何着色器,则将其输出传递给几何着色器。在三角形光栅化之后,几何着色器将其输出传递给片段着色器。最后,片段着色器将其输出传递给混合阶段。

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

如果您希望通过GS进行数据传递,则需要确实通过数据。您需要在GS中使用正确的输入:

in vec4 vertexColor[];

然而,在GLSL中全局变量不能取相同的名称。因此,你不能将vertexColor作为输入和输出。所以,你必须改变输出的名称(或使用接口块):

out vec4 gsColor;

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

当您尝试连接这些着色器时,编译器应该会提供适当的信息记录,说明不匹配的地方。如果没有收到着色器链接失败的信息记录,您就应该检查一下。


gsColor需要是数组吗?如果我添加了顶点,那么gsColor输出如何匹配这些添加的顶点呢?如果像我猜测的那样,gsColor应该是一个数组,那么这个数组的索引是否与我发出的顶点的顺序相匹配? - user1139069
几何着色器中的 gl_Position 也不是一个数组。您需要编写每个输出,然后调用 EmitVertex 来生成所有这些输出。对于每个发射的顶点,您需要设置 gsColor,就像您设置 gl_Position 一样。 - Nicol Bolas
像这样的代码 gl_Position = gl_in[0].gl_Position; gsColor = vertexColor[0] EmitVertex();gl_Position = gl_in[1].gl_Position; gsColor = vertexColor[1] EmitVertex(); 是吗? - user1139069

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接