DXライブラリでライトの設定をする方法について説明してます。ライトの向き、位置、色、種類の変更など。ここでは基本となるディレクショナルライトを主に取り扱います。
ライトは3種類
DXライブラリでは「ディレクショナルライト」「ポイントライト」「スポットライト」の3つのライトを使用することができる。
ディレクショナルライトはライトの方向と色の情報だけを持つライト。現実世界でのライトは光源から遠くなるほど光が弱くなっていくがこのディレクショナルライトはそれがなく、どこでも光の強さは一定になる。現実世界だと太陽光が近い存在。
ポイントライトはライトの方向と色、そして位置(影響範囲)情報を持つライト。現実世界のライトと同様光源から遠くなるほど光が弱くなっていく。距離を考慮する必要があるため、処理はやや重め。
スポットライトはポイントライトに放射方向、放射角度を加えたライト。よりリアルなライトの描写が可能になる。当然ながら処理は重い。
DXライブラリではこれらのライトの位置や向き、色などの設定を行える関数が用意されている。また初期設定だと標準ライトとしてディレクショナルライトを使用するように設定されている。
サンプルコード
それではライトの設定を変更する機能を実装。ここでは例として最初に用意されているディレクショナルライトの設定を変えてみます。あとC/C++側のコードです。
まずライトの情報を扱う LightMng.cpp/h を追加し、以下のコードを書く。
LightMng.h
#ifndef DEF_LIGHTMNG_H #define DEF_LIGHTMNG_H void LightMng_Initialize(); void LightMng_Update(); void LightMng_Draw(); void LightMng_Finalize(); #endif
LightMng.cpp
#include "DxLib.h"
#include "LightMng.h"
//初期化
void LightMng_Initialize() {
// 標準ライトの方向をセットする
SetLightDirection(VGet(1.0f, 1.0f, 1.0f));
// 標準ライトのディフューズカラーを青色にする
SetLightDifColor(GetColorF(0.0f, 0.0f, 1.0f, 0.0f));
}
//更新
void LightMng_Update() {
}
//描画
void LightMng_Draw() {
}
//終了処理
void LightMng_Finalize() {
}
SetLightDirection() でライトの向きを指定できる。
| 宣言 | int SetLightDirection(VECTOR Direction) | |
| 概要 | 標準ライトの方向を設定する | |
| 引数 | VECTOR Direction | 標準ライトの向き |
| 戻り値 | 0 | 成功 |
| -1 | エラー発生 | |
ここで例として指定しているライトの向きを見て「それだと下からライトが当たるのではないか」と思う人がいると思うが、シェーダー上でライトの向きは計算の関係で反対向きに変換するので問題はない。
SetLightDifColor() でライトの色を指定できる。
| 宣言 | int SetLightDifColor(COLOR_F Color) | |
| 概要 | 標準ライトの色を設定する | |
| 引数 | COLOR_F Color | 標準ライトのディフューズカラー |
| 戻り値 | 0 | 成功 |
| -1 | エラー発生 | |
COLOR_F は float r, g, b, a を持つ構造体で r, g, b の各値で色が決まる。文字通りRGB表記。a はアルファ値(透明度)だがここでは指定しても意味はない。
色を指定するときは GetColorF() を使って指定する。
| 宣言 | COLOR_F GetColorF(float Red, float Green, float Blue, float Alpha) | |
| 概要 | 浮動小数点型のカラー値を取得する | |
| 引数 | float Red, Green, Blue | 取得したいカラーのRGB成分(0.0f~1.0f) |
| float Alpha | 取得したいカラーのアルファ値(0.0f~1.0f) | |
| 戻り値 | 0 | 成功 |
| -1 | エラー発生 | |
あとは Game.cpp に LightMng.h をインクルードして初期化関数を追加する。
Game.cpp
//以下のヘッダーファイルをインクルード
#include "LightMng.h"
//略
//初期化
void Game_Initialize() {
//略
//ライトの情報初期化
LightMng_Initialize();
}
タイトル画面から3Dモデルを表示させる場合は Game.cpp ではなく Menu.cpp に処理を書き込む。
最後にライティング設定に関する SetUseLighting() を使っていてかつFALSEを渡している場合はコメントアウトしておく。この関数にFALSEを渡すとライトの設定が実質無効になるため。
ライトの影響を計算しないオリジナルシェーダーを読み込んでいる場合も当然ながらライトの設定は実質無効になる。

コメント