许多人使用通常的透视矩阵与第三行像这样:
(0 0 (n+f)/(n-f) 2*n*f/(n-f))
Run Code Online (Sandbox Code Playgroud)
但它在远剪裁面附近浮动精度有问题.结果是z战斗.如何使用z的线性变换?让我们将矩阵第三行更改为:
(0 0 -2/(f-n) (-f-n)/(f-n))
Run Code Online (Sandbox Code Playgroud)
它将是从[-n,-f]到[-1,1]的线性变换z.然后,我们将在顶点着色器中添加该行:
gl_Position.z *= gl_Position.w;
Run Code Online (Sandbox Code Playgroud)
透视分割后,z值将被恢复.
为什么不到处使用?我在互联网上发现了很多文章.所有这些都使用了通常的矩阵.我描述的线性变换是否存在我看不到的问题?
更新:这不是重复这个.我的问题不是关于如何做线性深度缓冲.就我而言,缓冲区已经是线性的.我不明白,为什么这个方法没用?内部webgl管道中是否存在陷阱?