gpt4 book ai didi

floating-point - 将 rgb 值解码为单个 float ,无需在 glsl 中进行位移

转载 作者:行者123 更新时间:2023-12-04 13:07:31 26 4
gpt4 key购买 nike

我目前正忙于 webgl 中的延迟着色,我需要将 3 个整数值(在 [0..256] = 256^3 范围内)解码为单个 32 位浮点数并稍后对其进行编码。因为这是针对 WebGL 的,所以它必须在没有按位运算的情况下完成。精度对我来说并不重要(但我认为可以实现)。

这就是我所拥有的,但我认为这是错误的,因为我存储编码值的纹理的精度。

float packColor(vec3 color) {   return (color.r + (color.g*256.) + (color.b*256.*256.)) / (256.*256.*256.); }

vec3 decodeColor(float f) {
float b = floor(f * 256.0);
float g = floor(f * 65536.0) - (b*256.);
float r = (floor(f * 16777216.0) - (b*65536.)) - (g*256.);
return vec3(r, g, b)/ 256.0;//vec3(r, g, b) / 256.0; }

谢谢..

最佳答案

我知道这是一个老问题,但我遇到了同样的问题,如果将来有人需要,我会发布解决方案

float packColor(vec3 color) {
return color.r + color.g * 256.0 + color.b * 256.0 * 256.0;
}

vec3 unpackColor(float f) {
vec3 color;
color.b = floor(f / 256.0 / 256.0);
color.g = floor((f - color.b * 256.0 * 256.0) / 256.0);
color.r = floor(f - color.b * 256.0 * 256.0 - color.g * 256.0);
// now we have a vec3 with the 3 components in range [0..255]. Let's normalize it!
return color / 255.0;
}

只要用 packColor 填充的浮点数不在 [0, 1] 范围内,而是在 [0, 16777215] 范围内,您就不应该有任何精度问题。但是,如果您将 [0,1] 范围内的浮点数标准化,则会出现精度问题!

请注意,您也不能存储 alpha(以这种方式),因为 highp 浮点数是 24 位长,而不是通常使用的 32 位长。
在顶点着色器中,您可以毫无问题地使用此代码(默认精度为 highp),但在片段着色器中,您必须确保只使用高精度!

关于floating-point - 将 rgb 值解码为单个 float ,无需在 glsl 中进行位移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com