我正在尝试使用OpenGL为iOS应用程序渲染一幅森林场景。为了使其更美观,我想将深度效果应用于场景中。然而,为此我需要从OpenGL深度缓冲区获取一个线性化深度值。目前,我在片段着色器中使用一个计算公式(从这里找到)。
因此,我的地形片段着色器如下所示:
然而,这会导致以下输出:
因此,我的地形片段着色器如下所示:
#version 300 es
precision mediump float;
layout(location = 0) out lowp vec4 out_color;
float linearizeDepth(float depth) {
return 2.0 * nearz / (farz + nearz - depth * (farz - nearz));
}
void main(void) {
float depth = gl_FragCoord.z;
float linearized = (linearizeDepth(depth));
out_color = vec4(linearized, linearized, linearized, 1.0);
}
然而,这会导致以下输出:
如您所见,越远离视角,深度值就越有“条纹”效果(特别是在船后面)。如果地形块靠近相机,则输出结果还算可以。
我甚至尝试了另一种计算方法:
float linearizeDepth(float depth) {
return 2.0 * nearz * farz / (farz + nearz - (2.0 * depth - 1.0) * (farz - nearz));
}
由于数值过高,我进行了缩放处理,通过除以一个数进行调整:
float linearized = (linearizeDepth(depth) - 2.0) / 40.0;
然而,它给出了类似的结果。
那么,如何在近平面和远平面之间实现平滑、线性的过渡,没有任何条纹呢?有人遇到过类似的问题吗?