9-Laboratory

GPU HACKS!

21.11.2009 (11:10 am) – Filed under: temp ::

メモ。
Direct3D GPU HacksLost in the triangles
Intel(チップセット)が全部?になっているのが笑える。

RGBA⇔float2

04.11.2009 (12:12 pm) – Filed under: temp ::

何かに需要があるかもしれないので、書く。
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