WebGLはビット単位の操作をサポートしていません。そこで、私はint
を一律float
に変換します。次に、各バイトを抽出するために、除算とmodを使用します。WebGL GLSLで4バイトのInt Uniformの各バイトをアンパックする方法は?
ただし、精度の問題から、int
が大きすぎると、int
からfloat
への変換で精度が失われます。これに対処するエレガントなソリューションはありますか?私の考えは、私の4バイトのint
ユニフォームに3バイトしか格納していません。
WebGLはビット単位の操作をサポートしていません。そこで、私はint
を一律float
に変換します。次に、各バイトを抽出するために、除算とmodを使用します。WebGL GLSLで4バイトのInt Uniformの各バイトをアンパックする方法は?
ただし、精度の問題から、int
が大きすぎると、int
からfloat
への変換で精度が失われます。これに対処するエレガントなソリューションはありますか?私の考えは、私の4バイトのint
ユニフォームに3バイトしか格納していません。
あなたがしたいことは100%明確ではありません。まず、32ビット浮動小数点には23ビットの仮数があることに気付きます。これは3バイト未満です。また、fp16や8.8の固定小数点のように、シェーダの精度が劣る可能性があります。あなたの質問への答えは次のとおりです。No.
ロウエンドのシェーダでintを使用する理由を考えてみましょう。通常、modトリックは、float値をrgbaバイトのテクスチャまたはフレームバッファにパック(およびアンパック)するために使用されました。
制服の場合は意味がありません。シェーダは依然として低い(フロート)精度で実行されます。だから、あなたがする数学は23bits以下で動くでしょう。そして、あなたはフロート制服としてそれを供給することができます。
1バイトの配列をGPUに渡したいが、WebGLは1バイトのユニフォームをサポートしていない。だから私はそれを4バイトのユニフォームにパックし、シェーダーで解凍したいと思っています。 –
そのままフロートとして渡してください。それがバイト数が多い場合は、それをテクスチャとして渡します。あなたはfloatの制服ごとに2バイトを渡すことができますが、私は本当にそれに依存しません。浮動小数点数はわずか23ビットの仮数しかないので、正確に2バイトを超えることはできません。 – starmole