我在过剩窗口中进行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;
}
答案 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();
}