2017-07-18 5 views
0

私は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_1texture_2は、同じ画像フォーマットとサイズ(512x512)を持っています。だから、同じ座標でそれらをサンプリングすると、テクスチャの色が実際にサンプリングされるまで、texture(...)への各呼び出しで同じ計算を行うコンピュータではありませんか?あるいは、コンパイラは何とかこれを独自に最適化していますか?

最適化されていない場合、2つのtexture(...)コールを合理化してコードを効率的にする方法はありますか?私は今後、ブレンドマップに少なくとも2つ以上のテクスチャを追加する計画をしており、既存のtexture_1 & texture_2と同じディメンションとフォーマットになります。

+0

ここでの主なコストは、メモリからの実際のテクスチャフェッチです。あなたのフラグメントシェーダが実際には遅くて(そしてそれを測定しない限り)心配する必要はありません。 –

+0

物事を速くする方法はありますか?たとえそれが大したことではないとしても、@DietrichEppを知ることはまだ面白いです。 –

+1

何かを速くしたいときの最初のステップは、それがどれだけ速く、遅い部分が何かを測定することです。そこから始めよう。 –

答えて

1

テクスチャサンプリングはハードウェアテクスチャ単位で行われるため、さらに最適化する方法はありません。テクスチャルックアップの主なコストはメモリアクセスであるため、キャッシュミスを避けるためにミップマッピングを検討することがあります。

+0

ミップマップも生成しました。パフォーマンス自体は今のところ問題ではなく、もっと複雑な照明などを可能にするために可能な限り無駄なGPU計算を節約しようとしているだけです –

関連する問題