GLSL 1.5简单几何着色器

use*_*069 6 opengl shader glsl geometry-shader

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

我的顶点着色器是

#version 150 core
in vec3 inPosition;
in vec4 inColor;

out vec4 vertexColor;

void main() {
    vertexColor = inColor;
    gl_Position = vec4(inPosition, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

我的几何着色器是

#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();
}
Run Code Online (Sandbox Code Playgroud)

我的片段着色器是

#version 150 core
in vec4 vertexColor;
out vec4 fragColor;

void main() {
    fragColor = vertexColor;
}
Run Code Online (Sandbox Code Playgroud)

如果没有链接几何着色器,一切正常.但是,当我在几何着色器中链接时,它停止工作.我错过了什么?我的几何着色器是否需要vertexColor来自我的顶点着色器的输入,如果是这样,如何完成?

Nic*_*las 7

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

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

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

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

如果你希望它传递,你的传递GS需要实际传递数据.您需要在GS中输入正确的输入:

in vec4 vertexColor[];
Run Code Online (Sandbox Code Playgroud)

但是,GLSL中的全局变量不能相同.所以你不能把它vertexColor作为输入输出.因此,您必须更改输出的名称(或使用接口块):

out vec4 gsColor;
Run Code Online (Sandbox Code Playgroud)

您的片段着色器现在必须in vec4 gsColor;使用它.

当您尝试链接这些着色器时,编译器应该为您提供适当的信息日志,说明不匹配.当着色器无法链接时,您是否收到了信息日志?如果没有,你应该.