ページ 11

暗闇の中での光源が複数ある場合

Posted: 2018年2月19日(月) 12:27
by hashBrown
洞窟の中での光を表すときに、光源が一つだけならば乗算ブレンドを使ってうまく表現をすることができました。

コード:

//背景画像(640×480)
int test = LoadGraph("test.png");
//背景と同じサイズで、白から黒に円形でグラデーションしている画像
int mul = LoadGraph("mul.png");

DrawGraph(0, 0, test, TRUE);

SetDrawBlendMode(DX_BLENDMODE_MUL, 255);
DrawGraph(0, 0, mul, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
しかし、例えば光源が二つあってその光同士が重なり合う場合、この方法では思い通りの結果を得られませんでした
[code = Cpp]
//背景画像(640×480)
int test = LoadGraph("test.png");
//背景と同じサイズで、白から黒に円形でグラデーションしている画像
int mul = LoadGraph("mul.png");

DrawGraph(0, 0, test, TRUE);

SetDrawBlendMode(DX_BLENDMODE_MUL, 255);
DrawGraph(0, 0, mul, TRUE);
DrawGraph(320, 0, mul, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
[/code]

光源が複数あって、それらが重なり合う場合はどうすればうまくいくでしょうか?

Re: 暗闇の中での光源が複数ある場合

Posted: 2018年2月20日(火) 17:36
by ISLe
これでいかがでしょう。

コード:

//背景画像(640×480)
int test = LoadGraph("test.png");
//背景と同じサイズで、白から黒に円形でグラデーションしている画像
int mul = LoadGraph("mul.png");
// グラデーション画像の合成用スクリーン
int handle = MakeScreen(640, 480, FALSE);


// グラデーション画像をオフスクリーンで合成
SetDrawScreen(handle); // 合成用オフスクリーンを描画対象に
ClearDrawScreen();
SetDrawBlendMode(DX_BLENDMODE_ADD, 255);
DrawGraph(0, 0, mul, TRUE);
DrawGraph(320, 0, mul, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

SetDrawScreen(DX_SCREEN_BACK); // 表示用スクリーンを描画対象に
DrawGraph(0, 0, test, TRUE);
// 合成したグラデーション画像を表示用スクリーンに乗算
SetDrawBlendMode(DX_BLENDMODE_MUL, 255);
DrawGraph(0, 0, handle, TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

Re: 暗闇の中での光源が複数ある場合

Posted: 2018年2月20日(火) 20:34
by hashBrown
ISLe 様

ありがとうございます!

色んなブレンドを組み合わせてみたり、マスクを使ってみたりとずっと悩んでいたのですが、解決しました!

MakeScreenを使えば複数の画像をブレンドして、それでできたグラフィックを一枚の画像として描画することができるのですね。