错误的面孔被剔除

时间:2014-04-19 09:29:50

标签: opengl glsl

我编写了一个绘制以下多维数据集的代码: cube with culled faces

如图所示,每一方都剔除了错误的面孔,即外面。

我需要更改哪些面朝另一个方向?

整个立方体由以下(几何)着色器生成:

#version 330 core

layout(points) in;
layout(triangle_strip, max_vertices=24) out;

out vec2 tex_coord;

uniform mat4x4 model;
uniform mat4x4 view;
uniform mat4x4 projection;

uniform float size = 1.0;

const vec2 texc[4] = vec2[](vec2(0, 0),
                            vec2(1, 0),
                            vec2(0, 1),
                            vec2(1, 1));

void main() {
    float asize = size / 2;
    vec4 offset[24] = vec4[] (
                            vec4(-asize,  asize, -asize, 0.0), //t
                            vec4( asize,  asize, -asize, 0.0),
                            vec4(-asize,  asize,  asize, 0.0),
                            vec4( asize,  asize,  asize, 0.0),

                            vec4(-asize, -asize,  asize, 0.0), //d
                            vec4( asize, -asize,  asize, 0.0),
                            vec4(-asize, -asize, -asize, 0.0),
                            vec4( asize, -asize, -asize, 0.0),

                            vec4(-asize,  asize, -asize, 0.0), //l
                            vec4(-asize,  asize,  asize, 0.0),
                            vec4(-asize, -asize, -asize, 0.0),
                            vec4(-asize, -asize,  asize, 0.0),

                            vec4( asize,  asize,  asize, 0.0), //r
                            vec4( asize,  asize, -asize, 0.0),
                            vec4( asize, -asize,  asize, 0.0),
                            vec4( asize, -asize, -asize, 0.0),

                            vec4(-asize,  asize,  asize, 0.0), //f
                            vec4( asize,  asize,  asize, 0.0),
                            vec4(-asize, -asize,  asize, 0.0),
                            vec4( asize, -asize,  asize, 0.0),

                            vec4( asize,  asize, -asize, 0.0), //b
                            vec4(-asize,  asize, -asize, 0.0),
                            vec4( asize, -asize, -asize, 0.0),
                            vec4(-asize, -asize, -asize, 0.0));

    int i, j, k;
    for(i = 0; i < gl_in.length(); ++i) {
        for(k = 0; k < offset.length() / 4; ++k) {
            gl_PrimitiveID = k;
            for(j = 0; j < 4; ++j) {
                mat4x4 base;
                gl_Position = projection * view * model * (gl_in[i].gl_Position + offset[j + k*4]);
                tex_coord = texc[j];
                EmitVertex();
            }
            EndPrimitive();
        }
    }
}

这是统一的矩阵:

glm::mat4x4 model;
glm::mat4x4 view = glm::lookAt(glm::vec3(1.1f, 1.3f, 1.2f),
                            glm::vec3(0.0f, 0.0f, 0.0f),
                            glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4x4 projection = glm::perspective(80.0f, (float)dw/(float)dh, 0.01f, 100.0f);

1 个答案:

答案 0 :(得分:2)

您只是输出错误的缠绕顺序的三角形,即顺时针而不是逆时针。默认情况下,面部被视为&#34;正面朝向&#34;如果它的顶点有逆时针绕组; glFrontFace可用于控制此情况(通过GL_CCW进行逆时针绕线,GL_CW进行顺时针绕线。

帮自己一个忙,修复多维数据集的数据。 :)