0

わずかな速度の増加であっても、次のアルゴリズムを最適化してより高速にする方法はありますか?

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;
} 
4

2 に答える 2

2

私が考えることができる唯一の重要な最適化は、可能であれば単一の 3 チャネル テクスチャにパックすることですtexture_atexture_bこれにより、ここでボトルネックになる可能性が最も高い 2 つのテクスチャ ルックアップのうちの 1 つを節約できます。

于 2012-05-06T11:09:59.873 に答える
0

アプリケーションで彼のソリューションが可能な場合、テクスチャルックアップは最も高価であるため、@ 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;
}
于 2012-05-06T18:02:05.520 に答える