无法让 openGL 的 glDrawElements 与几何着色器一起使用

Posted

技术标签:

【中文标题】无法让 openGL 的 glDrawElements 与几何着色器一起使用【英文标题】:Can't get openGL's glDrawElements to work with geometry shader 【发布时间】:2017-11-20 10:27:20 【问题描述】:

我已经附加了着色器,但我找不到任何关于如何使用 glDrawElements 和附加到着色器程序的 goemetry 着色器的信息。 该程序将在没有几何着色器的情况下在屏幕上输出一个四边形,现在我正在尝试做同样的事情,但附加了一个几何着色器。

//In my .cpp file
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);


// Vertex shader
#version 440
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;

uniform mat4 world_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;

out vec3 color;

void main() 
    color = vertex_color;

    gl_Position = projection_matrix*view_matrix* world_matrix * 
    vec4(vertex_position, 1.0);



// Geometry shader
#version 440 core
layout (triangle_strip) in;
layout (triangle_strip, max_vertices = 6) out;
layout(location = 1) in vec3 vertex_color;

out vec3 color;

 void main()

  for(int i = 0; i < gl_in.length(); i++)
  
     // copy attributes
    gl_Position = gl_in[i].gl_Position;

    color=vertex_color;
    // done with the vertex
    EmitVertex();
  
  EndPrimitive();



//Fragment shader
#version 440
in vec3 color;
out vec4 fragment_color;

void main () 
    fragment_color = vec4 (color, 1.0);

【问题讨论】:

顶点着色器输出与几何着色器输入不匹配。 VS-output:颜色,但几何着色器中没有颜色输入。但是有一个输入 vertex_color 不是由顶点着色器设置的。 【参考方案1】:

请参阅 Khronos Group 的便捷 OpenGL wiki 站点以获取 Shader stage inputs and outputs:

使用in 限定符声明的全局变量是着色器阶段输入变量。这些变量由前一阶段给定值(可能通过对多个着色器执行输出的值进行插值)。

使用out 限定符声明的全局变量是着色器阶段输出变量。这些值被传递到管道的下一个阶段(可能通过对多个着色器执行输出的值进行插值)。

几何着色器输入聚合成数组,图元中每个顶点一个。数组的长度取决于 GS 使用的输入原语类型。每个数组索引代表输入图元中的一个顶点。

你有一个顶点着色器、一个几何着色器和一个片段着色器。在这种情况下,顶点着色器是第一个着色器阶段,然后是几何着色器,最后一个着色器阶段是片段着色器。 所以几何着色器的输入变量必须匹配到顶点着色器的输出变量。片段着色器的输入变量必须匹配到几何着色器的输出变量。

进一步注意,可能的输入原语说明符是pointslineslines_adjacencytrianglestriangles_adjacency。 另见Geometry Shader - Primitive in/out specification。

这意味着您的代码必须看起来像这样:

顶点着色器:

#version 440
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;

uniform mat4 world_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;

out vec3 vert_stage_color;

void main()

    vert_out_color = vertex_color;

    gl_Position = projection_matrix*view_matrix* world_matrix * vec4(vertex_position, 1.0);

几何着色器:

#version 440 core
layout (triangles) in;
layout (triangle_strip, max_vertices = 6) out;
layout(location = 1) in vec3 vertex_color;

in  vec3 vert_stage_color[];
out vec3 geo_stage_color;

void main()

    for(int i = 0; i < gl_in.length(); i++)
    
        // copy attributes
        gl_Position = gl_in[i].gl_Position;

        geo_stage_color = vert_stage_color[i];
        // done with the vertex
        EmitVertex();
    
    EndPrimitive();

片段着色器:

#version 440
in vec3 geo_stage_color;
out vec4 fragment_color;

void main ()

    fragment_color = vec4(geo_stage_color, 1.0);

【讨论】:

感谢 Rabbid,我刚刚通过修复 in 和 out 变量解决了这个问题

以上是关于无法让 openGL 的 glDrawElements 与几何着色器一起使用的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 让相机移动

无法让 openGL 的 glDrawElements 与几何着色器一起使用

无法让 Stencil Buffer 在 iOS 4+ 中工作(5.0 工作正常)。 [OpenGL ES 2.0]

opengl 纹理无法正确渲染

无法使用 OpenGL 显示纹理

如何让 GHCi 加载 Opengl 包?