OpenGL:为什么这个白屏

时间:2013-11-14 15:19:16

标签: c++ opengl

为什么我会将一个完整的白色窗口作为此程序的输出 期待一个方框

代码在这里

#include<Gl/glut.h>

static GLfloat vertices[] = {0.0, 0.0, 0.0,
                          0.5, 0.0, 0.0,
                          0.5, 0.5, 0.0,
                          0.0, 0.5, 0.0,
                          };

void reshape(int w, int h)
{
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 0.0);
}

void Draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,1.0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    glBegin(GL_LINES);
        glArrayElement(0);
        glArrayElement(1);
        glArrayElement(2);
        glArrayElement(3);
    glEnd();
    glDisableClientState(GL_VERTEX_ARRAY);
    glFlush();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(400,400);
    glutInitWindowPosition(100,100);
    glutCreateWindow("vectors");

    glClearColor(0.0,0.0,0.0,0.0);

    glutReshapeFunc(reshape);
    glutDisplayFunc(Draw);
    glutMainLoop();
}

将GL_LINES更正为GL_QUADS

3 个答案:

答案 0 :(得分:2)

多个问题:

  • reshape()坏了; glOrtho()乘以当前矩阵,如果您多次调整窗口大小,将会给出无意义的结果。
  • 您请求双缓冲(GLUT_DOUBLE)上下文但无法交换缓冲区。 glFlush()不足。请改为glutSwapBuffers()
  • 你真的应该每帧重置你的投影/模型视图矩阵。有助于防止错误。

试一试:

#include<Gl/glut.h>

static GLfloat vertices[] = 
{
    0.0, 0.0,
    0.5, 0.0,
    0.5, 0.5,
    0.0, 0.5,
};

void Draw()
{
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( -2, 2, -2, 2, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3f(1.0,1.0,1.0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer( 2, GL_FLOAT, 0, vertices );

    glBegin(GL_QUADS);
        glArrayElement(0);
        glArrayElement(1);
        glArrayElement(2);
        glArrayElement(3);
    glEnd();

    glDisableClientState(GL_VERTEX_ARRAY);

    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(400,400);
    glutInitWindowPosition(100,100);
    glutCreateWindow("vectors");

    glutDisplayFunc(Draw);
    glutMainLoop();
}

答案 1 :(得分:1)

我怀疑问题是你对glVertexPointer()的号召。最后一个参数应该是一个指向你正在使用的数组的开头的指针,但是目前你只是传递一个空指针,所以没有任何东西可以使用。

请改为尝试:

glVertexPointer(3, GL_FLOAT, 0, vertices);

编辑:顺便说一下,你的代码不会给你一个盒子。如果它有效,我认为它只会给你两行。尝试使用GL_QUADS而不是GL_LINES。

答案 2 :(得分:-1)

突然出现的主要问题是数组: //static GLfloat vertices[] = {0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.5, 0.0, };

应该是

static GLfloat vertices[] = {0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.5, 0.0 }; (注意删除的逗号)

接下来就是启用和禁用客户端状态:这可以在主循环中完成,例如,因为启用和禁用它会很昂贵,并且你的绘制循环会受到影响。