开发者

Resizing glut window

I'm doing 2D drawing in a glut window, and I'm having trouble making the window resize properly.

My glutDisplayFunc and glutReshapeFunc are below. As it is, the drawing disappears when the window is resized. If I delete the glClear() from displayFunc(), new pixels don't "initialize" and there are clipping problems. How do I fix this?

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, 开发者_JAVA技巧GLdouble (newWidth), 0, GLdouble (newHeight) );

  windowWidth = newWidth;
  windowHeight = newHeight;
}


I'd try adding a call to glutPostRedisplay() around the end of your reshape function.


This is basic template that I use...

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


You can not call gluOrtho2D twice with the same window, it will break the graphics and so nothing shows up. You would have to init window size and set Ortho to the size of the screen (current display resolution), then draw relative to the size of the window.


I guess your code does not draw everything on scene in display func, you see, if no events occcur ever you have to call display one time and in the first time it has your drawing. But your problem rises when there is an event which says the window is resized! try putting your drawing part in display function. Like so,

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

Please post the full code if this was not helpful.


You're not setting the matrix mode back to GL_MODELVIEW at the end of your reshape function.

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

It's hard to say if there's something else in your display function without seeing more code. I hope that helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜