javascript - 你如何在 glsl/webgl 中将一个 32 位的整数打包成 4 个、8 位的整数?

标签 javascript webgl glsl glsles

我希望并行化一些复杂的数学运算,而 webgl 看起来是实现它的完美方式。 问题是,您只能从纹理中读取 8 位整数。 理想情况下,我希望从纹理中获取 32 位数字。 我想到了使用 4 个颜色 channel 来获得每像素 32 位,而不是 4 乘以 8 位。

我的问题是,glsl 没有“%”运算符或任何按位运算符!

长篇大论: 如何使用 glsl 中的运算符将 32 位数字转换为 4 个 8 位数字。

有关该技术的一些额外信息(使用按位运算符):

How to store a 64 bit integer in two 32 bit integers and convert back again

最佳答案

您可以通过乘/除以 2 的幂来进行位移。

正如评论中指出的,我最初发布的方法有效但不正确,here's one by 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);
}

关于javascript - 你如何在 glsl/webgl 中将一个 32 位的整数打包成 4 个、8 位的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453302/

相关文章:

javascript - 使用 webpack 2 拆分 "vendor" block

javascript - 为什么这个正则表达式输出不正确?

javascript - Node Express JS - 处理对服务器的同时 POST 请求

javascript - WebGL 渲染到纹理 - 如何将数据写入 Alpha channel ?

javascript - 纹理是将音频数据传输到 GLSL 的唯一方法吗?

javascript - 如何在 jquerymobile 中使图像适合按钮

javascript - 三.JS和WebGL纹理自动调整大小

javascript - webgl 读取像素未返回正确的值

c++ - 在 OpenGL 中使用自定义顶点数的几何着色器输入?

c++ - OpenGL 着色器拒绝链接