ブラー処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Athena

ブラー処理について

#1

投稿記事 by Athena » 15年前

http://hakuhin.hp.infoseek.co.jp/main/a ... TER_EFC_03

このURLにあるブラー処理をDXLibで実現したいと考えているのですが、分からない部分が多く困っています。
よろしければご助言下さい。ソースはFlashのコードで書かれているようです。大きな問題点は2点あります。

1.具体的にどのような処理を行っているのかが分からない。
説明によると、前フレームの画面をコピーしておいて、座標や角度をずらしてアルファブレンディングしている、というようなことが書かれていますが…。スケーリングと座標移動をしている?

2.DXLibでどのようにこの処理を実装すればよいのか分からない。
出来れば2Dで実装したいと思っているのですが、3Dの行列演算を使った方が容易に実現出来るでしょうか?

未だ普通に画像を表示する程度しか出来ず、ブレンドや画像処理について今後理解を深めたいと思っております。至らない点が多いですがどうぞよろしくお願いいたします。

Justy

Re:ブラー処理について

#2

投稿記事 by Justy » 15年前


>具体的にどのような処理を行っているのかが分からない

 解説の通りなので、あまり補足することもないのですが、
前のフレームの絵を位置をずらした上で半透明で重ねると、
重ねた絵が次のフレームでさらに重なります。

 これが連続するとあちらのページにあるようなエフェクトになります。



>スケーリングと座標移動をしている

 あちらのコードを見る限りしていますね。
 描画オフセット用行列をセットしているとことがそうです。



>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]

続きます。

Justy

Re:ブラー処理について

#3

投稿記事 by Justy » 15年前

[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]


 こんなかんじでしょうか。

Athena

Re:ブラー処理について

#4

投稿記事 by Athena » 15年前

Justyさん

望外のサンプルコードまで提示していただき大変感謝いたします。ありがとうございました。
分かりやすくエレガントなコードで色々と勉強になりました。

またこちらの掲示板で質問させていただく機会があると思いますが、よろしくお願いいたします。

閉鎖

“C言語何でも質問掲示板” へ戻る