【问题标题】:OpenGL: Convert RGBA to FloatOpenGL:将 RGBA 转换为浮点数
【发布时间】:2020-05-13 21:36:47
【问题描述】:

我已将浮点数编码到纹理中(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);
    }

我使用以下 sn-p (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)

这似乎是正确的,因为二进制表示匹配。

它似乎返回了溢出的值,很难说,唯一的调试方式是比较图片,但它肯定不是我期望它输出的。

【问题讨论】:

  • 您使用哪个代码将浮动打包到图像中?另外,使用浮点纹理不是更容易吗?
  • 注意 32 位浮点数不能代表所有 32 位整数值,它只有 24 位尾数
  • 为什么不直接在 GLSL 中使用浮点数?
  • @Vladislav 在着色玩具中?我不知道。你必须使用shadertoy吗? OpenGL 本身支持单通道浮动纹理就好了。
  • 也许这就是你需要的:stackoverflow.com/questions/18453302/…

标签: glsl webgl shader fragment-shader


【解决方案1】:

感谢@LJᛃ 将我推荐给这个answer,它就像魅力一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多