2017-03-06 61 views
1

我尝试编写一个简单的过量程序,但在调整窗口大小时发现显示错误(如图所示)。我用kde使用Arch Linux。 我该如何解决它?在Linux中使用过量格式调整窗口大小时显示错误

调整大小前:

enter image description here

调整大小后:

enter image description here

#include <GL/glut.h> 
#include <stdio.h> 
#include <stdlib.h> 
void myinit(void) 
{ 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glColor3f(1.0, 0.0, 0.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500.0, 0.0, 500.0); 
    glMatrixMode(GL_MODELVIEW); 
} 
void display(void) 
{ 
    typedef GLfloat point2[2]; 
    point2 vertices[3]={{0.0,0.0},{250.0,500.0},{500.0,0.0}}; 
    int i, j, k; 
    int rand(); 
    point2 p ={75.0,50.0}; 
    glClear(GL_COLOR_BUFFER_BIT); 
    for(k=0; k<5000; k++) 
    { 
    j=rand()%3; 
    p[0] = (p[0]+vertices[j][0])/2.0; 
    p[1] = (p[1]+vertices[j][1])/2.0; 
    glBegin(GL_POINTS); 
      glVertex2fv(p); 
    glEnd(); 
    } 
    glFlush(); 
    printf ("display invokved....\n"); 
} 
void main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Sierpinski Gasket"); 
    glutDisplayFunc(display); 
    myinit(); 
    glutMainLoop(); 
} 
+0

试在绘制每一帧之前调用带有当前窗口宽度和高度的'glViewport()'作为参数。 – Bartvbl

回答

0

切换到双缓冲(GLUT_DOUBLE & glutSwapBuffers())修复它在我的系统:

#include <GL/glut.h> 
#include <stdio.h> 
#include <stdlib.h> 
void display(void) 
{ 
    typedef GLfloat point2[2]; 
    point2 vertices[3]={{0.0,0.0},{250.0,500.0},{500.0,0.0}}; 
    int i, j, k; 
    int rand(); 
    point2 p ={75.0,50.0}; 

    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500.0, 0.0, 500.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBegin(GL_POINTS); 
    glColor3f(1.0, 0.0, 0.0); 
    for(k=0; k<5000; k++) 
    { 
    j=rand()%3; 
    p[0] = (p[0]+vertices[j][0])/2.0; 
    p[1] = (p[1]+vertices[j][1])/2.0; 
    glVertex2fv(p); 
    } 
    glEnd(); 
    glutSwapBuffers(); 
} 
int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Sierpinski Gasket"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+0

谢谢,它的作品! 我可以问为什么它会使用GLUT_SINGLE有问题吗? –

+0

@haokunli:可悲的是我没有很好的解释为什么'GLUT_SINGLE'不能正常工作:(我* *能够在我的运行MATE的Linux机器上重现时髦的不调整行为,无论是否使用桌面组合已启用 – genpfault

+0

我明白了,非常感谢! –

0

您需要捕获resize事件。在供应过剩中,您必须使用功能glutReshapeFunc注册回叫。在此功能中,您可以更改投影参数和视口。

下面是程序中的一个小的变化,展示了如何做到这一点:

(...) 
void reshape(int width, int height) 
{ 
    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, width, 0.0, height); 
    glMatrixMode(GL_MODELVIEW); 
} 
(...) 
int main(int argc, char** argv) 
{ 
(...) 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); /* <--- */ 
    myinit(); 
(...) 
} 
+0

对不起,它不起作用。无法正确显示的区域仍然无法显示。但是,由于您展开了屏幕坐标,所以在调整窗口大小时点不会改变位置。还是谢谢。 –