【发布时间】:2016-09-14 06:13:16
【问题描述】:
我一直在使用gluPerspective,并且对它的作用和工作原理有所了解。但我仍然不太明白如何使用它来实现超出它开始和停止的任何效果。更改zfar 和znear 似乎对任何事情都没有太大影响。我错过了很酷的效果吗?有哪些数值范围以及您可以做哪些视觉失真?
【问题讨论】:
标签: opengl
我一直在使用gluPerspective,并且对它的作用和工作原理有所了解。但我仍然不太明白如何使用它来实现超出它开始和停止的任何效果。更改zfar 和znear 似乎对任何事情都没有太大影响。我错过了很酷的效果吗?有哪些数值范围以及您可以做哪些视觉失真?
【问题讨论】:
标签: opengl
你不会错过任何很酷的效果。 zNear 和 zFar(或 nearVal 和 farVal)是到近剪裁平面和远剪裁平面的距离。它们定义了相机空间 z 坐标映射到投影空间深度值的方式。 z 缓冲区可以存储介于 -1 和 +1 之间的值。远离相机的点zNear 将映射为-1,而远离相机的点zFar 将映射为+1。超出该范围的任何内容都将被剪裁。
请注意,这两个功能以及我所说的一切都是遗留的。您最好使用 OpenGL 4+ 学习现代 OpenGL 管道。在那里,您负责明确地进行精确的数学运算,我认为这将提高您对它的工作原理的理解。同样,今天您实际上可以use floating point z-buffers 禁用深度裁剪,从而使所有近/远裁剪平面都过时了。
【讨论】:
OpenGL函数GLFrustum()中投影矩阵的几何意义,在OpenGL官方指南(本书第九版,OpenGL编程指南——学习OpenGL的官方指南)中有解释,来自一个代数的观点,实际上对应于许多与作者预期不同的几何含义。
它们之间的显着区别是:
1.在官方指南中,作者说明了一个复合线性变换,其因子之一为central projection,因此最终的复合透视投影矩阵应该是奇异矩阵或退化矩阵;
2. 虽然还在官方指南中,但在附录中,GLFrustum() 透视投影矩阵是一个非奇异的 4 乘以 4 方阵!
请注意:作者试图将非奇异矩阵解释为理论上的奇异矩阵!
以下矩阵分解(不唯一)对应非单数GLFrustum()矩阵的几何意义之一:
除第(2)号之外的所有上述矩阵因子,在Unified Framework of Elementary Geometric Transformations 中重新定义了它们的几何意义。如果您选择此分解作为GLFrustum() 透视投影矩阵的几何含义解释,则必须确保您在代码中进行的任何计算或变换都与其几何含义一致。
所以当你使用 OpenGL GLFrustum() 进行编程时,可能需要与官方指南中说明的内容进行比较,以及从纯代数射影几何的角度来看,GLFrustum() 透视投影矩阵的真正含义,以及使用您自己的任何一种。
【讨论】: