作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题与这里的问题(How do I convert a vec4 rgba value to a float?)非常相关。
已经有一些与此问题相关的文章或问题,但我想知道大多数文章都没有确定哪种类型的 float 值。
只要我能想出,下面有一些 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);
}
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 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/
我是一名优秀的程序员,十分优秀!