C 在Linux中使用glut调整窗口大小时显示错误

C 在Linux中使用glut调整窗口大小时显示错误,c,opengl,glut,C,Opengl,Glut,我试图编写一个简单的glut程序,但在调整窗口大小时发现显示错误(如图所示)。我在kde中使用ArchLinux。 我怎样才能修好它 调整大小之前: 调整大小后: #包括 #包括 #包括 void myinit(void) { glClearColor(1.0,1.0,1.0,1.0); GL3F(1.0,0.0,0.0); glMatrixMode(GL_投影); glLoadIdentity(); gluOrtho2D(0.0500.0,0.0500.0); glMatrixMode(G

我试图编写一个简单的glut程序,但在调整窗口大小时发现显示错误(如图所示)。我在kde中使用ArchLinux。 我怎样才能修好它

调整大小之前:

调整大小后:

#包括
#包括
#包括
void myinit(void)
{
glClearColor(1.0,1.0,1.0,1.0);
GL3F(1.0,0.0,0.0);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0500.0,0.0500.0);
glMatrixMode(GLU模型视图);
}
作废显示(作废)
{
typedef GLfloat point2[2];
点2顶点[3]={0.0,0.0},{250.0500.0},{500.0,0.0};
int i,j,k;
int rand();
点2 p={75.0,50.0};
glClear(GLU颜色缓冲位);

对于(k=0;k您需要捕获调整大小事件。在glut中,您必须使用函数注册回调。在此函数中,您可以更改投影参数和视口

以下是您的程序中的一个小改动,显示了如何做到这一点:

(...)
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();
(...)
}
(…)
空洞重塑(整型宽度、整型高度)
{
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,宽度,0.0,高度);
glMatrixMode(GLU模型视图);
}
(...)
int main(int argc,字符**argv)
{
(...)
glutDisplayFunc(显示器);

GLUTRESUPEFUNC(重塑);/*切换到双缓冲(
GLUT\u 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;
}
#包括
#包括
#包括
作废显示(作废)
{
typedef GLfloat point2[2];
点2顶点[3]={0.0,0.0},{250.0500.0},{500.0,0.0};
int i,j,k;
int rand();
点2 p={75.0,50.0};
glClearColor(1.0,1.0,1.0,1.0);
glClear(GLU颜色缓冲位);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0500.0,0.0500.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glBegin(总分);
GL3F(1.0,0.0,0.0);

对于(k=0;ktry调用
glViewport()(我能够在我的Linux机器运行伙伴上重现时髦的不调整大小行为,无论是否启用桌面合成。我明白了。非常感谢!抱歉,它不起作用。无法正确显示的区域仍然无法显示。但是,由于您展开了屏幕坐标,因此在调整窗口大小时,点不会改变位置。仍然谢谢。
#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;
}