0

在 OpenGL 中,您的视点始终位于 [0,0,0]。假设此时您有一个顶点作为立方体或其他对象的一部分。该顶点是在相机/视点的前面还是后面?在投影之后,当 z==0 时,我总是以 w=1 结束,这也(如预期的那样)发生在 z==-1 的顶点上。所以实际上 z=0 和 z=-1 的顶点在投影后的距离相等。

在此处查看vec(2,2,0)vec(2,2,-1)如何以相同的屏幕坐标结束:https ://jsfiddle.net/sf4dspng/1/

结果:

vec1:  x=2.0000, y=2.0000, z= 0.0000, w=1
proj1: x=0.9474, y=2.0000, z=-0.2002, w=1
norm1: x=0.9474, y=2.0000, z=-0.2002, w=1
view1: x=1.0000, y=0.0000, z= 0.3999, w=1

vec2:  x=2.0000, y=2.0000, z=-1.0000, w=1
proj2: x=0.9474, y=2.0000, z= 0.8018, w=1
norm2: x=0.9474, y=2.0000, z= 0.8018, w=1
view2: x=1.0000, y=0.0000, z= 0.9009, w=1

这是为什么?

4

1 回答 1

0

应用所有转换后的坐标系以及在运行顶点着色器后发生的隐式透视划分称为标准化设备坐标。在这个空间中,坐标的可见范围是从(-1,-1,-1)(1,1,1);其他一切都被剪掉了。(0,0,0)将在屏幕中央,进入场景的一半。

剪辑坐标(顶点着色器返回的值的坐标系)中,XYZ 值的可见范围为(-w,-w,-w)(w,w,w),因为 NDC 计算为剪辑坐标的 XYZ 值除以 W 值。

除此之外,这取决于您的顶点着色器实现的内容。“对象”和“视图”空间之类的东西通常由顶点着色器实现,但 OpenGL 实际上并没有意识到它们的存在。这些空间的可见值取决于您在顶点着色器中的实现方式,并且由于空间转换通常使用矩阵定义,因此可见坐标取决于您使用的矩阵。

于 2016-09-09T12:40:44.843 回答