我已经附加了着色器,但我无法找到有关如何使用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);
}
答案 0 :(得分:1)
请参阅Khronos Group的方便的OpenGL wiki网站Shader stage inputs and outputs:
使用
in
限定符声明的全局变量是着色器阶段输入变量。这些变量由前一阶段给出值(可能通过插值从多个着色器执行输出的值)。使用
out
限定符声明的全局变量是着色器阶段输出变量。这些值将传递到管道的下一个阶段(可能通过插入多个着色器执行的值输出)。几何着色器输入聚合到数组中,基元中每个顶点一个。数组的长度取决于GS使用的输入基元类型。每个数组索引表示输入原语中的单个顶点。
您有一个顶点着色器,一个几何着色器和一个片段着色器。在这种情况下,顶点着色器是第一个着色器阶段,后面是几何着色器,最后一个着色器阶段是片段着色器。
因此,几何着色器的输入变量必须匹配到顶点着色器的输出变量。片段着色器的输入变量必须匹配到几何着色器的输出变量。
进一步注意,可能的输入原语说明符是points
,lines
,lines_adjacency
,triangles
和triangles_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);
}