opengl-es - 如何在 float 和 vec4、vec3、vec2 之间进行转换?

标签 opengl-es webgl glsles

这个问题与这里的问题(How do I convert a vec4 rgba value to a float?)非常相关。

已经有一些与此问题相关的文章或问题,但我想知道大多数文章都没有确定哪种类型的 float 值。
只要我能想出,下面有一些 float 值打包/解包公式。

  • 无符号标准化浮点数
  • 带符号的标准化浮点数
  • 带符号的范围浮点数(我可以找到范围限制的浮点值)
  • 无符号范围浮点数
  • 无符号浮点数
  • 签名 float

  • 然而,这些实际上只是两种情况。其他包装/拆包可以通过这两种方法处理。
  • 无符号范围浮点数(我可以通过简单的位移来打包/解包)
  • 签名 float

  • 我也想将带符号的浮点值打包和解包到 vec3 或 vec2 中。

    对于我的情况, float 值不能保证被标准化,所以我不能使用简单的位移方式。

    最佳答案

    如果您知道要存储的值的最大范围,例如 +5 到 -5,那么最简单的方法就是选择将该范围转换为从 0 到 1 的值。将其扩展为您拥有的位数,然后然后把它分成几部分。

    vec2 packFloatInto8BitVec2(float v, float min, float max) {
       float zeroToOne = (v - min) / (max - min);
       float zeroTo16Bit = zeroToOne * 256.0 * 255.0;
       return vec2(mod(zeroTo16Bit, 256.0), zeroTo16Bit / 256.0);
    }
    

    把它放回去,你做相反的事情。组装零件,除以返回到 zeroToOne 值,然后按范围扩展。
    float unpack8BitVec2IntoFloat(vec2 v, float min, float max) {
       float zeroTo16Bit = v.x + v.y * 256.0;
       float zeroToOne = zeroTo16Bit / 256.0 / 255.0;
       return zeroToOne * (max - min) + min;
    }
    

    对于 vec3 只需扩展它
    vec3 packFloatInto8BitVec3(float v, float min, float max) {
       float zeroToOne = (v - min) / (max - min);
       float zeroTo24Bit = zeroToOne * 256.0 * 256.0 * 255.0;
       return vec3(mod(zeroTo24Bit, 256.0), mod(zeroTo24Bit / 256.0, 256.0), zeroTo24Bit / 256.0 / 256.0);
    }
    
    float unpack8BitVec3IntoFloat(vec3 v, float min, float max) {
       float zeroTo24Bit = v.x + v.y * 256.0 + v.z * 256.0 * 256.0;
       float zeroToOne = zeroTo24Bit / 256.0 / 256.0 / 256.0;
       return zeroToOne * (max - min) + min;
    }
    

    关于opengl-es - 如何在 float 和 vec4、vec3、vec2 之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486775/

    相关文章:

    android - GameMaker Studio,GLSL ES 着色器,Android 上的不同结果

    java - 为什么我的着色器中的 GLSL 纹理坐标不是线性的?

    javascript - 如何清除 WebGL 中的矩形区域?

    javascript - 如何在WebGL中本质上 "Chroma Key"?

    webgl - 如果片段着色器不支持高精度,带有 `varying` 限定符的顶点着色器 `highp` 变量会发生什么情况?

    c++ - ivec4 作为顶点属性 Opengl ES 2.0

    android - 旋转 Open GL 顶点数组中的单个多边形?

    iphone - 如何创建高分辨率的离屏片段着色器?

    iphone - "Could not load the kernel"启动相机 session 并尝试进行一些实时图像过滤

    javascript - WebGL 绘制循环和翻译