OpenGL:将 RGBA 转换为浮点数
OpenGL: Convert RGBA to Float
我已将浮点数编码到纹理中(float32 的 4 个字节存储为 RBGA 值)。
现在我需要将它们解码回单个浮点数。
以下是我迄今为止尝试过的以及对我不起作用的方法:
float rgbaToFloat(vec4 rgba) {
uint r = uint(rgba.x*255.);
uint g = uint(rgba.y*255.);
uint b = uint(rgba.z*255.);
uint a = uint(rgba.w*255.);
return uintBitsToFloat((r << 24) | (g << 16) | (b << 8) | a);
}
我使用以下代码段 (python) 将浮点数打包到纹理图像中:
import numpy as np
data_flat = [...] #floats
dim = int(np.sqrt(len(data_flat))) + 1
image = np.zeros((dim, dim, 4), dtype='uint8')
for i, d in enumerate(data_flat):
image[i // dim, i % dim] = np.array([d], dtype=np.float32).view(np.uint8)
对于单个浮点值,它产生以下输出:
d = 0.06797099858522415;
np.array([d], dtype=np.float32).view(np.uint8)
>>> array([ 97, 52, 139, 61], dtype=uint8)
这似乎是正确的,因为二进制表示匹配。
似乎return溢出值,很难说,唯一的调试方式是比较图片,但这肯定不是我期望的输出。
多亏了@LJᛃ for referring me to this answer,它就像魅力一样。
我已将浮点数编码到纹理中(float32 的 4 个字节存储为 RBGA 值)。 现在我需要将它们解码回单个浮点数。
以下是我迄今为止尝试过的以及对我不起作用的方法:
float rgbaToFloat(vec4 rgba) {
uint r = uint(rgba.x*255.);
uint g = uint(rgba.y*255.);
uint b = uint(rgba.z*255.);
uint a = uint(rgba.w*255.);
return uintBitsToFloat((r << 24) | (g << 16) | (b << 8) | a);
}
我使用以下代码段 (python) 将浮点数打包到纹理图像中:
import numpy as np
data_flat = [...] #floats
dim = int(np.sqrt(len(data_flat))) + 1
image = np.zeros((dim, dim, 4), dtype='uint8')
for i, d in enumerate(data_flat):
image[i // dim, i % dim] = np.array([d], dtype=np.float32).view(np.uint8)
对于单个浮点值,它产生以下输出:
d = 0.06797099858522415;
np.array([d], dtype=np.float32).view(np.uint8)
>>> array([ 97, 52, 139, 61], dtype=uint8)
这似乎是正确的,因为二进制表示匹配。
似乎return溢出值,很难说,唯一的调试方式是比较图片,但这肯定不是我期望的输出。
多亏了@LJᛃ for referring me to this answer,它就像魅力一样。