減衰とスポットライト係数

減衰とスポットライト係数

グローバル ライティングの方程式中のディフューズ ライトおよびスペキュラ ライトの成分は、ライトの減衰およびスポットライトのコーンを記述する項を含んでいる。これらの項について説明する。

減衰

ライトの減衰は、ライトのタイプ、およびライトと頂点位置の間の距離によって決まる。減衰の計算には、次の 3 つの方程式のいずれかを使用する。

Atten = 1/( att0i + att1i * d + att2i * d2)

ここで

パラメータ デフォルト値 説明
att0i 0.0 FLOAT 線形減衰係数。範囲は 0 ~ 正の無限大
att1i 0.0 FLOAT 2 次減衰係数。範囲は 0 ~ 正の無限大
att2i 0.0 FLOAT 指数減衰係数。範囲は 0 ~ 正の無限大
d. N/A FLOAT 頂点位置からライト位置までの距離
  • 減衰 = 1 (ライトがディレクショナル ライトである場合)
  • 減衰 = 0 (ライトと頂点との距離がライトの範囲を超えている場合)

att0、att1、att2 の値は、D3DLIGHT9Attenuation0Attenuation1、および Attenuation2 メンバで指定する。

ライトと頂点位置の間の距離は常に正の値である。

d = | Ldir |

ここで

パラメータ デフォルト値 説明
Ldir N/A D3DVECTOR 頂点の位置からライトの位置への方向ベクトル

d がライトの範囲 (つまり、D3DLIGHT9 構造体の Range メンバ) より大きい場合、Microsoft® Direct3D® はそれ以上減衰計算を実行せず、ライティング エフェクトを頂点に適用しなくなる。

減衰定数は公式では係数になる。これらの係数に簡単な調整を加えることで、さまざまな減衰カーブを生成できる。Attenuation1 を 1.0 に設定して、減衰しない光を作成できる (ただし、範囲による制限がある)。また、いろいろな値を試してみて、さまざまな減衰エフェクトを出すことができる。

ライティングの最大範囲における減衰は 0.0 ではない。ライティングの範囲内でライティングが突然現れるのを防止するために、アプリケーションではライティングの範囲を増やすことができる。また、アプリケーションで、ライティング範囲における減衰係数が 0.0 に近づくように減衰定数を設定できる。減衰値をライティングの色の赤・緑・青成分で乗算して、ライティングの強度を光が頂点まで進む距離の係数として定めることができる。

スポットライト係数

スポットライト係数の公式

 

パラメータ デフォルト値 説明
rhoi N/A FLOAT スポットライト i の余弦(角度)
phii 0.0 FLOAT スポットライトの半影角度 (ラジアン単位)。範囲 :[thetai, pi)
thetai 0.0 FLOAT スポットライトの本影角度 (ラジアン単位)。範囲 :[0, pi)
falloff 0.0 FLOAT フォールオフ係数。範囲 :(-infinity, +infinity)

ここで

rho = norm(Ldcs).norm(Ldir)

および

パラメータ デフォルト値 説明
Ldcs N/A D3DVECTOR カメラ空間のライトの方向を逆にした値
Ldir N/A D3DVECTOR 頂点の位置からライトの位置への方向ベクトル

ライティング減衰を計算した後、Direct3D では、スポットライト エフェクト (適用する場合)、サーフェイスからの光の反射角度、および現在のマテリアルの反射率を考慮して、その頂点に対するディフューズ成分とスペキュラ成分を算出する。詳細については、「スポットライト モデル」を参照すること。