G-Buffer通常应该在延迟渲染过程中包含什么?

时间:2015-03-03 23:37:46

标签: opengl graphics deferred-rendering

我正在尝试使用OpenGL实现一个简单的延迟渲染器,并阅读了描述该主题的各种教程和论文,大多数只为G-Buffer的结构提供非常简约或抽象的描述 - 通常包含漫反射,深度和正常缓冲

然而,即使是简单的图形引擎也不会在没有某种材质渲染的情况下完成,使用纹理,可调节的镜面光照等等。为所有属性添加额外的缓冲区显然会使G缓冲区膨胀很多,那么在第二个渲染过程中获取所有每个材质数据的优先方法是什么?

在我的OpenGL实现中,我使用Framebuffers渲染漫反射,正常和深度分别为GL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT1GL_DEPTH_ATTACHMENT。有没有办法甚至存储ID或类似的材料,最好是在OpenGL 3.3核心?

1 个答案:

答案 0 :(得分:3)

存储材质ID的一种方法是将该ID作为制服传递给片段着色器,并将其写入G缓冲区。假设您的缓冲区是4个通道RGBA8,并且材质ID是无符号8位int,它支持265个材质,G-buffer pass中的片段着色器将看起来像这样(伪):

uniform uint inMatId;
uniform sampler2D inTexture;
void main()
{
    outputColor = vec4(texture(ourTexture, TexCoord).rgb, inMatId/255); 
}

当然,这样绘制的最佳方法是按材质对对象进行排序然后绘制。请注意,我将材质Id除以255以将其映射到[0,1]范围。在着色过程中,您可以通过乘以255来读回它。同样的方法可以用于您需要的几乎所有其他类型的数据。