Math DirectX负片W
我真的在试图找到这个非常基本(乍一看)的问题的答案 为了简单起见,深度测试在进一步讨论中被禁用(这没什么大不了的) 例如,我们有一个三角形(转换后)和下一个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),会怎么样呢。 (注意:为了防止剔除,我们必须切换点或更改光栅化器) 根据巨大的资源量,我将进行如下测试:-wMath 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(不带变换),所以我对输入有信心。我们认为结果是合理的: 但如果我们开始移动摄像机位置的中心点,
[简要回答]:剪辑本质上不仅仅是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是乱码,因为它会破坏矩阵位置(将其取反),所以变换后三角形的位置是错误的。。。因此,剪报是准确的:这样的点可以有意义,作为三角形的一个点。详情请参见上面的[添加],谢谢您的回答。可能主要思想在其中一个嵌套链接中描述: