0

GLSL (iPhone で実行) で記述されたパレット マッピング シェーダーを最適化しようとしています。私の実装は確かにナイーブですが、OpenGL はまったく初めてです。

#define COLOR_BLACK vec4(0.0, 0.0, 0.0, 1.0)
#define COLOR_WHITE vec4(1.0, 1.0, 1.0, 1.0)
(... total of 16 colors)

highp vec4 color = texture2D(inputImageTexture, samplePos );

highp float distances[16];
distances[0] = distance(color, COLOR_BLACK);
distances[1] = distance(color, COLOR_WHITE);
(... total of 16 distance calculations)

(... find smallest colour distance)

mediump vec4 finalColor;
if (colorDistance == distances[0]) {
    finalColor = COLOR_BLACK;
} else if (colorDistance == distances[1]) {
    finalColor = COLOR_WHITE;
(... total of 16 comparisons)

gl_FragColor = finalColor;

これは正常に動作しますが、かなり遅いです。ここでOpenGLを効果的に使用していないと確信しています:)

どんな助けでも大歓迎です!

4

3 に答える 3

2

ルックアップ テーブルとして、最も近いフィルタリング モードで (小さい) 3D テクスチャを使用します。

コメントがあったので更新

3D テクスチャが利用できない場合は、1 つの大きなサイズの 1D テクスチャを再度ニアレスト フィルタリング モードで使用し、3D テクセルをフラット配列でアドレス指定するのと同じ方法でアドレス指定できます。つまり、

texel_index(x,y,z) = x*width*height + y*width + z;
于 2012-08-25T20:02:26.170 に答える
1

この効果を達成する別の方法は、丸め/フローリングです。だからあなたは(テストされていない)を得る:

highp vec4 color = texture2D(inputImageTexture, samplePos );
gl_FragColor = floor(color*2.0) * 0.5;

ファクター2を試してみることをお勧めします。

于 2012-08-25T20:09:44.700 に答える
0

どの種類のパレットにマッピングしていますか? ランダムな 16 色だけですか、それともパターンがありますか?

16色が、たとえば8色と明るいまたは暗いと仮定すると、入力RGBをYUV(またはその他の輝度指向のスペース)に変換し、Yチャネルで単一の判断を行い、次にUVを次の方法で2Dテストに変換できます単一のテクスチャ ルックアップ。赤、緑、青の 8 色がオンまたはオフの場合、ルックアップなしで 2D テストを実行できます。

個別の外観が必要な場合は、Jaxan の rounding-within-components のようなものがおそらく最も賢い方法です。

于 2012-08-25T20:16:38.670 に答える