DirectXのスポットライトを強烈に光らせたい
DirectXのスポットライトを強烈に光らせたい
件名の通りなんですがDirectXで使うスポットライトを強く光らせたいです。
もうオブジェクトが白飛びしてしまうくらいにできないでしょうか?
例えば以下の項目のどこをいじれば光り方自体の強さを変えれるでしょうか?
色々弄っても元々のオブジェクトのテクスチャの明るさ以上になりません。
Diffuse;
Specular;
Ambient;
Position;
Direction;
Range;
Falloff;
Attenuation0;
Attenuation1;
Attenuation2;
Theta;
Phi;
もうオブジェクトが白飛びしてしまうくらいにできないでしょうか?
例えば以下の項目のどこをいじれば光り方自体の強さを変えれるでしょうか?
色々弄っても元々のオブジェクトのテクスチャの明るさ以上になりません。
Diffuse;
Specular;
Ambient;
Position;
Direction;
Range;
Falloff;
Attenuation0;
Attenuation1;
Attenuation2;
Theta;
Phi;
Re: DirectXのスポットライトを強烈に光らせたい
すみません。一つ修正で「スポットライト」ではなくて「ポイントライト」です。
スポットでもポイントでもディレクショナルでも全部強烈に光らせたいです。
スポットでもポイントでもディレクショナルでも全部強烈に光らせたいです。
Re: DirectXのスポットライトを強烈に光らせたい
まったく色が変化しないとのことですが、
SetUseLightingでライティングそのものを有効にしていますか?
またSetLightEnableで標準ライトを有効にしていますか?
SetUseLightingでライティングそのものを有効にしていますか?
またSetLightEnableで標準ライトを有効にしていますか?
Re: DirectXのスポットライトを強烈に光らせたい
>>Eggさん
返信ありがとうございます。
いえライト自体は光るのですが元々のテクスチャの色以上の明るさにして照らす事が出来ないんです…
というかそういう事はできないんでしょうか?
例えば真っ暗な画面に一つ青い背景(プリミティブ)を表示して
そこへポイントライトを照らしたとします。
すると元々の青までは明るくなるのですがそれ以上輝度を上げる事が出来ない感じです。
例えば輝度を上げていくと、水色→薄水色→まっしろ、という具合にプリミティブの色が変化すると思うのですが
ライティングの設定でそのように輝度を調整する事は可能なのかが知りたいんです。
よろしければご教示頂ければ幸いです。
返信ありがとうございます。
いえライト自体は光るのですが元々のテクスチャの色以上の明るさにして照らす事が出来ないんです…
というかそういう事はできないんでしょうか?
例えば真っ暗な画面に一つ青い背景(プリミティブ)を表示して
そこへポイントライトを照らしたとします。
すると元々の青までは明るくなるのですがそれ以上輝度を上げる事が出来ない感じです。
例えば輝度を上げていくと、水色→薄水色→まっしろ、という具合にプリミティブの色が変化すると思うのですが
ライティングの設定でそのように輝度を調整する事は可能なのかが知りたいんです。
よろしければご教示頂ければ幸いです。
Re: DirectXのスポットライトを強烈に光らせたい
ライトのDiffuseやSpecularを1.0fよりも大きな値にしても白とびしませんか?
白とびしないなら、DxLib側で1.0fを最大値としてクランプしてしまっている可能性があります。
もしそのような実装なのであれば、ピクセルシェーダーで自前で計算を行って白とびさせるしかないですね。
白とびしないなら、DxLib側で1.0fを最大値としてクランプしてしまっている可能性があります。
もしそのような実装なのであれば、ピクセルシェーダーで自前で計算を行って白とびさせるしかないですね。
Re: DirectXのスポットライトを強烈に光らせたい
>>Eggさん
スペキュラハイライトの値を弄って有効化したら真ん中に白飛びした光ができました!
ただ凄く小さいのでもうちょっと弄っていってみます。
ディフューズの方は弄っても変化はないんですよねえ…
スペキュラがやっぱり必要だったんでしょうかね。 もうちょっと弄ってみます。ありがとうございます。
スペキュラハイライトの値を弄って有効化したら真ん中に白飛びした光ができました!
ただ凄く小さいのでもうちょっと弄っていってみます。
ディフューズの方は弄っても変化はないんですよねえ…
スペキュラがやっぱり必要だったんでしょうかね。 もうちょっと弄ってみます。ありがとうございます。
Re: DirectXのスポットライトを強烈に光らせたい
でもやっぱりスペキュラの値では違うんですよねえ…
こういう強烈なハイライトが一点にできるという感じじゃなくて
例えばフォトショップであった照明効果のようなあんな感じで
自然と光の強さを強めて全体的に明るくする感じに出来ればいいんですが…
そして最高に強めたら照明が当たっている部分が全体的に白飛びするような。
スペキュラの場合は強いハイライトがボン!っと出てしまうので自然に明るく出来ない感じがします。
ディフューズ色ではどうしても元の色までしか明るくなりませんね…
何か設定が悪いのかな…
こういう強烈なハイライトが一点にできるという感じじゃなくて
例えばフォトショップであった照明効果のようなあんな感じで
自然と光の強さを強めて全体的に明るくする感じに出来ればいいんですが…
そして最高に強めたら照明が当たっている部分が全体的に白飛びするような。
スペキュラの場合は強いハイライトがボン!っと出てしまうので自然に明るく出来ない感じがします。
ディフューズ色ではどうしても元の色までしか明るくなりませんね…
何か設定が悪いのかな…
Re: DirectXのスポットライトを強烈に光らせたい
シェーダーの勉強をしてください。
固定機能では正直限界があります。
おっしゃってるのはHDRという技術だと思われます。
http://qiita.com/YVT/items/4e7661586a6dca7e55dc
固定機能では正直限界があります。
おっしゃってるのはHDRという技術だと思われます。
http://qiita.com/YVT/items/4e7661586a6dca7e55dc
Re: DirectXのスポットライトを強烈に光らせたい
>>Eggさん
そうですかあ。固定機能だけだとこういう事にも限界があるんですか…
色々理由があってシェーダが使えないので別の方法を模索するしかなさそうです…
うーん。光用の画像を用意しておいて特殊な乗算でブレンドするとかしたら
ある程度それっぽく見えるかもしれません。とりあえず色々頑張ってみます。
ありがとうございました!
そうですかあ。固定機能だけだとこういう事にも限界があるんですか…
色々理由があってシェーダが使えないので別の方法を模索するしかなさそうです…
うーん。光用の画像を用意しておいて特殊な乗算でブレンドするとかしたら
ある程度それっぽく見えるかもしれません。とりあえず色々頑張ってみます。
ありがとうございました!
Re: DirectXのスポットライトを強烈に光らせたい
ゲームのロジック部分はほとんどシェーダなしでもできますが
ゲームエフェクトは少し凝ろうとするとシェーダを使う羽目になります。
光と影、色関係は特にです。
ゲームエフェクトは少し凝ろうとするとシェーダを使う羽目になります。
光と影、色関係は特にです。
Re: DirectXのスポットライトを強烈に光らせたい
シェーダーがない時代の記事とか参考になると思います。
3Dゲームファンのための「ワンダと巨像」グラフィックス講座
3Dゲームファンのための「ワンダと巨像」グラフィックス講座
Re: DirectXのスポットライトを強烈に光らせたい
3Dゲームファンのための「ヴァルキリープロファイル2」グラフィックス講座
こちらは先の記事よりも汎用的な手法ですね。
こちらは先の記事よりも汎用的な手法ですね。
Re: DirectXのスポットライトを強烈に光らせたい
>>Eggさん、>>ISLeさん
お二人とも、ありがとうございます。
紹介して頂いたものを参考にしながら色々と頑張ってみたいと思います。
あと一応、元のテクスチャを明るめに作っておいて
アンビエントを抑え気味にしてから、各スポットライト等で照らしてみると少しマシになってきました。
色々工夫しながらやってみますね。
お二人とも、ありがとうございます。
紹介して頂いたものを参考にしながら色々と頑張ってみたいと思います。
あと一応、元のテクスチャを明るめに作っておいて
アンビエントを抑え気味にしてから、各スポットライト等で照らしてみると少しマシになってきました。
色々工夫しながらやってみますね。
Re: DirectXのスポットライトを強烈に光らせたい
カプセル、テクスチャなし、標準ライト、マテリアル使用の条件で
試してみたところ、表面は白飛びしてると思いますが。
ほしいのがブルーム(強い輝きを見た時のぼやけ)ならISLeさんの貼っているリンクの方法使うのがいいでしょう。
試してみたところ、表面は白飛びしてると思いますが。
#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;
}
Re: DirectXのスポットライトを強烈に光らせたい
白くさせるコツとしては
①光の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に設定するということはその要素に対してブラックホールの状態になっているということです。
①光の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に設定するということはその要素に対してブラックホールの状態になっているということです。
Re: DirectXのスポットライトを強烈に光らせたい
>>Eggさん
コーディングまでして頂きありがとうございます。
一つだけ質問なのですがこれって単純なプリミティブ(板ポリ)にも同じような効果が現れますか?
自分はDxLibを使っておらず、詳しくわからないので、出来たら板ポリでも試して頂けますでしょうか?
それで可能なら自分のプログラムが悪いという事になると思いますので。
コーディングまでして頂きありがとうございます。
一つだけ質問なのですがこれって単純なプリミティブ(板ポリ)にも同じような効果が現れますか?
自分はDxLibを使っておらず、詳しくわからないので、出来たら板ポリでも試して頂けますでしょうか?
それで可能なら自分のプログラムが悪いという事になると思いますので。
Re: DirectXのスポットライトを強烈に光らせたい
>DxLibを使っておらず
コードを見ただけでは、この珠玉のコードどんなものか分からないと思うので是非Dxlibを使って見て下さい。(みてビックリしました)
http://dixq.net/g/と、もしかしてhttp://dixq.net/forum/viewtopic.php?f=3&t=18420を参考にしてもらえばすぐ動かせます。
コードを見ただけでは、この珠玉のコードどんなものか分からないと思うので是非Dxlibを使って見て下さい。(みてビックリしました)
http://dixq.net/g/と、もしかしてhttp://dixq.net/forum/viewtopic.php?f=3&t=18420を参考にしてもらえばすぐ動かせます。
Re: DirectXのスポットライトを強烈に光らせたい
単なるクアッドですが、こうなりました。
Diffuseで光らせてるので光に対する向きによっては輝きが減ります。
どの向きでも単に光の強さだけ考慮して輝きを制御しようとすると少し工夫が必要でしょう。
例、一時的にライティングを切って、頂点カラーにライトの強さを考慮して計算した何らかの値を代入する。
あとDxLibでできることはDirectXではすべて実現可能です。
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;
}
Re: DirectXのスポットライトを強烈に光らせたい
一つ言い忘れました。
ディレクショナルライトはそこまで問題ないのですが、
ポイントライトとスポットライトの場合ポリゴンの細やかさがライトの明るさに影響する可能性はあります。
というのも、DirectX9の固定機能のライティングは頂点ライティングだからです。
例えば、同じ四角形にポイントライトを当てても
その四角形が格子状にたくさんのポリゴンの集まりなのか、
単純に4つの頂点で構成された四角形なのかで、
明るさ反映度合が変わります。
ピクセル単位のライティングを行おうとすると、
普通の手段ではやはりシェーダーを使うしかないと思われます。
ディレクショナルライトはそこまで問題ないのですが、
ポイントライトとスポットライトの場合ポリゴンの細やかさがライトの明るさに影響する可能性はあります。
というのも、DirectX9の固定機能のライティングは頂点ライティングだからです。
例えば、同じ四角形にポイントライトを当てても
その四角形が格子状にたくさんのポリゴンの集まりなのか、
単純に4つの頂点で構成された四角形なのかで、
明るさ反映度合が変わります。
ピクセル単位のライティングを行おうとすると、
普通の手段ではやはりシェーダーを使うしかないと思われます。
Re: DirectXのスポットライトを強烈に光らせたい
>>C6b14 さん、>>Eggさん
お二方、ご返信ありがとうございます。
Eggさん、コードをまた書いて頂き感謝です。
ライトの方結構明るくできてる感じがしますね。
こんな感じでポイントライトでも自然に明るくできればいいのですが。
とりあえず自分でもDxLibを使ってみて教えて頂いたコードを色々と弄ってみたいと思います。
本当に感謝ですありがとうございます。
お二方、ご返信ありがとうございます。
Eggさん、コードをまた書いて頂き感謝です。
ライトの方結構明るくできてる感じがしますね。
こんな感じでポイントライトでも自然に明るくできればいいのですが。
とりあえず自分でもDxLibを使ってみて教えて頂いたコードを色々と弄ってみたいと思います。
本当に感謝ですありがとうございます。