20

私はいくつかの複雑な数学を並列化しようとしていますが、webgl はそれを行うのに最適な方法のようです。問題は、テクスチャから 8 ビット整数しか読み取れないことです。理想的には、テクスチャから 32 ビットの数値を取得したいと考えています。8 ビットの 4 倍ではなく、4 つのカラー チャネルを使用して 1 ピクセルあたり 32 ビットを取得するというアイデアがありました。

私の問題は、glsl に「%」演算子やビットごとの演算子がないことです!

TLDR: glsl の演算子を使用して、32 ビットの数値を 4 つの 8 ビットの数値に変換するにはどうすればよいですか。

テクニックに関する追加情報 (ビット単位の演算子を使用):

64 ビット整数を 2 つの 32 ビット整数に格納し、再度変換する方法

4

3 に答える 3

30

2 の累乗で乗算/除算することでビットシフトできます。

コメントで指摘されているように、私が最初に投稿したアプローチは機能していましたが、正しくありませんでした。これはAras Pranckevičius によるものです。投稿自体のソース コードにはタイプミスが含まれており、HLSL であることに注意してください。これは、タイプミスが修正された GLSL ポートです。

const vec4 bitEnc = vec4(1.,255.,65025.,16581375.);
const vec4 bitDec = 1./bitEnc;
vec4 EncodeFloatRGBA (float v) {
    vec4 enc = bitEnc * v;
    enc = fract(enc);
    enc -= enc.yzww * vec2(1./255., 0.).xxxy;
    return enc;
}
float DecodeFloatRGBA (vec4 v) {
    return dot(v, bitDec);
}
于 2013-08-26T23:49:04.930 に答える