GLSL非常适合创建深度G缓冲区

时间:2015-02-16 17:54:20

标签: glsl shader depth

以下图片是几何渲染结果。

耶稣!我没有足够的声誉。然后我无法附上我的照片。 我描述几何图形,而不是附上我的图片。

几何图形为扁平矩形。

然后下面的代码是用于创建深度g-buffer的glsl源。

---顶点着色器---

varying float uv_depth;

void main (void) 
{
    vec4 pos = modelview_mat * vec4(v_pos,1.0);
    gl_Position = projection_mat * pos;
    uv_depth = gl_Position.z / gl_Position.w;
}

--- Fragment Shader ---

varying float uv_depth;

void main (void)
{
    float depthNormalized = uv_depth * 0.5 + 0.5;
    vec4 color = packFloatToVec4i(depthNormalized);
    gl_FragColor = color;
}

函数packFloatToVec4i是一个正确的打包功能。这不是那么重要。

如上所述,几何图形为扁平矩形。 所以我期待非常流畅的形象。但事实并非如此。 深度g-buffer很奇怪。

正如我所料,有些部分很光滑。但事实并非如此。 有些部件有苛刻的波动。

我认为很容易制作深度G缓冲区。 但我迷失了方向。 我的代码有问题吗? 请帮帮我。

1 个答案:

答案 0 :(得分:0)

您的varying float uv_depth逻辑不是必需的。

如果您了解OpenGL用于进入窗口空间(gl_FragCoord)的转换(投影,透视分割,视口映射),您会发现根本不需要编写uv_depth

片段着色器计算中的行float depthNormalized = uv_depth * 0.5 + 0.5;实际上与gl_FragCoord.z存储的值相同。您基本上已经重新发明了已经自动发生的视口转换(深度范围)。

如果以这种方式编写片段着色器,可能会得到更好的结果:

void main (void)
{
    vec4 color = packFloatToVec4i(gl_FragCoord.z);
    gl_FragColor = color;
}

理想情况下,您甚至不需要使用颜色纹理来存储深度。 GL_DEPTH_COMPONENT图像格式效率更高,不需要特殊的打包和解包,它们可以存储具有必要精度的单个组件来存储您的深度。