G-Buffer 在延迟渲染过程中通常应该包含什么?
What should a G-Buffer commonly include in a deferred rendering process?
我正在尝试使用 OpenGL 实现一个简单的延迟渲染器,并阅读了描述该主题的各种教程和论文,大多数只对 G-Buffer 的结构提供非常简约或抽象的描述——通常包含漫反射、深度和正常缓冲区。
然而,如果没有某种 material 渲染、使用纹理、可调节的镜面照明等,即使是简单的图形引擎也不完整。为所有属性添加额外的缓冲区显然会使 G-Buffer 膨胀很多,那么在第二个渲染过程中获取所有 per-material 数据的首选方法是什么?
在我的 OpenGL 实现中,我使用帧缓冲区将漫反射、法线和深度分别渲染到 GL_COLOR_ATTACHMENT0
、GL_COLOR_ATTACHMENT1
和 GL_DEPTH_ATTACHMENT
。有没有办法为 material 存储一个 ID 或类似的东西,最好是在 OpenGL 3.3 核心中?
存储 material ID 的一种方法是将该 ID 作为统一传递给片段着色器,并将其写入您的 G 缓冲区。假设你的缓冲区是 4 通道 RGBA8,并且 material ID 是 unsigned 8-bit int,它支持 265 materials,你的片段着色器在 G-buffer pass 中看起来像这样(伪):
uniform uint inMatId;
uniform sampler2D inTexture;
void main()
{
outputColor = vec4(texture(ourTexture, TexCoord).rgb, inMatId/255);
}
当然,这样画最好的方法是先按material排序对象再画。请注意,我将 material Id 除以 255 以将其映射到 [0,1] 范围。在着色过程中,您可以通过乘以 255 来读回它。同样的方法可以用于您需要的几乎所有其他类型的数据。
我正在尝试使用 OpenGL 实现一个简单的延迟渲染器,并阅读了描述该主题的各种教程和论文,大多数只对 G-Buffer 的结构提供非常简约或抽象的描述——通常包含漫反射、深度和正常缓冲区。
然而,如果没有某种 material 渲染、使用纹理、可调节的镜面照明等,即使是简单的图形引擎也不完整。为所有属性添加额外的缓冲区显然会使 G-Buffer 膨胀很多,那么在第二个渲染过程中获取所有 per-material 数据的首选方法是什么?
在我的 OpenGL 实现中,我使用帧缓冲区将漫反射、法线和深度分别渲染到 GL_COLOR_ATTACHMENT0
、GL_COLOR_ATTACHMENT1
和 GL_DEPTH_ATTACHMENT
。有没有办法为 material 存储一个 ID 或类似的东西,最好是在 OpenGL 3.3 核心中?
存储 material ID 的一种方法是将该 ID 作为统一传递给片段着色器,并将其写入您的 G 缓冲区。假设你的缓冲区是 4 通道 RGBA8,并且 material ID 是 unsigned 8-bit int,它支持 265 materials,你的片段着色器在 G-buffer pass 中看起来像这样(伪):
uniform uint inMatId;
uniform sampler2D inTexture;
void main()
{
outputColor = vec4(texture(ourTexture, TexCoord).rgb, inMatId/255);
}
当然,这样画最好的方法是先按material排序对象再画。请注意,我将 material Id 除以 255 以将其映射到 [0,1] 范围。在着色过程中,您可以通过乘以 255 来读回它。同样的方法可以用于您需要的几乎所有其他类型的数据。