我很惊讶没有人提到:OpenGL也可以在左手坐标系中工作。至少在使用着色器并使用默认深度范围时,它才起作用。
一旦淘汰了固定功能管道,就可以直接处理“剪贴空间”。OpenGL规范将剪辑空间定义为4D同构坐标系。当您通过归一化的设备坐标进行转换时,一直到窗口空间,都可以找到。
窗口空间等于窗口像素的空间。原点在左下角,+ Y向上,+ X右侧。这听起来很像一个右手坐标系。但是Z呢?
默认深度范围(glDepthRange)将Near Z值设置为0并将far Z值设置为1。因此,+ Z 远离观看者。
那是左手坐标系。是的,您可以将深度测试从GL_LESS更改为GL_GREATER,并将glDepthRange从[0,1]更改为[1,0]。但是OpenGL 的默认状态是在左手坐标系中工作。而且,从剪贴空间进入窗口空间所需的任何变换都不会使Z取反。因此,剪贴空间中,顶点(或几何)着色器的输出是一个左手空间(kinda。这是一个4D均匀空间,因此很难确定惯用的惯用语)。
在固定功能流水线,标准投影矩阵(由glOrtho,glFrustum等产生的)中的所有从右旋空间变换到左手之一。他们翻转了Z的含义;只需检查它们生成的矩阵即可。在眼睛空间中,+ Z向观察者移动;在投影后空间中,它会移开。
我怀疑微软(和GLide)根本没有理会在他们的投影矩阵中进行求反。