C++ OpenGL:为什么是白色的屏幕

C++ OpenGL:为什么是白色的屏幕,c++,opengl,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,

为什么我得到一个全白色的窗口作为这个程序的输出 我想要一个盒子

代码在这里

#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();
}
#包括
静态GLfloat顶点[]={0.0,0.0,0.0,
0.5, 0.0, 0.0,
0.5, 0.5, 0.0,
0.0, 0.5, 0.0,
};
空洞重塑(整数w,整数h)
{
格洛托(0.0,1.0,0.0,1.0,-1.0,0.0);
}
作废提款()
{
glClear(GLU颜色缓冲位);
GL3F(1.0,1.0,1.0);
glEnableClientState(GL_顶点_数组);
glvertexofinter(3,GL_FLOAT,0,0);
glBegin(GL_行);
glArrayElement(0);
glarrayelment(1);
glarrayelment(2);
玻璃化(3);
格伦德();
glDisableClientState(GL_顶点_数组);
glFlush();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(400400);
位置(100100);
创建窗口(“向量”);
glClearColor(0.0,0.0,0.0,0.0);
GLUTREFORUNC(重塑);
glutDisplayFunc(Draw);
glutMainLoop();
}

将GL_行更正为GL_四元组

我怀疑问题在于您调用了
glvertexpinter()
。最后一个参数应该是指向正在使用的数组开头的指针,但此时您只是给它传递了一个空指针,因此它没有什么可处理的

请尝试以下方法:

glVertexPointer(3, GL_FLOAT, 0, vertices);

编辑:顺便说一下,你的代码不会给你一个框。如果行得通,我想它只会给你两行。尝试使用GL_四边形而不是GL_线。

我突然想到的主要问题是数组:
//静态GLfloat顶点[]={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顶点[]={0.0,0.0,0.0,0.5,0.0,0.0,0.5,0.5,0.0,0.0,0.5,0.0}
(注意删除的逗号)

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

多个问题:

  • 重塑()
    已损坏
    glOrtho()
    乘以当前矩阵,如果多次调整窗口大小,将产生无意义的结果
  • 您请求双缓冲(
    GLUT\u 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();
    }
    
    #包括
    静态GLfloat顶点[]=
    {
    0.0, 0.0,
    0.5, 0.0,
    0.5, 0.5,
    0.0, 0.5,
    };
    作废提款()
    {
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GLU颜色缓冲位);
    glMatrixMode(GL_投影);
    glLoadIdentity();
    格洛托(-2,2,-2,2,-1,1);
    glMatrixMode(GLU模型视图);
    glLoadIdentity();
    GL3F(1.0,1.0,1.0);
    glEnableClientState(GL_顶点_数组);
    glVertexPointer(2,GLU浮点,0,顶点);
    glBegin(GL_QUADS);
    glArrayElement(0);
    glarrayelment(1);
    glarrayelment(2);
    玻璃化(3);
    格伦德();
    glDisableClientState(GL_顶点_数组);
    glutSwapBuffers();
    }
    int main(int argc,字符**argv)
    {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(400400);
    位置(100100);
    创建窗口(“向量”);
    glutDisplayFunc(Draw);
    glutMainLoop();
    }
    
    你从不使用
    顶点
    做任何事情。我没有得到你的moibdnilo。我也改变了名字,如果你的意思是,做了所有的改变,结果都是一样的,genpfaultI不知道有多少过剩为你,但我怀疑你错过了其他几个重要的操作。对于普通的OpenGL程序,您需要在
    Draw()
    的末尾调用
    glSwapBuffers()
    。我还认为您应该在
    重塑()函数中调用
    glViewport()
    。此外,在调用
    glOrtho()
    之前,通常需要将矩阵模式设置为
    GL\u PROJECTION
    (之后显然要将其切换回
    GL\u MODELVIEW
    )。但是,过量可能会对你产生一些影响,所以我不确定。你在这里指出的第一件事就是,它们不会产生任何影响。其次,是的,它需要很多时间来加载windw,但它可以。我更关心的是输出。我今晚会在我的开发机器上试用这段代码,然后再联系你:)我想学习glArrayElement()函数,这就是为什么要编写这段代码。@SiddharthTaunk:Edited。这是glFlush();造成了这个问题,把它改成了glutSwapBuffers();工作