为了提高我对OpenGL和3D的理解,我试图实现一个只在CPU上运行的简单渲染管道。在有意义的地方,我试图使用与OpenGL相同的标准。例如,我正在使用右手坐标系like OpenGL。正如在学习新事物时经常发生的那样,我现在遇到一个我无法找到答案的问题。如果以下内容没有意义,请原谅并纠正我。
在剪辑空间(您在顶点着色器中为gl_Position
提供的坐标)中,负Z远离用户。但是在深度缓冲区中,正Z离开(如果您使用的是默认深度设置)。
this question的一个答案表明翻转是由投影变换引起的。但是我做了a little experiment(基于WebGL / OpenGL ES),反过来说:在剪辑空间中,即使你不使用投影变换,Z也指向远离用户。
所以在某些时候,在你递给你gl_Position
之后,OpenGL会翻转Z坐标。何时以及如何?
我的猜测是它位于viewport transform,但我找不到支持此文档的文档。
答案 0 :(得分:3)
OpenGL中的剪辑空间已经左手(并且一直是)。因此,在现代GL中,没有明确使用右手系统的空间,并且根本没有“翻转”。然而,旧GL中的眼睛空间通常是右手定义的,并且“翻转”是作为投影矩阵的一部分完成的,glFrustum()
和gluPerpective()
明确地期望近和远的正值可以参考对于重复的负z值。但是,由于您可以使用任意矩阵,您从未被迫用右手定义您的眼睛或对象空间,它只是默认约定。仍有很多人使用可编程管道遵循此约定。
答案 1 :(得分:0)