【问题标题】:Unexpected behaviour for a Geometry Shader in Processing几何着色器在处理中的意外行为
【发布时间】:2021-01-19 11:45:48
【问题描述】:

我在处理中使用了一个简单的几何着色器:

shader(shader);
  
beginShape();
   vertex(0.1, 0.1);
   vertex(0.0, 0.0);
   vertex(0.001, 0.02);
endShape();

所以我在三角形上应用着色器。

我们首先有一个什么都不做的简单顶点着色器。

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

然后我们有几何着色器,它应该为每个输入顶点返回一个顶点,所以总共 3 个顶点。

#version 150

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

  for(int i=0; i<gl_in.length(); i++){
    if(i%3==0){
      FragOut.color = vec4(1., 0., 0., 1.);
    }else if(i%3==1){
      FragOut.color = vec4(0., 1., 0., 1.);
    }else if(i%3==2){
      FragOut.color = vec4(0., 0., 1., 1.);
    }
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }
  
  EndPrimitive();
}

最后我们有了一个什么都不做的简单片段着色器:

#version 150

in FragData {
  vec4 color;
} FragIn;

out vec4 fragColor;

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

结果应该是一个三角形,每个顶点都有不同的颜色。但结果是四个三角形,我不知道为什么。

【问题讨论】:

  • 结果不同,也是错误的。类似于我已经上传的图片,但还有两个三角形。这是回购:github.com/PauRosello97/Formorgel-Shaders
  • 不,我刚改成 OpenFrameworks 就可以了
  • 无论如何,我已经回答了这个问题。您所要做的就是在绘制几何图形之前调用noStroke();

标签: opengl glsl processing geometry-shader


【解决方案1】:

绘制形状时,不仅绘制填充的多边形,还绘制轮廓(stroke)。通过调用noStroke() 禁用绘制轮廓。

完整示例:

PShader shader;

void settings() {
    size(300, 300, P2D);
}

void setup() {
    shader = new GeometryShader(this, "Vertex.glsl", "Geometry.glsl", "Fragment.glsl");
}

void draw() {
    background(128);  
    
    noStroke();     // <-- this is important
    shader(shader);
    
    beginShape();
        vertex(-0.5, -0.5);
        vertex( 0.5, -0.5);
        vertex( 0.5,  0.5);
    endShape();
}

void keyPressed(){
    saveFrame();
}

为了完整起见类GeometryShader

import com.jogamp.opengl.GL3;

class GeometryShader extends PShader {
  int glGeometry;
  String geometrySource;

  GeometryShader(PApplet parent, String vertFilename, String geoFilename, String fragFilename) {
    super(parent, vertFilename, fragFilename);
    geometrySource = PApplet.join(parent.loadStrings(geoFilename), "\n");
  }

  // Setup the geometry shader (fragment and vertex shaders are automatically handled in 
  // by the PShader superclass).
  void setup() {
    glGeometry = pgl.createShader(GL3.GL_GEOMETRY_SHADER);
    pgl.shaderSource(glGeometry, geometrySource);
    pgl.compileShader(glGeometry);

    pgl.getShaderiv(glGeometry, PGL.COMPILE_STATUS, intBuffer);
    boolean compiled = intBuffer.get(0) == 0 ? false : true;
    if (!compiled) {
      println("Cannot compile geometry shader:\n" + pgl.getShaderInfoLog(glGeometry));
      return;
    }
    
    pgl.attachShader(glProgram, glGeometry);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多