调整过剩窗口

时间:2010-10-05 20:27:07

标签: opengl resize window 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 个答案:

答案 0 :(得分:2)

我会尝试在重塑功能结束时添加对glutPostRedisplay()的调用。

答案 1 :(得分:1)

在重塑功能结束时,您没有将矩阵模式设置回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();
}

如果没有看到更多代码,很难说显示功能中是否还有其他内容。我希望有所帮助。

答案 2 :(得分:1)

你不能用同一个窗口调用gluOrtho2D两次,它会破坏图形,所以没有任何东西出现。您必须初始化窗口大小并将Ortho设置为屏幕大小(当前显示分辨​​率),然后相对于窗口大小绘制。

答案 3 :(得分:0)

我猜你的代码没有在显示功能中绘制场景中的所有内容,你看,如果没有事件发生,你必须调用显示一次,并且在第一次它有你的绘图。但是当有一个事件说窗口调整大小时,你的问题就会上升!尝试将您的绘图部分放在显示功能中。像这样,

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();
}

如果没有用,请发布完整的代码。

答案 4 :(得分:0)

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

#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();
}