0

我真的试图在这个非常基本的(乍一看)问题上找到答案。

为简单起见,在进一步讨论期间禁用深度测试(没什么大不了的)。

例如,我们有带有下一个 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 < z < w,因此 GPU 应该减少这一点。是的,原则上,我不明白这一点。但三角形仍然可见!好的,根据大量其他资源(以及我个人的理解),我们将有像(x/w, y/w, z/w)这样的除法,所以结果应该是 (0, 0.6, 1)。但我越来越

图像

即使这个结果有一定的意义(一个点在某个地方很远),在这种情况下(在无限点和负 W 的情况下)DirectX(我认为它是相当 GPU)是如何工作的?

似乎我不知道一些非常基本的东西,但似乎没有人知道。

[添加]:我想指出点 w < 0 - 不是真正的输入。在现实生活中,这些点是矩阵转换的结果,并且根据数学(在标准 Direct sdk 和其他地方使用的数学)对应于出现在相机位置后面的点。是的,那个点被剪掉了,但问题是关于包含这个点的奇怪三角形。

[简要回答]:剪辑本质上不仅仅是 z/w 检查和除法(请参阅下面的详细信息)。

4

1 回答 1

0

从理论上讲,NDC 深度分为两个不同的区域。下图显示了znear = 1, zfar = 3. 水平轴显示视图空间 z,垂直轴显示标准投影变换的 NDC 深度:

国家数据中心深度

我们可以看到视图空间 z 的 1 和 3 ( znear, zmax) 之间的部分被映射到 NDC 深度 0 到 1。这是我们真正感兴趣的部分。但是,视图空间 z 为负的部分也会产生正 NDC 深度。然而,这些是由折叠产生的部分。即,如果你在三角形的一个角上慢慢减小 z(连同 w),从 znear 和 zfar 之间的区域开始,你会观察到以下情况:

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

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

在此处查看旧的D3D9 文档以获取公式和一些更说明性的解释。

于 2018-08-11T10:45:36.920 回答