http://hakuhin.hp.infoseek.co.jp/main/a ... TER_EFC_03
このURLにあるブラー処理をDXLibで実現したいと考えているのですが、分からない部分が多く困っています。
よろしければご助言下さい。ソースはFlashのコードで書かれているようです。大きな問題点は2点あります。
1.具体的にどのような処理を行っているのかが分からない。
説明によると、前フレームの画面をコピーしておいて、座標や角度をずらしてアルファブレンディングしている、というようなことが書かれていますが…。スケーリングと座標移動をしている?
2.DXLibでどのようにこの処理を実装すればよいのか分からない。
出来れば2Dで実装したいと思っているのですが、3Dの行列演算を使った方が容易に実現出来るでしょうか?
未だ普通に画像を表示する程度しか出来ず、ブレンドや画像処理について今後理解を深めたいと思っております。至らない点が多いですがどうぞよろしくお願いいたします。
ブラー処理について
Re:ブラー処理について
>具体的にどのような処理を行っているのかが分からない
解説の通りなので、あまり補足することもないのですが、
前のフレームの絵を位置をずらした上で半透明で重ねると、
重ねた絵が次のフレームでさらに重なります。
これが連続するとあちらのページにあるようなエフェクトになります。
>スケーリングと座標移動をしている
あちらのコードを見る限りしていますね。
描画オフセット用行列をセットしているとことがそうです。
>DXLibでどのようにこの処理を実装すればよいのか分からない
簡単なサンプルです。
[color=#d0d0ff" face="monospace"><hr width="50%" align="left" color="#101010]
#include "DxLib.h"
struct BlurScreen
{
int screen[2];
int current;
int alpha;
int screenWidth, screenHeight;
int offsetX1, offsetX2, offsetY1, offsetY2;
};
void InitBlurScreen(BlurScreen *blur, int alpha,
int offsetX1, int offsetY1, int offsetX2, int offsetY2)
{
if(!blur) return;
int depth;
GetScreenState(&blur->screenWidth, &blur->screenHeight, &depth);
for(int n=0; n<2; ++n)
blur->screen[n] = MakeScreen(blur->screenWidth, blur->screenHeight);
blur->current= 0;
blur->alpha = alpha;
blur->offsetX1 = offsetX1;
blur->offsetX2 = offsetX2;
blur->offsetY1 = offsetY1;
blur->offsetY2 = offsetY2;
}
void DestroyBlurScreen(BlurScreen *blur)
{
if(!blur) return;
for(int n=0; n<2; ++n)
DeleteGraph(blur->screen[n]);
}
void PreRenderBlurScreen(BlurScreen *blur)
{
if(!blur) return;
SetDrawScreen(blur->screen[blur->current]);
ClearDrawScreen();
}
void PostRenderBlurScreen(BlurScreen *blur)
{
if(!blur) return;
int drawMode = GetDrawMode();
SetDrawMode(DX_DRAWMODE_BILINEAR);
int brendMode, blendParam;
GetDrawBlendMode(&brendMode, &blendParam);
SetDrawBlendMode(DX_BLENDMODE_ALPHA, blur->alpha);
DrawExtendGraph(
blur->offsetX1, blur->offsetY1,
blur->screenWidth+blur->offsetX2,
blur->screenHeight+blur->offsetY2,
blur->screen[1 - blur->current], FALSE);
SetDrawBlendMode(brendMode, blendParam);
SetDrawMode(drawMode);
SetDrawScreen(DX_SCREEN_BACK);
DrawGraph(0, 0, blur->screen[blur->current], FALSE);
blur->current = 1 - blur->current;
}
[/color]
続きます。
Re:ブラー処理について
[color=#d0d0ff" face="monospace]
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return 0;
SetDrawScreen( DX_SCREEN_BACK );
BlurScreen blur;
InitBlurScreen(&blur, 240, -2, -2, 2, 2);
while(!ProcessMessage())
{
PreRenderBlurScreen(&blur);
DrawBox(100, 100, 200, 200, GetColor(255, 180, 255), TRUE);
DrawBox(270, 190, 370, 290, GetColor(255, 255, 255), TRUE);
DrawBox(440, 280, 540, 380, GetColor(255, 255, 180), TRUE);
PostRenderBlurScreen(&blur);
ScreenFlip();
}
DestroyBlurScreen(&blur);
DxLib_End();
return 0;
}
[/color]
こんなかんじでしょうか。
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return 0;
SetDrawScreen( DX_SCREEN_BACK );
BlurScreen blur;
InitBlurScreen(&blur, 240, -2, -2, 2, 2);
while(!ProcessMessage())
{
PreRenderBlurScreen(&blur);
DrawBox(100, 100, 200, 200, GetColor(255, 180, 255), TRUE);
DrawBox(270, 190, 370, 290, GetColor(255, 255, 255), TRUE);
DrawBox(440, 280, 540, 380, GetColor(255, 255, 180), TRUE);
PostRenderBlurScreen(&blur);
ScreenFlip();
}
DestroyBlurScreen(&blur);
DxLib_End();
return 0;
}
[/color]
こんなかんじでしょうか。
Re:ブラー処理について
Justyさん
望外のサンプルコードまで提示していただき大変感謝いたします。ありがとうございました。
分かりやすくエレガントなコードで色々と勉強になりました。
またこちらの掲示板で質問させていただく機会があると思いますが、よろしくお願いいたします。
望外のサンプルコードまで提示していただき大変感謝いたします。ありがとうございました。
分かりやすくエレガントなコードで色々と勉強になりました。
またこちらの掲示板で質問させていただく機会があると思いますが、よろしくお願いいたします。