【问题标题】:GLSL 1.5 Simple Geometry shaderGLSL 1.5 简单几何着色器
【发布时间】:2012-01-09 22:09:55
【问题描述】:

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

我的顶点着色器是

#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,如果需要,如何完成?

【问题讨论】:

  • 这不能回答我的问题。我的几何着色器与该页面上列出的完全一样,只是删除了 for 循环。但是它不起作用。什么都画不出来。此外,该页面上显示的顶点和片段着色器适用于 glsl 1.20。将所有这些链接在一起存在问题,我不明白,也找不到任何有关如何修复的信息。

标签: opengl glsl shader geometry-shader


【解决方案1】:

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

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

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

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

如果您希望它是直通的,您的直通 GS 需要实际通过数据。您需要在 GS 中正确输入:

in vec4 vertexColor[];

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

out vec4 gsColor;

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

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

【讨论】:

  • gsColor 是否需要是数组,如果我没有添加顶点,gsColor 输出将如何匹配添加的顶点?如果 gsColor 应该是我猜想的数组,那么该数组的索引是否与我发射的顶点的顺序相匹配?
  • gl_Position 在几何着色器中也不是数组。您编写每个输出,然后调用EmitVertex 来生成所有这些输出。你为每个发射的顶点设置gsColor,就像你为每个发射的顶点设置gl_Position一样。
  • 类似gl_Position = gl_in[0].gl_Position; gsColor = vertexColor[0] EmitVertex();gl_Position = gl_in[1].gl_Position; gsColor = vertexColor[1] EmitVertex(); ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2011-09-25
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多