首页 > 解决方案 > openGL - 将非线性深度缓冲区转换为线性深度缓冲区

问题描述

根据this page上的线程,计算深度缓冲区给出的公式:

F_depth = 1/z - 1/n/(1/f - 1/n)   

仅因为透视划分是非线性的。(请注意,这是从视图空间 z 坐标直接到窗口坐标的组合

因此,根据我的理解:
要将其转换为线性深度缓冲区,我们唯一要做的就是删除透视除法(?),然后执行glDepthRange(a,b) 给定的 here

在这种情况下,等式将是这样的:

z_linear = z_NDC * W_clip = -(f+n)/(f-n)*z_eye + ( 2fn/(f-n) )

并且,通过深度范围变换:

z_[0,1] = ( z_linear + 1 ) /2
= ( (f+n)*z_eye - 2fn + f - n )/ ( 2(f-n) )

但是,在用于深度测试的 learnopenGL 站点中,这是完成的:

首先我们将深度值转换为 NDC,这并不难:

float ndc = depth * 2.0 - 1.0; 

然后我们获取得到的 ndc 值并应用逆变换来检索其线性深度值:

float linearDepth = (2.0 * near * far) / (far + near - ndc * (far - near)

如何计算非线性到线性深度缓冲区?(即形成方程)?

标签: c++opengldepth-testing

解决方案


推荐阅读