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...
から実際に符号なし整数を取得する必要があります。texture
texelFetch
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;