我正在寻找并行化一些复杂的数学,WebGL看起来是完美的方法来做到这一点。问题是,你只能从纹理中读取8位整数。我希望从纹理中获得32位数字。我的想法是使用4个颜色通道来获得每像素32位,而不是4乘以8位。
我的问题是,GLSL没有“%”运算符或任何位运算符!
TLDR:如何使用glsl中的运算符将32位数字转换为4个8位数字。
关于该技术的一些额外信息(使用位运算符):
How to store a 64 bit integer in two 32 bit integers and convert back again
3条答案
按热度按时间fdx2calv1#
您可以通过乘以/除以2的幂来进行位移位。
正如在评论中指出的,我最初发布的方法是工作,但不正确的,here's one by Aras Pranckevičius,请注意,在后本身的源代码包含一个错别字,是HLSL,这是一个GLSL端口与错别字更正:
zxlwwiss2#
一般来说,如果你想把一个浮点数的有效数字打包成字节,你必须连续地提取有效数字的8位包并将其存储在一个字节中。
对预定义范围内的浮点数进行编码
为了将浮点值打包到4 * 8位缓冲区中,必须首先指定源值的范围。
如果你定义了一个值域[
minVal
,maxVal
],它必须Map到值域[0.0,1.0]:函数
Encode
将范围[0.0,1.0]内的浮点值打包为vec4
:函数
Decode
从vec4
中提取[0.0,1.0]范围内的浮点值:以下函数将浮点值打包并提取到[
minVal
,maxVal
]范围内:用指数编码浮点数
另一种可能性是将有效数字编码为RGB值的3 * 8位,并将指数编码为Alpha通道的8位:
请注意,由于标准的32位IEEE 754数只有24个有效位,因此将该数编码为3个字节完全足够。
另请参见How do I convert between float and vec4,vec3,vec2?
mklgxw1f3#
每个人在如何在WebGl中处理这样的事情上都是绝对正确的,但我想分享一个获取值的技巧。
假设你想对两个16位的值进行比较:
现在,当您在片段着色器中获取值时,您可以拾取数字进行操作:
这一点只是提醒你,你可以把同一块JavaScript内存当作不同的大小:
Uint16Array
和Uint8Array
(而不是尝试进行位移位并将其分解)。更新
为了响应更多细节的请求,该代码非常接近于直接从this code and explanation剪切/粘贴。
这个的确切用法可以在GitLab上的相应示例中找到(同一文件的两个部分)