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

使用するバッファーのバインド/再バインド操作が少ないほど、優れています。

さらに、あなたの場合、RGB + Specular の 4 つの float だけで十分です。したがって、完全な 128 ビットのレンダー ターゲットを使用し、(r,g,b,specular) 値をパックします。異なるメモリ位置 (rgb の場合は 96 ビット、鏡面反射光の場合はさらに 32 ビット) へのアクセスはキャッシュに悪影響を与えるため、より良いものに違いありません。

古いビデオカードには、1 つのレンダー ターゲットも適しています。とにかく、96 ビットしか使用しないと、メモリが無駄になります。g-buffer は常にぎっしり詰まっている必要があります。

于 2012-06-30T12:08:07.113 に答える