坐标输出从Cg顶点着色器



这篇文章说:

将x, y和z除以w就完成了这个。得到的坐标称为标准化设备坐标。现在所有可见的几何数据位于位置在<-1, -1, -1>和之间的立方体中OpenGL中的<1,1,1>,以及<-1, -1, 0>和<1,1,1> in之间Direct3D .

这给跨平台着色器带来了一个问题,因为某些特定的原因想要测试Z坐标。有没有办法让Z轴在相同的范围内,而不考虑平台?

有趣的问题,但我怀疑这是可以实现的,因为视口转换仍然是固定函数。

首先想到的是使用glDepthRange(或其可能的D3D对应物)将映射从NDC z更改为深度。但这是行不通的,因为将[-1,1]传递给glDepthRange只会将其夹紧到[0,1],也不能在D3D中将其设置为[0.5,1],因为在此之前所有内容仍然会针对[0,1]进行夹紧。

但我不认为你需要它太频繁,因为在片段/像素着色器中,你得到一个标准化的[0,1]深度的窗口坐标(我希望Cg的行为类似于这里的GLSL)。在顶点着色器中,你更需要世界或视图空间深度,而不是NDC z。如果你真的需要它,你可以根据着色器中的预处理器定义来决定。

通常避免使用NDC空间的非线性z/w值。通常是通过一个额外的变量来传递顶点Z的绝对距离。

你在哪里做你想做的Z测试?

如果你在片段着色器中这样做,那么你不应该关心。gl_FragCoord.z或者任何Cg等价的东西都在窗口空间中。窗口空间Z范围由glDepthRange定义;默认值为0 ~ 1。

如果你在顶点着色器中做这个测试,那么你将不得不忍受它。更好的测试可能是在相机空间进行,而不是在剪辑空间或NDC空间进行。至少,你通常是在处理世界大小的距离。

最新更新