OpenGL渲染导致图形故障

OpenGL渲染导致图形故障,opengl,graphics,3d,sfml,immediate-mode,Opengl,Graphics,3d,Sfml,Immediate Mode,代码如下。当程序运行时,它会生成一个大致正确的图像,但存在一些图形故障。以下是一些图片:。你知道是什么导致了这一切吗?最奇怪的是,这个问题似乎是在三角形上形成的,即使图像是用多边形(四边形)绘制的 编辑:因此,将GL_POLYGONS语句更改为GL_QUADS似乎可以解决问题,但我仍然有点好奇为什么。您的第一个glBegin没有匹配的glEnd,这会导致所有其他glBegin被忽略,直到下一个glEnd。这意味着正面泄漏到背面 也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶

代码如下。当程序运行时,它会生成一个大致正确的图像,但存在一些图形故障。以下是一些图片:。你知道是什么导致了这一切吗?最奇怪的是,这个问题似乎是在三角形上形成的,即使图像是用多边形(四边形)绘制的


编辑:因此,将GL_POLYGONS语句更改为GL_QUADS似乎可以解决问题,但我仍然有点好奇为什么。

您的第一个
glBegin
没有匹配的
glEnd
,这会导致所有其他
glBegin
被忽略,直到下一个
glEnd
。这意味着正面泄漏到背面


也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶点数据。

您的第一个
glBegin
没有匹配的
glEnd
,这会导致所有其他
glBegin
被忽略,直到下一个
glEnd
。这意味着正面泄漏到背面


也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶点数据。

您的第一个
glBegin
没有匹配的
glEnd
,这会导致所有其他
glBegin
被忽略,直到下一个
glEnd
。这意味着正面泄漏到背面


也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶点数据。

您的第一个
glBegin
没有匹配的
glEnd
,这会导致所有其他
glBegin
被忽略,直到下一个
glEnd
。这意味着正面泄漏到背面


也就是说,立即模式和相关的显示列表已被弃用,相反,请查看VBO以存储顶点数据。

为什么您的
多色侧面板的
glBegin()
没有相应的
glEnd()
?这不是可选的。@genpfault它们都有,除了第一个。为什么您的
多色侧前
glBegin()
没有相应的
glEnd()
?这不是可选的。@genpfault它们都有,除了第一个。为什么您的
多色侧前
glBegin()
没有相应的
glEnd()
?这不是可选的。@genpfault它们都有,除了第一个。为什么您的
多色侧前
glBegin()
没有相应的
glEnd()
?这不是可选的。@genpfault他们有,除了第一个。
void buildList() {
    cubelist = glGenLists(1);
    glNewList(cubelist,GL_COMPILE);

    // Multi-colored side - FRONT
    glBegin(GL_POLYGON);
    glColor3b(0,0,0);
    glVertex3f( -0.5, -0.5, -0.5);
    glVertex3f( -0.5,  0.5, -0.5);
    glVertex3f(  0.5,  0.5, -0.5);
    glVertex3f(  0.5, -0.5, -0.5);
    // Black side - BACK
    glBegin(GL_POLYGON);
    glColor3b(0,0,0);
    glVertex3f(  0.5, -0.5, 0.5 );
    glVertex3f(  0.5,  0.5, 0.5 );
    glVertex3f( -0.5,  0.5, 0.5 );
    glVertex3f( -0.5, -0.5, 0.5 );
    glEnd();

    // Purple side - RIGHT
    glBegin(GL_POLYGON);
    glColor3f(  1.0,  0.0,  1.0 );
    glVertex3f( 0.5, -0.5, -0.5 );
    glVertex3f( 0.5,  0.5, -0.5 );
    glVertex3f( 0.5,  0.5,  0.5 );
    glVertex3f( 0.5, -0.5,  0.5 );
    glEnd();

    // Green side - LEFT
    glBegin(GL_POLYGON);
    glColor3f(   0.0,  1.0,  0.0 );
    glVertex3f( -0.5, -0.5,  0.5 );
    glVertex3f( -0.5,  0.5,  0.5 );
    glVertex3f( -0.5,  0.5, -0.5 );
    glVertex3f( -0.5, -0.5, -0.5 );
    glEnd();

    // Blue side - TOP
    glBegin(GL_POLYGON);
    glColor3f(   0.0,  0.0,  1.0 );
    glVertex3f(  0.5,  0.5,  0.5 );
    glVertex3f(  0.5,  0.5, -0.5 );
    glVertex3f( -0.5,  0.5, -0.5 );
    glVertex3f( -0.5,  0.5,  0.5 );
    glEnd();

    // Red side - BOTTOM
    glBegin(GL_POLYGON);
    glColor3f(   1.0,  0.0,  0.0 );
    glVertex3f(  0.5, -0.5, -0.5 );
    glVertex3f(  0.5, -0.5,  0.5 );
    glVertex3f( -0.5, -0.5,  0.5 );
    glVertex3f( -0.5, -0.5, -0.5 );
    glEnd();
    glEndList();
}

void setupGL() {
    glClearColor(1, 1, 1, 0);
    glEnable(GL_DEPTH_CLAMP);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glCullFace(GL_FRONT_AND_BACK);
}

int main(int, char const**)
{
    sf::Window window(sf::VideoMode(1600, 1200), "OpenGL", sf::Style::Default, sf::ContextSettings(32));
    window.setVerticalSyncEnabled(true);
    //initWorld();
    setupGL();
    buildList();

    while (running)
    {

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Process events
        sf::Event event;
        handleInput(window);
        while (window.pollEvent(event))
        {
            // Close window: exit
            if (event.type == sf::Event::Closed) {
                running = false;
            }

            // Escape pressed: exit
            if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
                running = false;
            }
        }

        glCallList(cubelist);

        // Update the window (c is a "Camera" object that just sets the perspective.   I can provide code if necessary)
        c.draw();
        window.display();
    }

    return EXIT_SUCCESS;
}