GLSL シェーダー内の整数操作とビット操作は、OpenGL 3 以降でサポートされています (したがって、DX10 クラスのハードウェアにも存在します)。したがって、シェーダー内でこのビット操作を自分で行うことができます。
しかし、整数を操作することと、テクスチャからそれらを取得することは別のことです。標準の OpenGL テクスチャ形式 (慣れている可能性があります) は、float を直接保存するか ( のようにGL_R16F)、正規化された固定小数点値 ( のようGL_R16に、初心者にとっては実質的に整数です ;)) のいずれかですが、それらから読み取ると ( などを使用して) texture、texelFetch内部に格納された整数の元のビットパターンを簡単または確実に推測することはできません。
したがって、実際に使用する必要があるのは整数テクスチャであり、これには OpenGL 3 も必要です (または、おそらくGL_EXT_texture_integer拡張機能ですが、それをサポートするハードウェアにはとにかく GL3 が必要です)。GL_R16UIしたがって、テクスチャには、通常の固定小数点形式 (たとえばGL_R16、正規化された [0,1] 色の場合など) とは対照的に、(1 コンポーネント 16 ビット符号なし整数の場合)などの実際の整数内部形式を使用する必要があります。16 ビット精度)。
そして、シェーダーでは、たとえばusampler2D符号なし整数の 2D テクスチャ (および符号付きバリアントの場合も同様) のように、整数サンプラー タイプを使用して、 or呼び出しisampler...から実際に符号なし整数を取得する必要があります。texturetexelFetch
CPU:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, ..., GL_R, GL_UNSIGNED_SHORT, data);
GPU:
uniform usampler2D tex;
...
uint value = texture(tex, ...).r;
bool b1 = (value&0x8000) == 0x8000,
b2 = (value&0x4000) == 0x4000;
uint i1 = (value>>4) & 0x3FF,
i2 = value & 0xF;