我真的试图在这个非常基本的(乍一看)问题上找到答案。
为简单起见,在进一步讨论期间禁用深度测试(没什么大不了的)。
例如,我们有带有下一个 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 检查和除法(请参阅下面的详细信息)。