C++ OpenGL背面剔除导致奇怪的结果

C++ OpenGL背面剔除导致奇怪的结果,c++,opengl,sdl,culling,C++,Opengl,Sdl,Culling,我正在尝试创建一个简单的单元着色器效果,它包括背面和正面消隐。但到目前为止,我的筛选结果相当奇怪 设置OpenGL源代码: // init matrices glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, 800 / 600, 0.01f, 150); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // enable opengl caps glEnable(GL_N

我正在尝试创建一个简单的单元着色器效果,它包括背面和正面消隐。但到目前为止,我的筛选结果相当奇怪

设置OpenGL源代码:

// init matrices
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 800 / 600, 0.01f, 150);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// enable opengl caps
glEnable(GL_NORMALIZE);
glEnable(GL_CULL_FACE);
// cell shading effects
glLineWidth(3.5f);
// setup display list
pDList = glGenLists(1);
glNewList(pDList, GL_COMPILE);
    glBegin(GL_QUADS);
        // front
        glNormal3f(0, 0, 1);
        glVertex3f(-0.25f, -0.5f, -3);
        glVertex3f(0.25f, -0.5f, -3);
        glVertex3f(0.25f, -1, -3);
        glVertex3f(-0.25f, -1, -3);
        // back
        glNormal3f(0, 0, -1);
        glVertex3f(-0.25f, -0.5f, -3.5f);
        glVertex3f(0.25f, -0.5f, -3.5f);
        glVertex3f(0.25f, -1, -3.5f);
        glVertex3f(-0.25f, -1, -3.5f);
        // top 
        glNormal3f(0, 1, 0);
        glVertex3f(-0.25f, -0.5f, -3.5f);
        glVertex3f(0.25f, -0.5f, -3.5f);
        glVertex3f(0.25f, -0.5f, -3);
        glVertex3f(-0.25f, -0.5f, -3);
        // bottom
        glNormal3f(0, -1, 0);
        glVertex3f(-0.25f, -1, -3.5f);
        glVertex3f(0.25f, -1, -3.5f);
        glVertex3f(0.25f, -1, -3);
        glVertex3f(-0.25f, -1, -3);
        // right
        glNormal3f(1, 0, 0);
        glVertex3f(0.25f, -0.5f, -3);
        glVertex3f(0.25f, -0.5f, -3.5f);
        glVertex3f(0.25f, -1, -3.5f);
        glVertex3f(0.25f, -1, -3);
        // left
        glNormal3f(-1, 0, 0);
        glVertex3f(-0.25f, -0.5f, -3);
        glVertex3f(-0.25f, -0.5f, -3.5f);
        glVertex3f(-0.25f, -1, -3.5f);
        glVertex3f(-0.25f, -1, -3);
    glEnd();
glEndList();
渲染源代码:

// clear
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.75f, 0.75f, 0.75f, 1);
// reset matrix
glLoadIdentity();
// draw cube
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glCullFace(GL_BACK);
glColor3i(0, 0, 0);
glCallList(pDList);
这就是我得到的:

出于某种原因,它只是绘制立方体的右侧。奇怪的 我换了一张脸(glu回来);至正面(正面);在我的渲染函数中。 我明白了:

现在它的每一面都在画?它似乎认为立方体的右侧同时面向后面和前面,而立方体的其余部分则面向后面。当禁用剔除功能时,我也会得到上图所示的相同结果

我能想到的任何其他相关信息是,我正在使用SDL,而且我确信这不是图形卡问题,因为我在两台不同的计算机上运行了这个,每台计算机都产生相同的结果

我刚刚开始学习如何为原语设置法线,所以这很可能是一个n00b的大错误,或者是一些愚蠢的错误。如果每次我犯了一个最不考虑的明显错误,并且坚持了几个小时,我都能得到一分钱,那我就是百万富翁了


那么,简而言之,我做错了什么,以及如何让正确的面边以正确的方式剔除或不剔除?

如果从负法线的向量看每个三角形,可以定义顶点的指定顺序(称为
缠绕
):顺时针或逆时针


您必须与它保持一致,并在
CW
CCW
缠绕中指定所有顶点,以使剔除正确工作。

我的OpenGL初始化代码有点生疏,但您不应该在某个地方定义顶点的顺序(GL_CW,GL_CCW)?不太清楚您的意思,我还在学习OpenGL…显然Sergey K也有同样的想法,但能够以更好的方式展示它:)