次の GLSL の例を考えてみましょう。
1.
uniform sampler2D t;
...
void main() {
float val_r = texture2D(t, coords).r;
float val_g = texture2D(t, coords).g;
float val_b = texture2D(t, coords).b;
float val_a = texture2D(t, coords).a;
2.
uniform sampler2D t;
...
void main() {
vec4 data = texture2D(t, coords);
float val_r = data.r;
float val_g = data.g;
float val_b = data.b;
float val_a = data.a;
3.
uniform sampler2D t;
...
void main() {
vec4 data1 = texture2D(t, coords);
vec4 data2 = texture2D(t, coords);
vec4 data3 = texture2D(t, coords);
vec4 data4 = texture2D(t, coords);
float val_r = data1.r;
float val_g = data2.g;
float val_b = data3.b;
float val_a = data4.a;
2. は 1. より速いですか? それとも、明らかなコンパイラの最適化により、それらは等しいですか?
3.はどうですか?もちろん、これは意味がありませんが、シェーダー コードをわかりやすくするために、このような冗長なテクスチャ ルックアップが発生する可能性があります。それらが何らかの形で最適化/キャッシュされているのか、それとも避けるべきなのか疑問に思っています。