4

我正在编写一个延迟渲染器,并试图打包我的 gbuffer。

将漫反射和镜面反射存储在一起会更好:

vec4 difSpec = (diffuse.xyz, specular) // FORMAT_RGBA
gl_FragData[0] = difSpc;

或使用 2 个渲染目标

vec3 diffuse
float specular
gl_FragData[0] = diffuse  // FORMAT_RGB
gl_FragData[1] = specular //  FORMAT_RED

问题是一个会比另一个更好,为什么。

4

1 回答 1

4

您使用的缓冲区绑定/重新绑定操作越少 - 越好。

更重要的是,在您的情况下,您只需 4 个浮点数即可:RGB + Specular。所以使用完整的 128 位渲染目标并打包 (r,g,b,specular) 值。它必须更好,因为对不同内存位置的访问(rgb 为 96 位,镜面反射为 32 位以上)对缓存不利。

对于较旧的显卡,一个渲染目标也更好。无论如何,当你只使用 96 位时,你就是在浪费内存。g-buffer 总是必须紧紧地打包。

于 2012-06-30T12:08:07.113 回答