3Dでシステムを作っているとこういう2D周りの処理が
めちゃくちゃめんどくさいと感じるのは自分だけ?
(影付きのAAFontを作成する方法)
αが半透明の部分をifで分けた。
多分本当はもっときれいなコーディング方法があると思うが・・・
一応はちゃんと表示されたのでメモとして記述。。。
// ps : 転送元サーフェイス
// pd : 転送先サーフェイス
// c : 今回の文字の色(32bit)
// AlphaTbl : 0x00 ~ 0xff
for( lockしたサーフェイスを走査 )
{
u32 base_alpha = pd[xx]>>24;
//--------------------------------------------------
// 転送先に何もない(0x00000000) => 通常描画
//--------------------------------------------------
if( base_alpha == 0 )
{
pd[xx++] = (u32)(c | (AlphaTbl[ps[x]]<<24));
}
//--------------------------------------------------
// 転送元に何もない => srcに描画無し
//--------------------------------------------------
else if( AlphaTbl[ps[x]] == 0 )
{
xx++;
}
//--------------------------------------------------
// 転送先と転送元に色情報がある => ブレンド
//--------------------------------------------------
else
{
long base_col = pd[xx];
float per1 = (float)AlphaTbl[ps[x]]/(float)0xff;
u32 c1_r = (c&0x00ff0000)>>16;
u32 c1_g = (c&0x0000ff00)>>8;
u32 c1_b = c&0x000000ff;
u32 c2_r = (base_col&0x00ff0000)>>16;
u32 c2_g = (base_col&0x0000ff00)>>8;
u32 c2_b = base_col&0x000000ff;
// 加算
u32 c_r = (u32)((float)c1_r*per1 + (float)c2_r*(1.0f-per1));
u32 c_g = (u32)((float)c1_g*per1 + (float)c2_g*(1.0f-per1));
u32 c_b = (u32)((float)c1_b*per1 + (float)c2_b*(1.0f-per1));
// 加算後はα=1.0fにする
pd[xx++] = (0xff<<24)|(c_r<<16)|(c_g<<8)|c_b;
}
}
↑なんでTABがちゃんと反映されないんだろう?
(DX8でDDS作成方法)
1. mssdk\bin\DXUtils\DxTex.exeを起動
2. File => Open で元画像を読み込む
3. File => Open Onto Alpha Channel でグレースケール画像を読み込む。
4. SaveAsでDDSファイルを作成
読み込みの際、画面が真っ黒になるときがあるが実機ではちゃんとでる。