1

それに対して if() できるようにするために、ビットフラグをフラグメントシェーダーに送信する最良の方法は何でしょうか?

次のビット フラグ (列挙型) があります。

uint32_t options;

enum Options {
    ON                  = 1 << 0,   /// row 1 | enable or disable
    OFF                 = 1 << 1,
    DUMMY1              = 1 << 2,
    DUMMY2              = 1 << 3,
    NONE                = 1 << 4,   /// row 2 | contours
    SILHOUETTE          = 1 << 5,
    SUGGESTIVE          = 1 << 6,
    APPARENTRIDGES      = 1 << 7,
    PHOTOREALISTIC      = 1 << 8,   /// row 3 | shading
    TONE                = 1 << 9,
    TONESPLASHBACK      = 1 << 10,
    EXAGGERATED         = 1 << 11
    };

テーブルに対応 [] = place i,j in table ([bit as int])

[1]   [2]   [4]    [8]
[16]  [32]  [64]   [128]
[256] [512] [1024] [2048]

したがって、実際のテーブルのすべての行で最初のすべてのオプションが選択されている場合のビットフラグ (オプション) の可能な値は、273 の値になります。すべての行で、1 つのオプションのみを選択できます。

ビットフラグを使用して CPU で有効になっているオプションを確認したい場合は、次のようにします (最初の列が選択されている例の場合)。

if (options & ON) {}          // true
if (options & OFF) {}         // false
if (options & PHOTOREALISTIC) // true

アイデアは、ビットフラグで提示された選択に基づいて、シェーダーのさまざまな部分を実行することです。この目的のために、私は次のようなことをする必要があります:

if( options == 273)
  // do enable object, render with no contours and in a photorealistic manner

無効になっている残りのオプションを (シェーダーで) スキップします。ただし、理想的なケースでは、ビットフラグを使用して、これを CPU で行う方法に単純化したいと考えています。したがって、私のシェーダーでは、次のようなものが必要です。

if ( (options & PHOTOREALISTIC) & (options & ON)) // true
    // do stuff

このようなことを達成することは可能ですか?まったく同じではないかもしれませんが、ビットフラグから生じるすべての可能な整数に対して単純に「 if()-ing 」するよりもエレガントですか? (例: if(1+16+256), if(1 + 16 + 512),... if(8+128+2048))

4

2 に答える 2

3

使用したいコード パスが異なるため、フラグを簡潔に列挙しても意味がありません。C++ では関数テーブルのジャンプのようなことを行うことができますが、GLSL ではそれができません (信じてください - あなたはそうしたくありません)。したがって、通常の方法でチェックしてください。

if (options & (ON | PHOTOREALISTIC)) {  /*do something*/ }

Uber-shader アプローチに縛られていない場合の代替手段として、GLSL オブジェクトに実装された個別の機能ブロックから GLSL プログラムを構築することを検討してください。

たとえば、1 つのブロックが通常のレンダラーを実装し、2 番目のブロックが写真のようにリアルな方法でそれを実行する場合があります。どちらも同じ関数名を持つ必要があり、メイン シェーダーで外部的にリンクされ、そこから呼び出されます。GLSL プログラムをリンクするときは、目的の動作に一致するこれらのブロックの 1 つだけをアタッチします。

于 2011-03-09T16:41:38.077 に答える
0

これ使えますか?

if ((options & (PHOTOREALISTIC | ON)) == (PHOTOREALISTIC | ON))
于 2011-03-09T15:31:06.430 に答える