GLSLシェーダ内の整数とビット操作は、OpenGL 3以降でサポートされています(これにより、DX10クラスのハードウェア上に表示されます)。だから、シェーダーの内部でこのビットの管理を自分で行うことができます。
しかし、整数を使って作業することは、テクスチャから取り除くことのもう一つです。標準のOpenGLテクスチャ形式は、floatを直接(GL_R16F
のように)格納するか、または固定小数点値をGL_R16
のように正規化して格納していますが、それ以外の場合はtexture
、texelFetch
またはどんなものでも)シェーダの値を浮かせます。内部的に保存された整数の元のビットパターンを簡単に、または確実に推論することはできません。
OpenGL 3を必要とする整数テクスチャ(またはGL_EXT_texture_integer
拡張ですが、ハードウェアのサポートはおそらくGL3を持つ可能性があります)です。したがって、テクスチャの場合、実際の整数の内部形式を使用する必要があります。通常の固定小数点フォーマット(たとえば、16ビット精度の正規化された[0,1]カラーの場合はGL_R16
など)とは異なり、GL_R16UI
(1成分の16ビット符号なし整数の場合)です。
次に、シェーダでは、整数サンプラタイプを使用する必要があります。実際にあなたのtexture
やtexelFetch
呼び出しからの符号なし整数を取得するための符号なし整数の2Dテクスチャのためのusampler2D
(同様にisampler...
署名バリアント用):
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;
あなたはビット操作を行う方法を尋ねていますか? –
GLSL 1.3(OpenGL 3.0)ではビット操作が可能ですが、GLSLのテクスチャから生のintを読み取る方法がわかりません... Texture2Dはfloat vec4を返します –
@NicolBolas:わたし。私はあまりそれをしていないので、私は確信していませんでした。 GLSLがそれをサポートしていれば、どこでそれを学ぶべきかを理解することができます。 –