我对OpenGL的模型视图变换感到非常困惑。我理解所有的变换过程,但是当涉及到投影矩阵时,我就迷失了:(
如果我有一个点P(x, y, z),我如何检查这个点是否会被绘制在由平行裁剪体或透视裁剪体定义的裁剪体上?这个过程背后的数学原理是什么?
我对OpenGL的模型视图变换感到非常困惑。我理解所有的变换过程,但是当涉及到投影矩阵时,我就迷失了:(
如果我有一个点P(x, y, z),我如何检查这个点是否会被绘制在由平行裁剪体或透视裁剪体定义的裁剪体上?这个过程背后的数学原理是什么?
应用模型视图投影矩阵到对象,然后检查它是否在由以下平面定义的剪裁坐标截锥体之外:
-w < x < w
-w < y < w
0 < z < w
如果您有一个点p
,它是一个vec3,并且有一个模型视图投影矩阵M
,那么在GLSL中它将如下所示:
bool in_frustum(mat4 M, vec3 p) {
vec4 Pclip = M * vec4(p, 1.);
return abs(Pclip.x) < Pclip.w &&
abs(Pclip.y) < Pclip.w &&
0 < Pclip.z &&
Pclip.z < Pclip.w;
}
对于依赖于已接受答案的任何人来说,它是不正确的(至少在当前实现中)。OpenGL在z平面上的剪辑与x和y相同,即-w < z < w (https://www.khronos.org/opengl/wiki/Vertex_Post-Processing)。
因此,z的两个测试应该是:std::abs(Pclip.z) < Pclip.w
检查零将排除所有绘制的点,这些点比远裁剪平面更靠近近裁剪平面。