OpenGL glViewport()函数

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

这样,当改变窗口的大小以后,也能进行正确的视口变换了。

你可能感兴趣的:(OpenGL)