文章here说:
用w分割x,y和z可以实现这一点。结果坐标 被称为标准化设备坐标。现在一切都可见了 几何数据位于立方体之间,其位置在< -1,-1,-1>之间。和 < 1,1,1>在OpenGL中,以及< -1,-1,0>之间和< 1,1,1>在 Direct3D的。
这为跨平台着色器提出了一个问题,这些着色器想要出于某些特定原因测试Z坐标。有没有办法让Z coord在同一范围内,无论平台如何?
答案 0 :(得分:1)
通常避免使用NDC空间的非线性z / w值。通常通过将绝对顶点Z距离传递另外的变化来实现此目的。这样事情就变得便携了。
答案 1 :(得分:1)
有趣的问题,但我怀疑它是否可以实现,因为视口转换仍然是固定功能。
首先想到的是使用glDepthRange
(或其可能的D3D对应物)来将NDC z的映射更改为深度。但这不起作用,因为将[-1,1]传递给glDepthRange
只会将其限制为[0,1],而且你也不能将它设置为D3D到[0.5,1],因为在此之前一切仍会被[0,1]修剪。
但是我不认为你经常需要它,因为在片段/像素着色器中你获得了具有标准化[0,1]深度的窗口坐标(我希望Cg在这里表现得类似于GLSL)。在顶点着色器中,您更经常需要世界或查看空间深度,而不是NDC z。如果您真的需要它,您可以根据着色器中的预处理器定义做出决定。
答案 2 :(得分:0)
你在做Z的测试,你想做什么?
如果您是在片段着色器中进行的,那么您应该不在乎。 gl_FragCoord.z
或者与此相当的Cg在窗口空间中。窗口空间Z范围由glDepthRange
定义;默认情况下,它从0到1。
如果您在顶点着色器中进行此测试,那么您将不得不忍受它。更好的测试可能是在相机空间中完成,而不是剪辑空间或NDC空间。至少那时候,你通常会处理世界大小的距离。