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

问题描述

我正在尝试使用几何着色器生成一个简单的形状,但该形状渲染了两次,我不知道为什么。

首先我们有一个非常简单的顶点着色器

#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,1.0); 
  gl_Position = gl_in[0].gl_Position + vec4( -1.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);
  EmitVertex();

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

  EndPrimitive();
}

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

#version 150

in FragData {
  vec4 color;
} FragIn;

out vec4 fragColor;

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

结果应该是一个三角形,但正在渲染两个三角形:

Here's the result

解决方法

Geometry Shader 对每个原语执行一次。 rect() 由 2 个三角形组成,因此几何着色器执行两次并生成 2 个 triangle_strip 图元。

绘制单个 POINTS 基元而不是矩形:

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

请注意,您需要更改 Primitive input specification

layout (triangles) in;

layout (points) in;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...