RGBA⇔float2
何かに需要があるかもしれないので、書く。
HLSL上でfloat2⇔float4変換を行う。float2もfloat4も要素の精度はどちらも32bit。しかしfloat4はR8G8B8A8形式に落とすと、結局8bit精度しかない。float2をいい感じにfloat4の各要素に分散させてfloat2の精度を16bitに保たせるのが目標。やりかたとしては、8bit精度での丸め誤差分をもう一つの要素に格納させる。
/**
float2をRGBAに変換する。
float2.x ⇒ float4.x,float4.y, float2.y ⇒ float4.z,float4.w
*/
float4 F2ToRGBA( float2 value )
{
float4 result;
result.yw = modf( value * 256.0f, result.xz );
result.xz *= 0.00390625f;
return result;
}
/**
RGBAをfloat2に戻す
float4.x,float4.y ⇒ float2.x, float4.z,float4.w ⇒ float2.y
*/
float2 RGBAToF2( float4 value )
{
return float2(
value.x + value.y * 0.00390625f
value.z + value.w * 0.00390625f );
}
※float2の要素は[0.0f,1.0f]であることを仮定している。
※本当に16bit分あるのかはよくわからないけど。
#G16R16Fとか、使えるんならそれを使うに越したことないけれど。
追記:0.5fを超えると動かないみたいです。ちょっと原因がわかりません….orz