小编lzv*_*lzv的帖子

线性深度缓冲

许多人使用通常的透视矩阵与第三行像这样:

(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管道中是否存在陷阱?

opengl-es depth-buffer webgl

2
推荐指数
1
解决办法
863
查看次数

标签 统计

depth-buffer ×1

opengl-es ×1

webgl ×1