ほしい物ばかり


冬月 明日は冬月の23回目の誕生日となります
とうことで会社休むんでよろしく。
ってできないかなぁ。。。

いまだに
恋人もいないしねぇ。
冬月の両親って24で冬月を生んだんだよね?
冬華

こう思うと、父さん母さんはすごいです。
で、母の亡くなった日に滅多に話さない母との思い出を父が語ってくれたんですが
どうも、母方の両親に猛反対されていたところを押し切って結婚したらしいです。
いまでは、母がいなくなっても親族のつながりを切ることなく付き合ってくれています。

冬月 うーん冬月のDNAって残してOKなんでしょうか?
まずは、穂村有理みたいな恋人を探さないといけないのですが

…///

冬華

いやね、真田設子さんのようなお嬢様でも十分イイんですが、付き合うとしたら有理ですね。
二人で憎まれ口たたきながらイチャイチャしたいです。

冬月 で、誕生日プレゼントって事じゃないですが
1TBのHDDと外付けキットを購入しました
全部で6500なり。安すぎ。

HDDが4000円で安かったのですがいかんせんメーカーが
SAMSUNで、ちょっと心配です。
かつてHDDの中で比較的熱に弱いメーカーでオタクからは敬遠されていたようです
冬華

冬月 ぶっちゃけ、5GBのネットワークストレージさえ使いこなしてない冬月ですが、なぜ1TBと大容量のモノを買ったかといいますと
前に買った地上デジタルチューナーの外付けHDDの増設として買ったのです、が……
160GBのHDDがまだ容量が埋まってなかったのです。

実は、【これはゾンビですか】、【夢喰いメリー】、【ストライクウィッチーズ(再放送)】、【IS<インフィニット・ストラトス>
の予約録画を行っていてこの3週間見ることなく積みゲー化していて、地上デジタル&最高画質モードで録画しているのでもうそろそろ容量なくなるんじゃないかと思い込んでいたわけです

どうてもいいけど、
オタクになり始めた中学生ぐらいの勢いだね
ここ5年間ろくにアニメなんか見なかったのにどうしたの?
冬華

冬月 いやー今の、無関心の性格を直していこうと思っておりまして……
で、自分が上の中から期待しているのは【これはゾンビですか】です。
ギャグ系として捉えてます。

が、なぜか1話以外録画されてなかったオチ。
くそう、プレイヤー無いけどBluray買うぞコノヤロー

で、1TBのHDDどうするの?

冬華

冬月 コンセントも余ってないので(もともと4つしかなかったのをタコ足配線で現状維持してます)
当分放置プレイですね。

冬月 で、本題
1週間悩んでいたフェードが完成しました。
……かなり力技です。

最近、プログラムを勉強している人も見に来ているので
講座風にしていこうかと考えているそうです

冬華

フェードの処理の説明って意外にないんですよね。
あっても、黒く明度を買えるぐらいしか無いので……
ただ、冬月の方法は力技に近いのでパフォーマンス的にはあまりよろしく無いと思います

冬月
と、いうことで続きを読むからどぞー


冬月 まずおさらい。
冬月の野郎としているフェードはクロスフェードと呼ばれる2つの画像が切り替わるタイプのフェードです

こんな感じですね
ちなみに、コレ。PSPの画像です
プログラムをするメインPCには一切ゲーム入れてないからだそうです
冬華

冬月 で、このような変則的な動きのするフェードは
表示する元の画像と、白と黒で表現されたマスク画像で行います
……ってここに来ている人たちは知っていますよね。


左の画像が元画像、右がマスク画像です

で、マスク画像の色である黒は透明、白は不透明という情報が一般的ですね
そして、DirectXの色情報にはA(アルファ)R(赤)G(緑)B(青)の三色で表現されており
このマスク画像の情報をどうにかしてアルファ情報に変えればOKとなります。
冬華

こんな感じになります(黒いところは透明になった場所)

冬月 じゃあ、どうやってこのマスクの色を透明度として扱うのかといいますと
難しいことを考えず、マスク画像のRGBの色から平均をとってそれをとも画像のアルファとしてしまえばいいのです

ARGBの色の段階はそれぞれ256(0からなので実質的には255)段階で表現されます
そうして、黒はRGB=255,255,255で
白はRGB=0,0,0になります
それで、マスク画像っていうのは大体がRとGとBの数値が同じものになります。
(見た目では255,253,254とかでも十分黒くなりますが、プログラムで処理させるために切りの良い数字で行います)

透明度=(R + G + B )/ 3
ででます。小学校でやった平均を出す計算ですね。わかります。

冬月 さて、仕組みがわかったところでどうやってこれをプログラムにするか?
ここはさすがMICROSOFT。
画像の色成分を吐き出す関数が用意されています。




LPDIRECT3DTEXTURE9 tex;
D3DSURFACE_DESC desc;
D3DLOCKED_RECT rect;

//===============================================
//なんやかんや画像の登録処理をしてね
//===============================================

//テクスチャーをロックして色々いじれる状態にします
tex->GetLevelDesc(0, &desc);
tex->LockRect(0, &rect, NULL, D3DLOCK_READONLY);


冬月が初めて公に場にプログラムを書いたよ!ってことで
まず、呼び込んだ画像をロックして編集可能な状態にします
&rectっていうのに色情報系が&descに大きさの情報が入るっぽいです
冬華


//--------------------------------------------------------------------------------
//ピクセル分ループする
for(DWORD i = 0; i < desc.Height; i++){
for(int k = 0; k < rect.Pitch; k += 4){
//順番がBGRAになってますが、仕様らしいです。紛らわしい。
b1= *((BYTE*)rect.pBits + i * rect.Pitch + k + 0);				//元画像のb
g1= *((BYTE*)rect.pBits + i * rect.Pitch + k + 1);				//元画像のg
r1= *((BYTE*)rect.pBits + i * rect.Pitch + k + 2);				//元画像のr
a1= *((BYTE*)rect.pBits + i * rect.Pitch + k + 3);				//元画像のa
b2= *((BYTE*)mask_rect.pBits + i * mask_rect.Pitch + k + 0);	//マスク画像のb
g2= *((BYTE*)mask_rect.pBits + i * mask_rect.Pitch + k + 1);	//マスク画像のg
r2= *((BYTE*)mask_rect.pBits + i * mask_rect.Pitch + k + 2);	//マスク画像のr
a2= *((BYTE*)mask_rect.pBits + i * mask_rect.Pitch + k + 3);	//マスク画像のa
*((BYTE*)buff_rect.pBits + i * buff_rect.Pitch + k)		= (BYTE)(b1);	//新しく生成したものに元画像のbを代入してます
*((BYTE*)buff_rect.pBits + i * buff_rect.Pitch + k + 1)	= (BYTE)(g1);	//新しく生成したものに元画像のgを代入してます
*((BYTE*)buff_rect.pBits + i * buff_rect.Pitch + k + 2)	= (BYTE)(r1);	//新しく生成したものに元画像のrを代入してます
//--------------------------------------------------------------------------------
//透明度設定
in_alpha_2 = (int)((b2 + g2 + r2) / 3);		//先程の計算式通りに平均をとっています
in_alpha_2 += alpha_num;					//フェード処理なので外部からのアルファ値もここにいれてます
//普通のアルファ合成
if(alpha_type == ALPHA_GRADATION){
//BYTE型なので0~255までしかありませんがオーバーフローしないように計算します
if(in_alpha_2 < 0){
in_alpha = 0;
}
else if(in_alpha_2 > 255){
in_alpha = 255;
}
else{
in_alpha = (BYTE)in_alpha_2;
}
}
//段階的なアルファ合成
else{
if(in_alpha_2 >= 255){
in_alpha = 255;
}
else{
in_alpha = 0;
}
}
//計算したアルファ情報の代入
*((BYTE*)buff_rect.pBits + i * buff_rect.Pitch + k + 3)	= in_alpha;
}
}
//ロック解除
tex->UnlockRect(0);



インデントがズレてるのは気にしないでください。
ソースをコピーアンドペーストしただけですので……

冬月 めんどくさいのでソース丸々コピーです
やっていることは簡単で2つの画像から色情報を抜き出して新たに作ったテクスチャーに
元画像の色情報をそのままRGBへ、マスク画像の色情報はアルファに代入しています

新しく3枚目の画像を作ってそこに結果を反映させているのは
もとの2つの画像の情報を変更させたくなかったからです
今回のようにアルファ値を動的に変化さsる時、いちいち元の画像に戻すのは大変なので最初から変更する為のテクスチャを用意しました
冬華

冬月 ここからは普通に表示するだけです(アルファブレンドを有効にすることは忘れないでね
ふぇぇ、こんなことに2週間悩むとは……

フェード→動画→タイトルの遷移です
というよりも、現状ここまでしかできてません
3Dマップはもうちょっとかかります。
冬華

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。
冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。
※メールアドレスは公開されることは有りません。


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

ゲーム製作の関連記事