c++ - 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)
如何计算非线性到线性深度缓冲区?(即形成方程)?
解决方案
推荐阅读
- android - 有什么方法可以使用 Flutter 从我的设备上卸载应用程序?
- kotlin - 为什么 String.toDouble() 会增加小数位?
- php - .htacess 将分页添加到文件 S_NSW.php
- asp.net-core - 从 .NET Core 将视频流式传输到 Safari
- java - 是否可以在输出上方使用扫描仪显示输出?
- mysql - Sequelize with koa2 不能限制记录。我能怎么做?
- google-chrome - 凭证管理api在哪里存储webauthn相关数据
- python - 负 reg.score 在 Python 中意味着什么?
- django - 为什么我的 django 表单清理数据每次都返回 None ?
- mailgun - 如何访问 API 响应消息 ID