gpt4 book ai didi

opengl - 处理中几何着色器的意外行为

转载 作者:行者123 更新时间:2023-12-04 13:54:06 24 4
gpt4 key购买 nike

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

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;
}
结果应该是一个三角形,每个顶点都有不同的颜色。但结果是四个三角形,我不知道为什么。
Here's the result

最佳答案

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

关于opengl - 处理中几何着色器的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65790886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com