gpt4 book ai didi

opengl - 对数深度缓冲区线性化

转载 作者:行者123 更新时间:2023-12-03 03:55:01 24 4
gpt4 key购买 nike

如何线性化对数深度缓冲区?

片段着色器中线性深度缓冲区的可视化

  float n = 1.0; // camera z near
float f = 27000000.0; // camera z far
float z = texture( DepthTex, TexCoord ).x;
float d = (2.0 * n) / (f + n - z * (f - n));
FragColor=vec4(d,d,d,1);

球体顶点着色器

vec4 ClipCoords(vec3 position,mat4 matrix)
{
vec4 clip = matrix * vec4(position,1.0f);
clip.z =((2.0f * log(1.0f * clip.z + 1.0f) / log(1.0f * 27000000.0f + 1.0f)) - 1.0f) * clip.w;
return clip;
}
gl_Position = ClipCoords(position,matrix);

左边部分显示了对数深度缓冲区线性化,或者说它的不足,而右边部分显示了没有 log 的线性化,只是 gl_Position = matrix * vec4(position,1.0f); enter image description here

最佳答案

使用对数深度缓冲区,场景(相机空间)深度到最终在深度缓冲区 (0..1) 中的值的映射为:

depth_value = log(C*z + 1) / log(C*Far + 1)

其中 z 是场景的正深度,否则可以从投影后剪辑空间中的 w 分量获得(在代码中您可以使用 ..log(clip.w + 1.0)..)。

要检索片段着色器中的相机空间深度,需要反转方程:

z = (exp(depth_value*log(C*far+1)) - 1)/C

或者同等的

z = (pow(C*far+1,depth_value)-1)/C

要获得从 0..far 到 0..1 的线性映射,只需将其除以 far 值即可。

关于opengl - 对数深度缓冲区线性化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18182139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com