我正在研究opengl c ++并试图制作一个代码来在终端上渲染随机多边形。我正在使用CodeBlocks 13.12。
int width=800;
int height=600;
void RandomPolygons()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
GLint x[100],y[100],n,r,g,b;
GLint i,j;
cout<<"Enter the sides of the polygon to be displayed:"<<endl;
cin>>n;
for(i=1;i<=n;i++)
{
x[i]=rand()%800;
cout<<"x["<<i<<"]= "<<x[i]<<endl;
y[i]=rand()%600;
cout<<"y["<<i<<"]= "<<y[i]<<endl;
}
x[i]=x[1];
cout<<"x["<<i<<"]= "<<x[i]<<endl;
y[i]=y[1];
cout<<"y["<<i<<"]= "<<y[i]<<endl;
r=rand()%2;
g=rand()%2;
b=rand()%2;
glColor3f(r,g,b);
glBegin(GL_POLYGON);
for(j=1;j<=n;j++)
{
glVertex2i(x[j],y[j]);
}
glVertex2i(x[j],y[j]);
glEnd();
glFlush();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowSize(width,height);
glutInitWindowPosition(100,100);
glutCreateWindow("Random_Polygons!!!!");
glClearColor(0,0,0,0);
gluOrtho2D(0,800,0,600);
glutDisplayFunc(RandomPolygons);
glutIdleFunc(RandomPolygons);
glutMainLoop();
}
输出
它只是没有响应(渲染屏幕),另一方面终端工作正常....
答案 0 :(得分:2)
glutKeyboardFunc
阻止,直到用户输入内容为止。由于应用程序被阻止,因此不执行Windows消息循环,窗口停止响应。
当您需要在OpenGL应用程序中输入时,您必须听取glutSpecialFunc
和{{1}}并从那里构建输入。
答案 1 :(得分:0)
我同意@BDL
cin
阻止处理 ...您应该分开顶点生成和多边形渲染。现在,您调用的是没有预定义种子的随机多边形,这将改变每个帧的顶点,使其变得模糊 。更不用说每个帧都需要用户输入键盘
除此之外
您正在创建随机点作为顶点,而这些顶点并不总是会创建OpenGL无法正确处理的凸多边形。为避免出现问题,请使用GL_TRIANGLE_FAN
代替GL_POLYGON
并按角度对顶点进行排序(或生成已排序的顶点),例如:
GLfloat x[100],y[100],a,r;
GLint i,n=5;
randseed(10); // init random generator with some value or do this not inside rendering instead
for (i=0,a=0.0;i<n;a+=rand(6.28/n),i++)
{
r=rand(0.5);
x[i]=r*cos(a);
y[i]=r*sin(a);
}
// render
glBegin(GL_TRIANGLE_FAN);
glVertex2f(0.0,0.0);
for (i=0;i<n;i++) glVertex2f(x[i],y[i]);
glVertex2f(x[0],y[0]);
glEnd();
或扔掉顶点,将多边形转换为凹面一个。