以下图片是几何渲染结果。
耶稣!我没有足够的声誉。然后我无法附上我的照片。 我描述几何图形,而不是附上我的图片。
几何图形为扁平矩形。
然后下面的代码是用于创建深度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缓冲区。 但我迷失了方向。 我的代码有问题吗? 请帮帮我。
答案 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
图像格式效率更高,不需要特殊的打包和解包,它们可以存储具有必要精度的单个组件来存储您的深度。