それに対して 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))