OpenGL Geometry Shader 渲染三角形而不是从点开始的正方形

OpenGL Geometry Shader rendering triangle instead of square from a point

提问人:BackSpace7777777 提问时间:2/12/2023 最后编辑:Rabbid76BackSpace7777777 更新时间:2/12/2023 访问量:46

问:

我正在尝试从单个点渲染一个正方形,这是我的几何着色器代码:

#version 330 core
layout (points) in;
layout(triangle_strip, max_vertices=4) out;

void main(){
    vec4 pos=gl_in[0].gl_Position;
    gl_Position=pos+vec4(1,1,0,0);
    EmitVertex();
    gl_Position=pos+vec4(1,-1,0,0);
    EmitVertex();
    gl_Position=pos+vec4(-1,-1,0,0);
    EmitVertex();
    gl_Position=pos+vec4(-1,1,0,0);
    EmitVertex();
    EndPrimitive();
}

顶点着色器如下所示:

#version 330 core
layout (location=0) in vec3 position;

uniform mat4 view;
uniform mat4 projection;
uniform mat4 model;

void main(){
    gl_Position=projection*view*model*vec4(position,1.0);
}

它只呈现一个三角形,我不确定为什么它只呈现一个三角形。

opengl glsl opengl-3

评论

0赞 BackSpace7777777 2/12/2023
当我这样做时,什么都没有显示,我确实启用了面部剔除

答:

1赞 Rabbid76 2/12/2023 #1

顶点定义三角形条带。每组 3 个相邻顶点形成一个三角形,缠绕顺序由第一个三角形的缠绕定义(连续三角形的顺序相反)。启用人脸剔除时,您需要关心缠绕顺序。正面的默认缠绕顺序是逆时针方向。因此,您必须交换第 1 个和第 2 个顶点:

void main(){
    vec4 pos=gl_in[0].gl_Position;
    gl_Position=pos+vec4( 1, -1, 0, 0);
    EmitVertex();
    gl_Position=pos+vec4( 1,  1, 0, 0);
    EmitVertex();
    gl_Position=pos+vec4(-1, -1, 0, 0);
    EmitVertex();
    gl_Position=pos+vec4(-1,  1, 0, 0);
    EmitVertex();
    EndPrimitive();
}