11

I am working on a OpenGL ES 2.0 shader and I have tightly packed data e.g. three 5-bit unsigned integers within a block of two bytes. To unpack this data I obviously need bit-shifting, but this is not supported in OpenGL ES Shading Language (see page 29 http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf)

Consequently I perform a number of *2 and /2 operations to emulate bit shifting.

Does anyone know a more efficient/elegant way to do this? Is there a trick I am not aware of?

Thanks!

4

4 に答える 4

6

複数のシフトを実行している場合は、電源操作を使用できます。ビットシフトは 2 nによる乗算または除算であり、べき乗演算は複数の乗算または除算演算よりも読みやすいと思いますが、パフォーマンスについてはわかりません。これはよりエレガントなソリューションだと思いますが、おそらくより効率的なソリューションではありません。

于 2010-08-12T10:10:08.533 に答える
3

何をしているかによっては、これらのスレッドが役立つ場合があります。

GLSL: 単一のフロート リンクに法線をパックする

複数の float を 1 つの float 値 リンクにパックする

フロートをさまざまなビット深度ターゲットにパッキングします (スタック オーバーフローにより、新規ユーザーは 2 つを超えるリンクが許可されないため、OpenGL.org フォーラムを検索する必要があります)。

于 2011-09-08T05:32:47.990 に答える
1

私は OpenGL を使用したことがありませんが、最も効率的な方法は、環境でサポートされている場合、各タイプの 16 ビット ルックアップ テーブルです。起動時に一度テーブルにデータを入力する必要がありますが、これは非常に迅速です。タイプごとに個別のテーブルを使用することも、theTable[65536][3] などの 2 次元テーブルを使用することもできます。

于 2010-08-12T10:21:22.860 に答える
0

あなたの質問からはわかりませんが、&(bit-and) を使用できますよね? 次に、書くのはかなり速いはずです:

processing(variable & 11111); processing(variable & 1111100000); (...)

もちろん、これらのビットマスクは整数定数として保存する必要があります。

于 2010-12-01T18:31:54.170 に答える