OpenGL:为什么是这个白色的scrreen

OpenGL: Why this white scrreen

本文关键字:白色 scrreen 为什么 OpenGL      更新时间:2023-10-16

为什么我会得到一个完整的白色窗口作为该程序的输出期望一个盒子

代码在这里

#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

多个问题:

  • 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();
}

我怀疑问题是你对glVertexPointer()的调用。最后一个参数应该是指向您正在使用的数组开头的指针,但目前您只是向它传递一个空指针,因此它没有任何可处理的内容。

试试这个:

glVertexPointer(3, GL_FLOAT, 0, vertices);

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

我突然想到的主要内容是数组: //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 };(注意删除的逗号)

接下来是启用和禁用

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