我知道glutReshapeFunc
可用于调整窗口大小,因此我用它来重置投影矩阵并渲染形状以匹配窗口。代码如下:
#include <GLUT/glut.h>
GLsizei wndWidth = 400;
GLsizei wndHeight = 300;
void init() {
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 400, 0, 300);
}
void drawSegment() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0, 0, 1.0);
glBegin(GL_LINE_LOOP);
glVertex2i(10, 10);
glVertex2i(wndWidth-10, wndHeight-10);
glVertex2i(wndWidth-10, 10);
glEnd();
glFlush();
}
void reshapeFunc(int width, int height) {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, GLdouble(width), 0, GLdouble(height));
glClear(GL_COLOR_BUFFER_BIT);
wndWidth = width;
wndHeight = height;
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400, 300);
glutInitWindowPosition(0, 0);
glutCreateWindow("Draw Window");
init();
glutDisplayFunc(drawSegment);
glutReshapeFunc(reshapeFunc);
glutMainLoop();
}
我认为,在调整窗口大小之后,三角形应始终占据窗口的一半。但是实际上,三角形在窗口调整大小后仍保持其大小,好像wndWidth
和wndHeight
在drawSegment
中没有变化。
那么,为什么我得到错误的结果以及如何解决呢?
答案 0 :(得分:1)
投影矩阵将视图坐标转换为剪辑坐标,并将剪辑坐标转换为规范化的设备坐标(在正交投影中,剪辑坐标和规范化的设备坐标相等)。
glViewport
指定如何将规范化的设备坐标映射到窗口坐标。
更改窗口大小后,您必须重新指定映射:
void reshapeFunc(int width, int height) {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, GLdouble(width), 0, GLdouble(height));
wndWidth = width;
wndHeight = height;
}