私はLWJGLプロジェクトで作業しており、ブレンドマップを使用して地形をテクスチャ加工しています。GLSL:複数のsampler2D変数に対してテクスチャをより効率的に呼び出す
#version 400 core
in vec3 fsh_in_normal;
in vec2 fsh_in_coords;
in vec2 fsh_in_scaled;
out vec4 fsh_out_color;
uniform sampler2D blend_map;
uniform sampler2D texture_1;
uniform sampler2D texture_2;
void main(void) {
vec4 blend_vec = texture(blend_map, fsh_in_coords);
vec4 color_tx1 = texture(texture_1, fsh_in_scaled);
vec4 color_tx2 = texture(texture_2, fsh_in_scaled);
fsh_out_color = mix(color_tx1, color_tx2, blend_vec.r);
}
fsh_in_scaled
ので、実際の適用テクスチャが画面上でよりよい解像度で見られるfsh_in_coords
のスケーリングされたバージョンである:ここでは非常に単純な例です。
ここに私の質問です:texture_1
とtexture_2
は、同じ画像フォーマットとサイズ(512x512)を持っています。だから、同じ座標でそれらをサンプリングすると、テクスチャの色が実際にサンプリングされるまで、texture(...)
への各呼び出しで同じ計算を行うコンピュータではありませんか?あるいは、コンパイラは何とかこれを独自に最適化していますか?
最適化されていない場合、2つのtexture(...)
コールを合理化してコードを効率的にする方法はありますか?私は今後、ブレンドマップに少なくとも2つ以上のテクスチャを追加する計画をしており、既存のtexture_1
& texture_2
と同じディメンションとフォーマットになります。
ここでの主なコストは、メモリからの実際のテクスチャフェッチです。あなたのフラグメントシェーダが実際には遅くて(そしてそれを測定しない限り)心配する必要はありません。 –
物事を速くする方法はありますか?たとえそれが大したことではないとしても、@DietrichEppを知ることはまだ面白いです。 –
何かを速くしたいときの最初のステップは、それがどれだけ速く、遅い部分が何かを測定することです。そこから始めよう。 –