わずかな速度の増加であっても、次のアルゴリズムを最適化してより高速にする方法はありますか?
const mat3 factor = mat3(1.0, 1.0, 1.0, 2.112, 1.4, 0.0, 0.0, 2.18, -2.21);
vec3 calculate(in vec2 coord)
{
vec3 sample = texture2D(texture_a, coord).rgb;
return (factor / sample) * 2.15;
}
わずかな速度の増加であっても、次のアルゴリズムを最適化してより高速にする方法はありますか?
const mat3 factor = mat3(1.0, 1.0, 1.0, 2.112, 1.4, 0.0, 0.0, 2.18, -2.21);
vec3 calculate(in vec2 coord)
{
vec3 sample = texture2D(texture_a, coord).rgb;
return (factor / sample) * 2.15;
}
私が考えることができる唯一の重要な最適化は、可能であれば単一の 3 チャネル テクスチャにパックすることですtexture_a
。texture_b
これにより、ここでボトルネックになる可能性が最も高い 2 つのテクスチャ ルックアップのうちの 1 つを節約できます。
アプリケーションで彼のソリューションが可能な場合、テクスチャルックアップは最も高価であるため、@ Thomasの回答が最も役立ちます。これらのテクスチャを別の場所で既に使用している場合は、値をパラメータとして渡して、ルックアップの重複を避けてください。
そうでなければ、それほど最適化できるかどうかはわかりませんが、頭に浮かぶ簡単なことをいくつか。
コンパイラーの最適化:
const キーワードを coord パラメータに割り当て、可能であればサンプリングも行います。
各 float 要素に f リテラルを割り当てます。
たぶん手動でマットを割り当てます
行列の乗算がどのように実装されているのかわからないため、高速かどうかはわかりませんが、定数係数行列には多くの 1 と 0 が含まれているため、手動で割り当てることができます。
vec3 calculate(const in vec2 coord)
{
//not 100% sure if that init is possible
const vec3 sample = vec3(texture2D(texture_a, coord).r
texture2D(texture_b, coord).ra - 0.5f);
vec3 result = vec3(sample.y);
result.x += sample.x + sample.z;
result.y += 2.112f * sample.x;
result.z *= 2.18f;
result.z -= 2.21f * sample.z;
return result;
}