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();工作