9

OpenGL と GLSL を使用して octree トラバーサル スキームを実装しようとしていますが、データをテクスチャに保持したいと考えています。テクスチャ データ (さまざまなサイズの浮動小数点数と整数) に使用するフォーマットには大きな選択肢がありますが、ビットをより正確に制御して、より効率的でコンパクトなストレージを実現する方法があるかどうかを判断するのに苦労しています。これは、OpenGL および GLSL に適用されるだけでなく、一般的な問題である可能性があります。

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

編集:私は実際にビット操作技術を探しているようです。サポートされているようですので、もう少し調べれば大丈夫なはずです。

4

1 に答える 1

4

GLSL シェーダー内の整数操作とビット操作は、OpenGL 3 以降でサポートされています (したがって、DX10 クラスのハードウェアにも存在します)。したがって、シェーダー内でこのビット操作を自分で行うことができます。

しかし、整数を操作することと、テクスチャからそれらを取得することは別のことです。標準の OpenGL テクスチャ形式 (慣れている可能性があります) は、float を直接保存するか ( のようにGL_R16F)、正規化された固定小数点値 ( のようGL_R16に、初心者にとっては実質的に整数です ;)) のいずれかですが、それらから読み取ると ( などを使用して) texturetexelFetch内部に格納された整数の元のビットパターンを簡単または確実に推測することはできません。

したがって、実際に使用する必要があるのは整数テクスチャであり、これには 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;
于 2013-03-19T10:05:44.337 に答える