【发布时间】: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 是胡言乱语,因为它会破坏矩阵位置(否定它),所以在变换你的位置之后三角形是错误的......因此剪裁 -
不完全是:这样的点可以有意义,作为三角形的点之一。有关详细信息,请参阅上面的 [已添加]。
标签: math directx direct3d direct3d11 homogenous-transformation