做计算着色器的时候,发现mumu模拟器不支持 RWTexture2D<float4>格式,只支持RWTexture2D<float>。于是需要把颜色编码成float。在网上找到如下代码。
inline float4 EncodeFloatRGBA( float v ) {
float4 enc = float4(1.0, 255.0, 65025.0, 16581375.0) * v;
enc = frac(enc);
enc -= enc.yzww * float4(1.0/255.0,1.0/255.0,1.0/255.0,0.0);
return enc;
}
inline float DecodeFloatRGBA( float4 rgba ) {
return dot( rgba, float4(1.0, 1/255.0, 1/65025.0, 1/16581375.0) );
}
上面这方法在大多数情况下是正常的,但当rgba值为1时,EncodeFloatRGBA的返回值=0。(RGBA的范围是0~1)
原因在于frac函数是获取标量的小数部分,而当值为1时,整数部分1被丢弃了。
知道原因,那么就可以有多种解决方法:
1. 在DecodeFloatRGBA时乘以一个小于1近似1的值,例如254/256;让EncodeFloatRGBA的结果乘以这个值的倒数还原,例如256/254.
2. 无需精确还原的话,可以在frac前*254/256
1425

被折叠的 条评论
为什么被折叠?



