调整glut窗口大小

3

我正在一个glut窗口中进行2D绘图,但是我在调整窗口大小时遇到了困难。

我的glutDisplayFunc和glutReshapeFunc如下所示。目前情况是,当窗口被调整大小时,绘图消失了。如果我从displayFunc()中删除glClear(),新像素不会“初始化”,并且会出现剪切问题。我该如何解决这个问题?

glutDisplayFunc:

void displayFunc() {
  glDisable( GL_DEPTH_TEST );
  glClear( GL_COLOR_BUFFER_BIT );
  glPointSize ( 3.0 );
  glFlush();
}

glutReshapeFunc:

void windowReshapeFunc( GLint newWidth, GLint newHeight ) {
  glViewport( 0, 0, newWidth, newHeight );
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();
  gluOrtho2D( 0, GLdouble (newWidth), 0, GLdouble (newHeight) );

  windowWidth = newWidth;
  windowHeight = newHeight;
}
5个回答

2
我建议在你的reshape函数结束时添加一个调用glutPostRedisplay()的语句。

谢谢您的回复,但那似乎并没有帮助。您能解释一下为什么您会期望它有所帮助吗? - obh
1
在窗口调整大小后,它会导致显示更新。然而,仔细观察后,您在显示函数中实际上唯一的绘图是清除屏幕,因此我不会期望发生其他任何事情。我猜您在其他地方有一些绘图,但这确实不应该是这种情况。 - Jerry Coffin
每次调用reshape时,Diaply都会更新,这不是重点,请发布您的完整代码,以便我们看到而不是猜测。 - Amir Zadeh

2

这是我使用的基本模板...

#include <GL/glut.h>
#include <stdio.h>
#include <stdarg.h>

#define WINDOW_WIDTH  300
#define WINDOW_HEIGHT 300

// current Window width and height
int  win_width, win_height; 

void display()
{
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);

    // write your code here
    //
    //

    glutSwapBuffers();
}

void on_resize(int w, int h)
{
    win_width = w;
    win_height = h;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-w / 2, w / 2, -h / 2, h / 2, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    display(); // refresh window.
}

void main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    glutCreateWindow("basic resize template");

    glutDisplayFunc(display);
    glutReshapeFunc(on_resize);

    glutMainLoop();
}

1

您不能在同一个窗口中两次调用gluOrtho2D,这会破坏图形,并且不会显示任何内容。您需要初始化窗口大小并将Ortho设置为屏幕的尺寸(当前显示分辨率),然后根据窗口的大小进行绘制。


0

我猜你的代码没有在display函数中绘制场景中的所有内容。如果从未发生事件,你必须调用一次display函数,并且第一次它会有你的绘图。但是当有一个事件说窗口被调整大小时,你的问题就出现了!尝试将你的绘图部分放在display函数中。像这样:

void displayFunc() {
  glDisable( GL_DEPTH_TEST );
  glClear( GL_COLOR_BUFFER_BIT );
  glPointSize ( 3.0 );
  glBegin(GL_POINTS);
  {
          //Blah blah blah some points here which you expect to draw
  }
  glEnd();
  glFlush();
}

请在此贴出完整的代码,如果这并没有帮到您。

0
在你的reshape函数结束时,你没有将矩阵模式设置回GL_MODELVIEW。
void reshape(int width, int height) {
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, GLdouble (width), 0, GLdouble (height) );
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

如果没有看到更多的代码,很难说您的显示函数中是否还有其他问题。希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接