首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使openGL的glDrawElements与几何图形着色器一起工作

无法使openGL的glDrawElements与几何图形着色器一起工作
EN

Stack Overflow用户
提问于 2017-11-20 10:27:20
回答 1查看 662关注 0票数 1

我已经附加了着色器,但我找不到任何信息,如何使用glDrawElements与一个微光着色器附加到着色器程序。这个程序可以在屏幕上输出一个没有几何图形着色器的四角体,现在我也在尝试做同样的事情,但是附带了一个几何着色器。

代码语言:javascript
运行
复制
//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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-20 16:13:00

查看Khronos的便利OpenGL wiki站点以获取着色级输入和输出

in限定符声明的全局变量是着色器阶段输入变量。这些变量是在前一阶段给出的值(可能是通过对多个着色器执行输出的值进行插值)。 用out限定符声明的全局变量是着色器级输出变量。这些值被传递到管道的下一阶段(可能通过对多个着色器执行输出的值进行插值)。 几何图形阴影输入被聚合成数组,每个顶点在原语中。数组的长度取决于GS使用的输入基元类型。每个数组索引表示输入基元中的一个顶点。

你有一个顶点着色器,一个几何图形着色器和一个碎片着色器。在这种情况下,顶点着色器是第一个着色阶段,然后是几何着色和最后一个着色阶段是碎片着色。

因此,几何着色器的输入变量必须与顶点着色器的输出变量相匹配。片段着色器的输入变量必须与几何着色器的输出变量相匹配。

进一步注意,可能的输入基元说明符是pointslineslines_adjacencytrianglestriangles_adjacency

另见几何着色器-原语输入/输出规范

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

顶点着色器:

代码语言:javascript
运行
复制
#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);
}

几何着色器:

代码语言:javascript
运行
复制
#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();
}

碎片着色器:

代码语言:javascript
运行
复制
#version 440
in vec3 geo_stage_color;
out vec4 fragment_color;

void main ()
{
    fragment_color = vec4(geo_stage_color, 1.0);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47389842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档