次のアルゴリズムを最適化する方法はありますか?GLSLシェーダアルゴリズムの最適化
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;
}
次のアルゴリズムを最適化する方法はありますか?GLSLシェーダアルゴリズムの最適化
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の回答が最も役立ちます。テクスチャルックアップはアプリケーションで解決が可能であれば最もコストがかかるためです。これらのテクスチャを既に使用している場合は、値をパラメータとして渡して、重複する参照を避けるようにしてください。
その他私は、それが私の頭に浮かぶ多くの、しかしまっすぐ進むものに最適化できるかどうかわかりません。
コンパイラの最適化:
は、可能な場合は、あまりにもサンプリングする、パラメータをCOORDするconstキーワードを割り当てます。
各float要素にfリテラルを割り当てます。私は行列の乗算を実装する方法を知りませんが、一定の係数行列は、多くのものとゼロを含んでいるので、それは多分手動でできるので、たぶん、手動であればその速く、私は知らない
マットを割り当てる
割り当てられた。
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;
}