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 和 zfar 之间开始,一切都很好 一旦我们通过 znear,该点就会被剪裁,因为 NDC 深度 当我们在视图空间 z = 0 时,该点也有 w = 0 并且没有有效的投影。 随着我们进一步减小视图空间 z,该点再次获得有效投影(从无穷远开始)并以正 NDC 深度返回。

但是,最后一部分是相机后面的区域。因此,进行了均匀剪裁,使得这部分也被 znear 剪裁所剪掉。

查看旧的D3D9 documentation 中的公式和一些更说明性的解释here。

【讨论】:

感谢您的回答。可能的主要思想在嵌套链接之一中描述:fabiensanglard.net/polygon_codec/clippingdocument/…

以上是关于DirectX 负 W的主要内容,如果未能解决你的问题,请参考以下文章

DirectX和OpenGL到底哪个好

没有directx12可以玩directx12的游戏么?

DirectX 11:运行简单的 DirectX 应用程序时运行时崩溃

使用 DirectX 11 后重置窗口

DirectX9.0或7以上的在哪下载啊

初学DirectX,怎么在Delphi中安装DirectX