几何图形着色器在处理过程中的意外行为 [英] Unexpected behaviour for a Geometry Shader in Processing

查看:29
本文介绍了几何图形着色器在处理过程中的意外行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在处理中使用的是简单几何图形着色器:

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;
}

然后我们有了Geometry Shader,它应该为每个输入顶点返回一个顶点,因此总共返回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;
}

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

推荐答案

绘制形状时,不仅绘制了填充的多边形,还绘制了轮廓(笔划)。通过调用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), "
");
  }

  // 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:
" + pgl.getShaderInfoLog(glGeometry));
      return;
    }
    
    pgl.attachShader(glProgram, glGeometry);
  }
}

这篇关于几何图形着色器在处理过程中的意外行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆