坐标Cg Vertex着色器的输出

时间:2011-11-14 15:18:15

标签: opengl direct3d shader cg

文章here说:

  

用w分割x,y和z可以实现这一点。结果坐标   被称为标准化设备坐标。现在一切都可见了   几何数据位于立方体之间,其位置在< -1,-1,-1>之间。和   < 1,1,1>在OpenGL中,以及< -1,-1,0>之间和< 1,1,1>在   Direct3D的。

这为跨平台着色器提出了一个问题,这些着色器想要出于某些特定原因测试Z坐标。有没有办法让Z coord在同一范围内,无论平台如何?

3 个答案:

答案 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空间。至少那时候,你通常会处理世界大小的距离。