1.glViewport() 用来设置视口大小
void glViewport(GLint x,GLint y,GLsizei width,GLsizei height);
对于一个OpenGL坐标(xnd,ynd),它变换后的坐标为(Xw,Yw),那么变换公式为
解释一下这个公式的意义:视口变换也就是glViewport()做的工作,它是把OpenGL的标准化设备坐标转换为屏幕空间坐标,而OpenGL的标准化设备坐标是(-1,1),视口变换需要将该坐标变换到glViewport()参数指定的坐标范围内,所以就出现了上面的公式。它就是将经过了MVP矩阵变换后的三维坐标转换为二维空间的屏幕坐标,缺少的“第三维”就是深度信息,会被存储在z-buffer;
2.glViewport()的使用
视口变换通常要出现在调整OpenGL窗口大小的时候,如果改变了窗口大小,但是没有进行视口变换是肯定会出错的,比如你在屏幕中心绘制了一个三角形,如果没有进行视口变换,那么当年改变窗口大小的时候,发现这个三角形没有任何变换。但是如果进行了视口变换,它就会自动根据窗口的大小去调整三角形的位置,三角形永远在窗口的正中心。
这个是通过glfwSetFramebufferSizeCallback()设置对应的回调函数来实现的。
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);
函数原型:glfwSetFramebufferSizeCallback(GLFWwindow* window,GLFWframebuffersizefun),第一个是指定当前窗口,第二个是一个函数指针类型,其定义如下 typedef void(* GLFWframebuffersizefun)(GLFWwindow *,int ,int);
所以我们可以注册一个回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
glViewport(0,0,width,height);
}
这样,当改变窗口的大小以后,也能进行正确的视口变换了。