Изменение размера окна перенасыщения - PullRequest
2 голосов
/ 06 октября 2010

Я делаю 2D-рисование в окне перенасыщения, и у меня возникают проблемы с правильным изменением размера окна.

Мои glutDisplayFunc и glutReshapeFunc приведены ниже.Как таковой, рисунок исчезает при изменении размера окна.Если я удаляю glClear () из displayFunc (), новые пиксели не «инициализируются» и возникают проблемы с отсечкой.Как это исправить?

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 голосов
/ 06 октября 2010

Я бы попробовал добавить вызов к glutPostRedisplay() в конце вашей функции изменения формы.

1 голос
/ 17 октября 2011

Вы не можете дважды вызвать gluOrtho2D с одним и тем же окном, это сломает графику и, таким образом, ничего не появится.Вам нужно будет установить размер окна и задать для параметра «Орто» размер экрана (текущее разрешение экрана), а затем нарисовать относительно размера окна.

1 голос
/ 14 октября 2010

Вы не устанавливаете матричный режим обратно в 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();
}

Трудно сказать, есть ли что-то еще в вашей функции отображения, не видя больше кода.Я надеюсь, что это помогает.

0 голосов
/ 28 мая 2017

Это основной шаблон, который я использую ...

#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();
}
0 голосов
/ 11 октября 2010

Полагаю, ваш код не рисует все на сцене в функции отображения. Видите ли, если нет событий, вам когда-либо приходится вызывать отображение один раз, и в первый раз, когда у вас есть рисунок.Но ваша проблема возникает, когда происходит событие, которое говорит, что окно изменено!попробуйте поместить свою часть рисунка в функцию отображения.Например,

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

Пожалуйста, напишите полный код, если это не помогло.

...