使用两个较小的渲染目标还是一个较大的渲染目标更好?

4

我正在编写一个延迟渲染器,并尝试压缩我的GBuffer。

将漫反射和镜面光一起存储是否更好呢?

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

或者使用两个渲染目标

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

问题是哪一个更好,为什么。
1个回答

4

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

更进一步,对于你的情况,只需使用4个浮点数:RGB+Specular。因此,请使用完整的128位渲染目标并打包(r,g,b,specular)值。这应该更好,因为访问不同的内存位置(96位用于rgb,另外32位用于specular)会影响缓存。

对于老款视频卡,一个渲染目标也更好。无论如何,当你仅使用96位时,你是在浪费内存。g-buffer总是必须紧密打包。


啊,我理解为最好使用较少、更大的缓冲区,这样我就可以使用RGBA32F纹理R-深度,G-法线,B-漫反射,高光,A-发射光。 R G - aCuria
1
是的,在位级别上,您可以将普通数据压缩得更紧密,以达到10:10:10:1甚至15:15:1(z是从归一化条件计算出来的)。因此,只需保持数据紧凑以避免大量分散的内存读取。 - Viktor Latypov
+1 你能举个快速示例展示打包代码的样子吗? - aCuria
1
请查看以下网址以获取更多详细信息:http://developer.amd.com/gpu_assets/01gdc09ad3ddstalkerclearsky210309.ppt - Viktor Latypov
在这些幻灯片中,他们使用了1个RGBA16F和1个RGBA8渲染目标,而不是一个单独的128位渲染目标,为什么会这样呢? - aCuria
1
大约3到4年前,填充率是一个问题。 - Viktor Latypov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接