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

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

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

#1

投稿記事 by hashBrown » 6年前

洞窟の中での光を表すときに、光源が一つだけならば乗算ブレンドを使ってうまく表現をすることができました。

コード:

//背景画像(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]

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

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#2

投稿記事 by ISLe » 6年前

これでいかがでしょう。

コード:

//背景画像(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);

hashBrown

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

#3

投稿記事 by hashBrown » 6年前

ISLe 様

ありがとうございます!

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

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

返信

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