【问题标题】:The Geometry Shader is duplicating Shapes (in Processing) [duplicate]几何着色器正在复制形状(正在处理中)[重复]
【发布时间】:2021-01-12 18:18:00
【问题描述】:

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

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

#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

【问题讨论】:

  • 几何着色器对每个图元执行一次。你画了多少个图元? 2?
  • 老实说,我不确定。我在处理矩形上使用着色器。这是完整代码:github.com/PauRosello97/Formorgel-Shaders。谢谢。
  • rect(0, 0, width, height); 这是画一个矩形吗?如果是这样,您正在绘制两个三角形。并且您使用第一个顶点位置计算所有坐标。所以一切正常。

标签: opengl glsl processing geometry-shader


【解决方案1】:

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

绘制一个POINTS 原语而不是矩形:

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

注意,需要更改Primitive input specification

layout (triangles) in;

layout (points) in;

【讨论】:

  • 感谢您的回答。我确定是这样,但是当我更改原始输入规范时出现错误: OpenGL error 1282 at bot endDraw(): invalid operation
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2013-02-20
  • 2015-03-23
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多