DirectX 负 W
Posted
技术标签:
【中文标题】DirectX 负 W【英文标题】:DirectX negative W 【发布时间】:2018-08-10 11:07:07 【问题描述】:我真的是想为这个非常基本的(乍一看)问题找到答案。
为简单起见,在进一步讨论期间禁用了深度测试(没什么大不了的)。
例如,我们有一个三角形(变换后)和下一个 float4 坐标。
顶部中心点:(0.0f, +0.6f, 0.6f, 1f)
基本点1:(+0.4f, -0.4f, 0.4f, 1f),
基本点2:(-0.4f, -0.4f, 0.4f, 1f),
我发送 float4 作为输入并使用直接的 VertexShader(没有变换),所以我确定输入。我们的结果是合理的:
但是,如果我们开始将 CenterPoint 移动到相机位置点,我们会得到什么。在我们的例子中,我们没有相机,所以将这个点移动到负无穷大。 只要 w (with z) 为正,我就会得到相当合理的结果。 例如,(0.0f, +0.006f, 0.006f, .01f) – 看起来一样。
但是如果我使用下一个坐标(0.0f,-0.6f,-1f,-1f)呢? (注意:我们必须切换点或更改光栅化器以防止剔除)。
根据大量资源,我将进行如下测试:-w ,因此 GPU 应该减少这一点。是的,原则上,我不明白这一点。但三角形仍然可见!好的,根据大量其他资源(以及我个人的理解),我们会有像 (x/w, y/w, z/w) 这样的除法,所以结果应该是 (0, 0.6, 1)。但我得到了
即使这个结果有一定的意义(一点远在后面),DirectX(我认为它是 GPU)在这种情况下是如何工作的 (在无限点和负 W 的情况下) ?
我似乎不知道一些很基本的东西,但似乎没有人知道。
[已添加]:我想指出点 w
[简要回答]:剪辑本质上不仅仅是 z/w 检查和除法(详见下文)。
【问题讨论】:
w=0
将您的顶点处理为向量,w=1
将您的顶点处理为点,而 w=-1 是胡言乱语,因为它会破坏矩阵位置(否定它),所以在变换你的位置之后三角形是错误的......因此剪裁
不完全是:这样的点可以有意义,作为三角形的点之一。有关详细信息,请参阅上面的 [已添加]。
【参考方案1】:
理论上,NDC 深度分为两个不同的区域。下图显示了znear = 1, zfar = 3
的这些区域。水平轴显示视图空间 z,垂直轴显示标准投影变换的 NDC 深度:
我们可以看到 1 和 3 (znear, zmax
) 的视图空间 z 之间的部分被映射到 0 到 1 的 NDC 深度。这是我们真正感兴趣的部分。
然而,视空间 z 为负的部分也会产生正的 NDC 深度。然而,这些是由折叠产生的部分。即,如果您从三角形的一个角开始,从 znear 和 zfar 之间的区域开始慢慢减小 z(与 w 一起),您会观察到以下情况:
但是,最后一部分是相机后面的区域。因此,进行了均匀剪裁,使得这部分也被 znear 剪裁所剪掉。
查看旧的D3D9 documentation 中的公式和一些更说明性的解释here。
【讨论】:
感谢您的回答。可能的主要思想在嵌套链接之一中描述:fabiensanglard.net/polygon_codec/clippingdocument/…以上是关于DirectX 负 W的主要内容,如果未能解决你的问题,请参考以下文章