2013-02-19 7 views
9

OpenGLとGLSLを使用してオクトリートラバーサル方式を実装しようとしており、データをテクスチャに保持したいと考えています。テクスチャデータ(浮動小数点数やさまざまなサイズの整数)には大きな選択肢がありますが、ビットをより正確に制御してより効率的でコンパクトな格納を実現する方法があるかどうかはわかりません。これはOpenGLとGLSLに適用するだけでなく、一般的な問題かもしれません。GLSLのテクスチャビットを正確に制御

単純なおもちゃの例として、16ビット整数を含むテクセルがあるとします。私はこのテクセルにそれぞれ1ビットの2つのブール値、1つの10ビットの整数値、次に4ビットの整数値をエンコードしたいと思います。テクスチャを作成するときにこれをエンコードし、GLSLシェーダを使用してテクスチャをサンプリングするときにこれらのコンポーネントをデコードするテクニックはありますか?

編集:私はビット操作技術を実際に探しているように見えます。彼らはサポートされているようだから、もう少し調べてみるとうまくいくはずです。

+0

あなたはビット操作を行う方法を尋ねていますか? –

+0

GLSL 1.3(OpenGL 3.0)ではビット操作が可能ですが、GLSLのテクスチャから生のintを読み取る方法がわかりません... Texture2Dはfloat vec4を返します –

+0

@NicolBolas:わたし。私はあまりそれをしていないので、私は確信していませんでした。 GLSLがそれをサポートしていれば、どこでそれを学ぶべきかを理解することができます。 –

答えて

3

GLSLシェーダ内の整数とビット操作は、OpenGL 3以降でサポートされています(これにより、DX10クラスのハードウェア上に表示されます)。だから、シェーダーの内部でこのビットの管理を自分で行うことができます。

しかし、整数を使って作業することは、テクスチャから取り除くことのもう一つです。標準のOpenGLテクスチャ形式は、floatを直接(GL_R16Fのように)格納するか、または固定小数点値をGL_R16のように正規化して格納していますが、それ以外の場合はtexturetexelFetchまたはどんなものでも)シェーダの値を浮かせます。内部的に保存された整数の元のビットパターンを簡単に、または確実に推論することはできません。

OpenGL 3を必要とする整数テクスチャ(またはGL_EXT_texture_integer拡張ですが、ハードウェアのサポートはおそらくGL3を持つ可能性があります)です。したがって、テクスチャの場合、実際の整数の内部形式を使用する必要があります。通常の固定小数点フォーマット(たとえば、16ビット精度の正規化された[0,1]カラーの場合はGL_R16など)とは異なり、GL_R16UI(1成分の16ビット符号なし整数の場合)です。

次に、シェーダでは、整数サンプラタイプを使用する必要があります。実際にあなたのtexturetexelFetch呼び出しからの符号なし整数を取得するための符号なし整数の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; 
+0

こんにちは、glTexImage2Dが私のためにエラーを返しています。どうぞご覧ください。 http://stackoverflow.com/questions/21625709/jogl-creating-only-red-channel-u16-but-getting-texture-type-and-format-combina – elect

関連する問題