光源の設定

光源の設定

 前回のサンプルは光源…光がないので薄暗い感じになっていました。
てことで光源も必須なわけです。

光の設定の方法は、E3DCreateLightで光源を作成して、次に作成した光源の種類とパラメータを設定します。
E3DSetPointLight
E3DSetSpotLight
E3DSetDirectionalLight
などで設定します。

光源の種類

ライトの種類と性質は次のような感じです。
必要に応じて使い分けましょう。

HSP命令 ライトの種類 性質
E3DSetPointLight ポイントライト 点光源。
ろうそくの光や豆電球の光など、指向性のない光。
E3DSetSpotLight スポットライト 懐中電灯のような指向性のある光。
車のヘッドライトなど。
E3DSetDirectionalLight 平行光 平行に降り注ぐ光のこと。
光源がものすごく遠い場合、光はほとんど平行に降り注ぎます。身近なところで、太陽光がこれです。

E3DCreateLightはメインループの外に置いてください。でないとループのたびに光源を量産しつづけることになります。
E3DSetDirectionalLightなどはループの中でも外でもどちらでもokです。

アンビエント・スペキュラー

地面データのみに影響する特殊な色の設定ができます。
特にリアリティーを求めたり、独自の質感を出したい場合に設定するとよいと思います。
普通に使う分には気にする必要はないと思います。

項目 内容
アンビエント色 環境光の色のこと。
光に当たっていない場所も周りの壁や地面で反射する光があたります。この光の色です。
スペキュラー色 ハイライトの色のこと。
物体に映りこんだ光源の色のこと…だそうです。

サンプル

前回のタコのモデルを表示させるだけのサンプルに平行光源を設定しました。
タコのモデルファイルはEasy3Dのサンプルにtako.sigというファイル名で含まれています。
tako.sigとtako01.bmpをmediaフォルダ内に入れてから実行してください。

前回のサンプルに追加した部分を赤色で表示してあります。

;
;	ライトを設定する
;

#include "e3dhsp3.as"

	;/////////////////
	;
	;	初期化
	;
	wid = 0		;ウインドウID
	objid = -1	;オブジェクトID
	fullscreenflag = 0		;フルスクリーンフラグ
	bits = 16	;色数ビット数(fullscreenflag = 1 のときのみ有効)
	multisamplenum = 0		;アンチエイリアスのマルチサンプル数(0,2~16)
	;scid	スワップチェインID
	E3DInit wid, objid, fullscreenflag, bits, multisamplenum, scid


	;/////////////////
	;
	;	形状データのロード
	;
	sdim mediadir, 2048
	mediadir = dir_cur + "\\Media\\tako.sig"
	E3DSigLoad mediadir, hsid1
;	E3DSetPos hsid1, 0, 0, 0
	frameno1 = 0	;モーションは使用しない。

	;/////////////////
	;
	; ライトの設定
	;
	E3DCreateLight lid1 ;光源を作成
	lightdirx1 = 1 ;平行光の向き
	lightdiry1 = -1
	lightdirz1 = 0
	lightr1 = 255	;平行光の色
	lightg1 = 255
	lightb1 = 255
	E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1 ;光源を平行光源に設定


;/////////////////
;
;	メインループ
;
*main
	E3DBeginScene	;-----シーンスタート
		E3DChkInView scid, hsid1	;モデルが、視野内にあるか判定

		stick key
		if key&128 : goto *bye
		E3DRender scid1, hsid1, 0, frameno1, 0	;バックバッファにレンダリングする。(タコ描画)

	E3DEndScene			;-----シーン終了
	E3DPresent scid		;バックバッファの内容を、プライマリバッファに転送。描画する。

	;FPSの調整と表示
	E3DWaitByFPS 60, chkfps1 : await 0
	title ""+chkfps1 + " FPS"

goto *main


;/////////////////
;
;	終了処理
;
*bye
	E3DDestroyLight lid1	;ライトを破棄
	E3DBye
	end



実行結果のサンプル画像
実行結果はこんな感じになります。
E3DSetDirectionalLightで平行光としています。
光の進む方向は(1,-1,0)としているので、太陽光が画面右上から左下に降り注ぐような感じになっています。