1

为什么我得到一个完整的白色窗口作为这个程序的输出

代码在这里

#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

4

3 回答 3

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();
}
于 2013-11-14T15:55:45.173 回答
1

我怀疑问题出在您对glVertexPointer(). 最后一个参数应该是指向您正在使用的数组的开头的指针,但目前您只是传递一个空指针,所以它没有什么可使用的。

试试这个:

glVertexPointer(3, GL_FLOAT, 0, vertices);

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

于 2013-11-14T15:26:40.870 回答
-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 }; (注意删除的逗号)

接下来是客户端状态的启用和禁用:例如,这可以在主循环中完成,因为启用和禁用的成本很高,并且您的绘图循环会因此受到影响。

于 2013-11-14T15:51:24.790 回答