Math DirectX负片W

Math DirectX负片W,math,directx,direct3d,direct3d11,homogenous-transformation,Math,Directx,Direct3d,Direct3d11,Homogenous Transformation,我真的在试图找到这个非常基本(乍一看)的问题的答案 为了简单起见,深度测试在进一步讨论中被禁用(这没什么大不了的) 例如,我们有一个三角形(转换后)和下一个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(不带变换),所以我对输入有信心。我们认为结果是合理的: 但如果我们开始移动摄像机位置的中心点,

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

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

例如,我们有一个三角形(转换后)和下一个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(不带变换),所以我对输入有信心。我们认为结果是合理的:

但如果我们开始移动摄像机位置的中心点,我们会得到什么。在我们的例子中,我们没有相机,所以我们将把这个点移动到负无穷大。 只要w(带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)。但是我越来越

即使这个结果有某种意义(一个点远远落后于as),DirectX(我认为它相当于GPU)在这种情况下是如何工作的呢

似乎我不知道一些非常基本的事情,但似乎没有人知道

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


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

理论上,NDC深度分为两个不同的区域。下图显示了
znear=1、zfar=3的这些区域。横轴显示视图空间z,纵轴显示标准投影变换的结果NDC深度:

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

  • 我们从znear和zfar开始,一切都很好
  • 一旦我们通过znear,该点就会被截断,因为NDC深度<0
  • 当我们在视图空间z=0时,该点也具有w=0且没有有效投影
  • 当我们进一步减小视图空间z时,该点再次获得有效投影(从无穷远处开始),并以正NDC深度返回
但是,最后一部分是相机后面的区域。因此,进行了均匀剪裁,以便该部分也通过Z线性剪裁进行剪裁


检查旧的公式和一些更具说明性的解释。

w=0
将顶点作为向量处理,
w=1
将顶点作为点处理,而w=-1是乱码,因为它会破坏矩阵位置(将其取反),所以变换后三角形的位置是错误的。。。因此,剪报是准确的:这样的点可以有意义,作为三角形的一个点。详情请参见上面的[添加],谢谢您的回答。可能主要思想在其中一个嵌套链接中描述: