DirectXのスポットライトを強烈に光らせたい

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

DirectXのスポットライトを強烈に光らせたい

#1

投稿記事 by k-big » 7年前

件名の通りなんですがDirectXで使うスポットライトを強く光らせたいです。
もうオブジェクトが白飛びしてしまうくらいにできないでしょうか?
例えば以下の項目のどこをいじれば光り方自体の強さを変えれるでしょうか?
色々弄っても元々のオブジェクトのテクスチャの明るさ以上になりません。
Diffuse;
Specular;
Ambient;
Position;
Direction;
Range;
Falloff;
Attenuation0;
Attenuation1;
Attenuation2;
Theta;
Phi;

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#2

投稿記事 by k-big » 7年前

すみません。一つ修正で「スポットライト」ではなくて「ポイントライト」です。
スポットでもポイントでもディレクショナルでも全部強烈に光らせたいです。

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#3

投稿記事 by Egg » 7年前

まったく色が変化しないとのことですが、
SetUseLightingでライティングそのものを有効にしていますか?
またSetLightEnableで標準ライトを有効にしていますか?

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#4

投稿記事 by k-big » 7年前

>>Eggさん
返信ありがとうございます。
いえライト自体は光るのですが元々のテクスチャの色以上の明るさにして照らす事が出来ないんです…
というかそういう事はできないんでしょうか?
例えば真っ暗な画面に一つ青い背景(プリミティブ)を表示して
そこへポイントライトを照らしたとします。
すると元々の青までは明るくなるのですがそれ以上輝度を上げる事が出来ない感じです。
例えば輝度を上げていくと、水色→薄水色→まっしろ、という具合にプリミティブの色が変化すると思うのですが
ライティングの設定でそのように輝度を調整する事は可能なのかが知りたいんです。
よろしければご教示頂ければ幸いです。

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#5

投稿記事 by Egg » 7年前

ライトのDiffuseやSpecularを1.0fよりも大きな値にしても白とびしませんか?
白とびしないなら、DxLib側で1.0fを最大値としてクランプしてしまっている可能性があります。
もしそのような実装なのであれば、ピクセルシェーダーで自前で計算を行って白とびさせるしかないですね。

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#6

投稿記事 by k-big » 7年前

>>Eggさん
スペキュラハイライトの値を弄って有効化したら真ん中に白飛びした光ができました!
ただ凄く小さいのでもうちょっと弄っていってみます。
ディフューズの方は弄っても変化はないんですよねえ…
スペキュラがやっぱり必要だったんでしょうかね。 もうちょっと弄ってみます。ありがとうございます。

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#7

投稿記事 by k-big » 7年前

でもやっぱりスペキュラの値では違うんですよねえ…
こういう強烈なハイライトが一点にできるという感じじゃなくて
例えばフォトショップであった照明効果のようなあんな感じで
自然と光の強さを強めて全体的に明るくする感じに出来ればいいんですが…
そして最高に強めたら照明が当たっている部分が全体的に白飛びするような。
スペキュラの場合は強いハイライトがボン!っと出てしまうので自然に明るく出来ない感じがします。
ディフューズ色ではどうしても元の色までしか明るくなりませんね…
何か設定が悪いのかな…

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#8

投稿記事 by Egg » 7年前

シェーダーの勉強をしてください。
固定機能では正直限界があります。

おっしゃってるのはHDRという技術だと思われます。
http://qiita.com/YVT/items/4e7661586a6dca7e55dc

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#9

投稿記事 by k-big » 7年前

>>Eggさん
そうですかあ。固定機能だけだとこういう事にも限界があるんですか…
色々理由があってシェーダが使えないので別の方法を模索するしかなさそうです…
うーん。光用の画像を用意しておいて特殊な乗算でブレンドするとかしたら
ある程度それっぽく見えるかもしれません。とりあえず色々頑張ってみます。
ありがとうございました!

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#10

投稿記事 by Egg » 7年前

ゲームのロジック部分はほとんどシェーダなしでもできますが
ゲームエフェクトは少し凝ろうとするとシェーダを使う羽目になります。
光と影、色関係は特にです。



k-big

Re: DirectXのスポットライトを強烈に光らせたい

#13

投稿記事 by k-big » 7年前

>>Eggさん、>>ISLeさん
お二人とも、ありがとうございます。
紹介して頂いたものを参考にしながら色々と頑張ってみたいと思います。
あと一応、元のテクスチャを明るめに作っておいて
アンビエントを抑え気味にしてから、各スポットライト等で照らしてみると少しマシになってきました。
色々工夫しながらやってみますね。

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#14

投稿記事 by Egg » 7年前

カプセル、テクスチャなし、標準ライト、マテリアル使用の条件で
試してみたところ、表面は白飛びしてると思いますが。

コード:

#include "DxLib.h"
#include <math.h>

const float pi = 3.1415926535f;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);

	// DXライブラリの初期化
	if (DxLib_Init() < 0)
	{
		// エラーが発生したら直ちに終了
		return -1;
	}

	// Zバッファを有効にする
	SetUseZBuffer3D(TRUE);

	// Zバッファへの書き込みを有効にする
	SetWriteZBuffer3D(TRUE);

	// 頂点データのディフューズカラーを使用しないようにする
	SetMaterialUseVertDifColor(FALSE);

	// 頂点データのディフューズカラーを使用しないようにする
	SetMaterialUseVertSpcColor(FALSE);

	// マテリアルのディフューズカラーを黄色にする
	MATERIALPARAM Material;
	Material.Diffuse = GetColorF(0.2f, 1.0f, 0.1f, 1.0f);
	Material.Specular = GetColorF(1.0f, 1.0f, 1.0f, 0.0f);
	Material.Ambient = GetColorF(0.0f, 0.0f, 0.0f, 0.0f);
	Material.Emissive = GetColorF(0.0f, 0.0f, 0.0f, 0.0f);
	Material.Power = 20.0f;
	SetMaterialParam(Material);

	float theta = 0.0f;

	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		// 画面を初期化
		ClearDrawScreen();

		theta += 1.0f;

		// 標準ライトのディフューズカラーを青色にする
		SetLightDifColor(GetColorF(10.0f * sinf(2.0f * pi / 360.0f * theta), 10.0f * sinf(2.0f * pi / 360.0f * theta), 10.0f * sinf(2.0f * pi / 360.0f * theta), 0.0f));

		// カプセルの描画
		DrawCapsule3D(VGet(320.0f, 100.0f, 0.0f), VGet(320.0f, 300.0f, 0.0f), 40.0f, 8, 0, 0, TRUE);

		// 裏画面の内容を表画面に反映させる
		ScreenFlip();
	}

	// DXライブラリの後始末
	DxLib_End();

	// ソフトの終了
	return 0;
}
ほしいのがブルーム(強い輝きを見た時のぼやけ)ならISLeさんの貼っているリンクの方法使うのがいいでしょう。

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#15

投稿記事 by Egg » 7年前

白くさせるコツとしては
①光のDiffuse値を1.0よりも十分に大きな値にする
②マテリアルのDiffuse値のRGBを0.0fにはしない
です。

色の計算は、光の色 * 素材の色 * テクスチャの色をRGBそれぞれに行います。
いずれかのRGB値に0.0fが存在してしまうと、いくら光の強さを上げても
その値は0.0fになってしまいます。

例えば、マテリアルのRedを0.0fにすると
幾ら強い光を当てても、色の赤要素は1000.0f * 0.0f * 1.0f = 0.0fです。
よって、他の色が1.0fとなり緑と青の合成である水色にしかなりません。

ある要素を0.0fに設定するということはその要素に対してブラックホールの状態になっているということです。

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#16

投稿記事 by k-big » 7年前

>>Eggさん
コーディングまでして頂きありがとうございます。
一つだけ質問なのですがこれって単純なプリミティブ(板ポリ)にも同じような効果が現れますか?
自分はDxLibを使っておらず、詳しくわからないので、出来たら板ポリでも試して頂けますでしょうか?
それで可能なら自分のプログラムが悪いという事になると思いますので。

C6b14

Re: DirectXのスポットライトを強烈に光らせたい

#17

投稿記事 by C6b14 » 7年前

>DxLibを使っておらず
コードを見ただけでは、この珠玉のコードどんなものか分からないと思うので是非Dxlibを使って見て下さい。(みてビックリしました)
http://dixq.net/g/と、もしかしてhttp://dixq.net/forum/viewtopic.php?f=3&t=18420を参考にしてもらえばすぐ動かせます。

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#18

投稿記事 by Egg » 7年前

単なるクアッドですが、こうなりました。


Diffuseで光らせてるので光に対する向きによっては輝きが減ります。
どの向きでも単に光の強さだけ考慮して輝きを制御しようとすると少し工夫が必要でしょう。
例、一時的にライティングを切って、頂点カラーにライトの強さを考慮して計算した何らかの値を代入する。

あとDxLibでできることはDirectXではすべて実現可能です。

コード:

#include "DxLib.h"
#include <math.h>

const float pi = 3.1415926535f;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);

	// DXライブラリの初期化
	if (DxLib_Init() < 0)
	{
		// エラーが発生したら直ちに終了
		return -1;
	}

	// Zバッファを有効にする
	SetUseZBuffer3D(TRUE);

	// Zバッファへの書き込みを有効にする
	SetWriteZBuffer3D(TRUE);

	// 頂点データのディフューズカラーを使用しないようにする
	SetMaterialUseVertDifColor(FALSE);

	// 頂点データのディフューズカラーを使用しないようにする
	SetMaterialUseVertSpcColor(FALSE);

	// マテリアルのディフューズカラー
	MATERIALPARAM Material;
	Material.Diffuse = GetColorF(0.1f, 1.0f, 0.1f, 1.0f);
	Material.Specular = GetColorF(1.0f, 1.0f, 1.0f, 0.0f);
	Material.Ambient = GetColorF(0.0f, 0.0f, 0.0f, 0.0f);
	Material.Emissive = GetColorF(0.0f, 0.0f, 0.0f, 0.0f);
	Material.Power = 20.0f;
	SetMaterialParam(Material);

	// こちら向き、サイズ200x200の四角形
	VERTEX3D Quad[6];
	ZeroMemory(Quad, sizeof(VERTEX3D) * 6);

	Quad[0].pos = { -100.0f + 320.0f, 100.0f + 240.0f, 0.0f };
	Quad[0].norm = { -1.0f, 0.0f, 0.0f };
	Quad[1].pos = { 100.0f + 320.0f, 100.0f + 240.0f, 0.0f };
	Quad[1].norm = { -1.0f, 0.0f, 0.0f };
	Quad[2].pos = { -100.0f + 320.0f, -100.0f + 240.0f, 0.0f };
	Quad[2].norm = { -1.0f, 0.0f, 0.0f };
	Quad[3].pos = { -100.0f + 320.0f, -100.0f + 240.0f, 0.0f };
	Quad[3].norm = { -1.0f, 0.0f, 0.0f };
	Quad[4].pos = { 100.0f + 320.0f, 100.0f + 240.0f, 0.0f };
	Quad[4].norm = { -1.0f, 0.0f, 0.0f };
	Quad[5].pos = { 100.0f + 320.0f, -100.0f + 240.0f, 0.0f };
	Quad[5].norm = { -1.0f, 0.0f, 0.0f };

	float theta = 0.0f;

	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		// 画面を初期化
		ClearDrawScreen();

		theta += 1.0f;

		// 標準ライトのディフューズカラー
		SetLightDifColor(GetColorF(10.0f * sinf(2.0f * pi / 360.0f * theta), 10.0f * sinf(2.0f * pi / 360.0f * theta), 10.0f * sinf(2.0f * pi / 360.0f * theta), 0.0f));

		// 四角の描画
		DrawPolygon3D(Quad, 2, DX_NONE_GRAPH, FALSE);

		// 裏画面の内容を表画面に反映させる
		ScreenFlip();
	}

	// DXライブラリの後始末
	DxLib_End();

	// ソフトの終了
	return 0;
}

Egg

Re: DirectXのスポットライトを強烈に光らせたい

#19

投稿記事 by Egg » 7年前

一つ言い忘れました。
ディレクショナルライトはそこまで問題ないのですが、
ポイントライトとスポットライトの場合ポリゴンの細やかさがライトの明るさに影響する可能性はあります。
というのも、DirectX9の固定機能のライティングは頂点ライティングだからです。

例えば、同じ四角形にポイントライトを当てても
その四角形が格子状にたくさんのポリゴンの集まりなのか、
単純に4つの頂点で構成された四角形なのかで、
明るさ反映度合が変わります。

ピクセル単位のライティングを行おうとすると、
普通の手段ではやはりシェーダーを使うしかないと思われます。

k-big

Re: DirectXのスポットライトを強烈に光らせたい

#20

投稿記事 by k-big » 7年前

>>C6b14 さん、>>Eggさん
お二方、ご返信ありがとうございます。
Eggさん、コードをまた書いて頂き感謝です。
ライトの方結構明るくできてる感じがしますね。
こんな感じでポイントライトでも自然に明るくできればいいのですが。
とりあえず自分でもDxLibを使ってみて教えて頂いたコードを色々と弄ってみたいと思います。
本当に感謝ですありがとうございます。

閉鎖

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