opengl 几何着色器正在复制形状(处理中)

fafcakar  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(130)

我试图用几何着色器生成一个简单的形状,但是这个形状渲染了两次,我不知道为什么。
首先我们有一个非常简单的顶点着色器

#version 150

in vec4 position;
 
void main() {
  gl_Position = position;
}

然后是一个几何着色器,生成一个简单的三角形。

#version 150

layout (triangles) in;
layout (triangle_strip, max_vertices = 5) out;
 
out FragData {
  vec4 color;
} FragOut;
 
void main(){

  //RED TOP LEFT
  FragOut.color = vec4(1.0, 0.0, 0.0, 1.0); 
  gl_Position = gl_in[0].gl_Position + vec4( -1.0, 0.0, 0.0, 0.0);
  EmitVertex();

  //BLUE BOTTOM LEFT
  FragOut.color = vec4(0., 0., 1., 1.);
  gl_Position = gl_in[0].gl_Position + vec4( -1.0, -1.0, 0.0, 0.0);
  EmitVertex();

  //GREEN BOTTOM RIGHT
  FragOut.color = vec4(0.0, 1.0, 0.0, 1.0);
  gl_Position = gl_in[0].gl_Position + vec4( 1.0, -1.0, 0.0, 0.0);
  EmitVertex();

  EndPrimitive();
}

最后是一个简单的片段着色器

#version 150

in FragData {
  vec4 color;
} FragIn;

out vec4 fragColor;

void main() {
  fragColor = FragIn.color;
}

结果应该是一个三角形,但正在渲染两个三角形:
Here's the result

eiee3dmh

eiee3dmh1#

每个图元执行一次Geometry Shader,一个rect()由2个三角形组成,因此几何着色器执行两次,生成2个triangle_strip图元。
绘制单个POINTS图元而不是矩形:

beginShape(POINTS);
vertex(x, y);
endShape();

请注意,您需要更改原语输入规范:
layout (triangles) in;

layout (points) in;

相关问题