2017-06-30 16 views
0

WebGLはビット単位の操作をサポートしていません。そこで、私はintを一律floatに変換します。次に、各バイトを抽出するために、除算とmodを使用します。WebGL GLSLで4バイトのInt Uniformの各バイトをアンパックする方法は?

ただし、精度の問題から、intが大きすぎると、intからfloatへの変換で精度が失われます。これに対処するエレガントなソリューションはありますか?私の考えは、私の4バイトのintユニフォームに3バイトしか格納していません。

答えて

0

あなたがしたいことは100%明確ではありません。まず、32ビット浮動小数点には23ビットの仮数があることに気付きます。これは3バイト未満です。また、fp16や8.8の固定小数点のように、シェーダの精度が劣る可能性があります。あなたの質問への答えは次のとおりです。No.

ロウエンドのシェーダでintを使用する理由を考えてみましょう。通常、modトリックは、float値をrgbaバイトのテクスチャまたはフレームバッファにパック(およびアンパック)するために使用されました。

制服の場合は意味がありません。シェーダは依然として低い(フロート)精度で実行されます。だから、あなたがする数学は23bits以下で動くでしょう。そして、あなたはフロート制服としてそれを供給することができます。

+0

1バイトの配列をGPUに渡したいが、WebGLは1バイトのユニフォームをサポートしていない。だから私はそれを4バイトのユニフォームにパックし、シェーダーで解凍したいと思っています。 –

+0

そのままフロートとして渡してください。それがバイト数が多い場合は、それをテクスチャとして渡します。あなたはfloatの制服ごとに2バイトを渡すことができますが、私は本当にそれに依存しません。浮動小数点数はわずか23ビットの仮数しかないので、正確に2バイトを超えることはできません。 – starmole

関連する問題