3.7 Lightsource


このカテゴリは光源との関係で指令を再編成します。
VirtuaLightインターフェイスでは、光源はオブジェクトとはみなされません、なぜならそれらはただ光を放射する点あるいはエリアであるからです。
デフォルトではそれらは自身の物理的なサイズや目に見える形を持っていません。しかし光はShape(幾何学プリミティブの詳細についてはセクション3.8参照)構造体指令に含めることで形に変える事が可能です。
Solid構造体でも同じ様にすることが出来ます。
光源には6つの異なったタイプがあります。
AreaLight(面), BlackHole, DirectionalLight(指向性), PointLight(点),SkyLight (with SunLight) and SpotLightです。
そのうちの4つは構造体です。


3.7.1 AreaLight


エリアライトには2つのタイプがあります:球形(spherical )と平面多角形(flat polygonal)です。
エリアライトは柔らかい影を作成する能力を持っていて、そして輝度を評価する色式が使用可能です。
それぞれのライトが構造体中に多くのオプション指令を持つことができます。
Options構造体のSoftShadowSamples指令はパフォーマンスとエリアライトによって投じられる影の品質に影響します。


3.7.1.1 Spherical area light


The syntax is:

AreaLight [
    Bulb (point loc, float rad)
    Intensity rgbexpr color
    Decay int type
    Range float rad
    Glow float size
    LightingAttributes int flag
    MediaInteraction
    Any Transformation modifiers
]

最初の指令Bulbは必要とされる唯一のものです。他の全てはオプションです。
このエリアライトは電球と比較する事が出来ます、なぜならそれは(眼に見えない)球の形から放射するからです。
Bulbはソースの位置とその半径を定義します。
Intensityは光の実際の色を設定します。輝度が白( '1,1,1' )に近い時は輝度が黒( '0,0,0' )に近い時より明るくなります
Intensityの値は、もしDecayの割合が選択されているなら係数と掛け算されなければなりません、そしてこのdecayに依存して係数はとても高いはずである
Decayは距離による光源減衰の輝度を作成します。
選択すべき3つの減衰割合があります。
アーカイブファイル "staics.vib" 内には、固定でそれらが宣言されています。

LINEAR       = 1
QUADRATIC = 2
CUBIC        = 3

Linearでは輝度は距離に比例して減少します、そしてそれは実世界の光の輝度の減衰量より速くなります。
Quadraticでは輝度は距離の2乗に比例して減少します、それは実世界の光の輝度の減衰です。
Cubicでは輝度は距離の3乗に比例して減少します、それは実世界の光の輝度の減衰量より遅くなります。
Decayが2と3はレンダリングを遅くします、なぜなら最終的な輝度を得るために追加の計算が必要だからです。

範囲は距離により光の輝度を減衰させる異なる方法です。
それはその輝度が変化しない、光の影響が及ぶエリアを実際に指定します。
その半径を過ぎて、輝度は距離による減衰を始めます。
しかし、もしこの半径が正の値なら減衰率はリニアが使用され、そしてもし半径が負の値なら2次の減衰率になります。
半径が負の場合のみが正確な2次の減衰率であるのは事実です、なぜならレンダラはエリアライトの影響を評価するために半径の絶対値を使用するからです。

Glowは光のglow 効果のスケールを設定します。これは光を眼に見えるようにする機能です。
原理的には、全ての光線は光線の方向へ大気それ自身から来た拡散エネルギーの幾らかの量を輸送します。
光源の近くを通過する光線はもっと多くのエネルギーを集めます、なぜならそれから出る光は距離により減衰するからです。
SunGlowのように、このサイズはカメラ位置に関係する光の距離に依存します、しかしそれはほとんどいつも0と1の間に含まれます。
それで、これは絶対値ではありません。

LightingAttributes は光源に特有のフラグを無効にすることを可能にします。
アーカイブファイル "statics.vib"  にはそれぞれが静的に宣言されています。

static SHADOW    = 1
static SPECULAR = 2

デフォルトではどの新しいライトはライトの属性が3で作成されます。(SHADOW+SPECULAR)
もし影を投げかけるライトが必要でないなら、この属性は2(SPECULARのみ)を設定しなければなりません。
もし鏡面に鏡のようなハイライトを発生させる必要がないなら、この属性は1(SHDOWのみ)を設定しなければなりません。
そして、もし少しの影も必要でなくそして鏡のようなハイライトがこのライトに必要でないなら、ライティング属性は0でなければなりません。

MediaInteraction はこのエリアライトと関係メディアとの相互作用を有効にします。(存在するなら)

それはさらに、セクション3.13からのひとつ以上の指令を使用しているこのエリアライトを変形させることは可能です。

Example of a spherical area light structure:
AreaLight [
    Bulb((10,-50, 95), 2.5)
    Rotate(0,0,90)
    Intensity ‘1,1,.95’*500
    Decay QUADRATIC
    Glow 0.35
]


3.7.1.2 Flat area light


The syntax is:
AreaLight [
    Plane (int row, int col)
    or
    Plane (int row, int col, float jitter)
    or
    Plane (int row, int col, float jitter, int level)
    Intensity rgbexpr color
    Decay int type
    Range float rad
    LightingAttributes int flag
    Any Transformation modifiers
]

最初の指令Planeは必要とされるただひとつの物です。
他の全てはオプションです。
このエリアライトは多角形(眼に見えない)の形を持っています。
デフォルトでは、それはX-Z面(Y軸が上)に作成され(Y軸が上)、原点は中心でそして1平方ユニット(Xが0.5から0.5、そしてZが0.5から0.5)のサイズです。
Transformations 指令(セクション3.13から)はそれに適切なサイズ(Scale)、位置(Translate)、そして最後に方向(Rotate)を与えるために使用されなければなりません。
変換マトリクス(Transform)は同じ様に有用です。
(Note:予期する結果を得るために、Translateは最後に指定されなければなりません)

Planeの最初の2つの引数はエリアライトの個別化の基本的なレベルを決定します。(光線が放射されるところからのポイントのカラムと列)
より多くのポイントを使用すると影はよりスムーズになります、しかしレンダリングが長くかかるようになるでしょう。
さらに、もし適応性のあるサブサンプリングレベルを使用する(4番目の引数)と、追加のポイントが作成されるでしょう。
もし3番目の引数が0.0より大きい指定なら、それは配列中のポイントライトの位置が、生じるかもしれない影のバンディングを取り除くためのランダムジッターの原因になります。
値は0.1と0.4の間でokです。
ジッタリングはレンダリングからレンダリングまで完全にランダムなので、
アニメーションを作成する時には使用すべきではありません。

もし4番目の引数が0より大きい指定なら、それは多角形配列の細分化の適応レベルを設定します。
使われる技法は適応性のあるアンチエイリアシングのものに似ています。
オプション指令のIntensity、Decay、Range、そしてLightingAttributes はspherical area lightと同じです。
しかし2つの追加の属性が LightingAttributesに追加されました。
アーカイブファイル "statics.vib" 内で、それらは静的に宣言されています。

AUTO_ORIENTED = 4
1SIDED = 8

バイト3(ビットの間違い?-値 1SIDED)は平面エリアライトに、一方向からのみの放射ライトを強制することを可能にします。
1-sided平面エリアライトは2-sidedより速い計算が可能です。
バイト2(ビットの間違い?-値 AUTO_ORIENTED)は平面エリアライトに、自動方位(auto-oriented)そしてリアルな3Dライトのように振舞うこと強制することを可能にします。
影の分布はより現実的になります、なぜならエリアライトの面は影に関してテストされているポイントに常に垂直であるからです。
しかしライトがオブジェクトの下(例えばライトの箱が天井に取り付けられている)の近くに位置する時は、この属性を有効にするので良い考えとはいえません。

Example of a flat area light structure:
AreaLight [
    Plane(6,5,0.15)
    Scale(10,0,5)
    Translate(0,100,-65)
    Intensity ‘1,1,1’*58
    Decay LINEAR
]


3.7.2 Black hole


VirtuaLightではブラックホールは眼に見える光を吸い込むように作用します。
それはカスタムの密度を持つ一種のdarklightです。
この指令は2つか3つの引数と共に記述可能です。

BlackHole (point location, float density)
or
BlackHole (point location, float density, rgb intensity)

最初の引数は、ワールド座標でその中心の位置を設定します。
2番目の引数は密度を指定します。より大きな値はよりいっそう中心から遠い光を吸収します。
ブラックホールは、距離によるdarklightの輝度の評価に常に自然2次減衰レートを使用します。
もし3番目の引数が使われているなら輝度をセットします、そしてそれはデフォルトが黒です。

e.g.
BlackHole ((5, 0, 40), 80)


3.7.3 Directional light


方向を示す光源はとても基本的なライトです。
それは一定の照明が、距離による輝度の減衰なしで何処かの方向から来ていることを表します。
シンタックスは以下:

DirectionalLight [
    vector Direction
    Intensity rgb color
    LightingAttributes int flag
]

方向ベクトルは本当に必要とされる唯一の引数です。
それは光の来る方向を決定します。
Intensityはライトの実際の色を設定します。Intensityが白( '1,1,1' )に近いと黒( '0,0,0' )に近い時より明るくなります。
LightingAttributes は光源の特殊なフラグを無効にすることを可能にします。
アーカイブファイル "statics.vib"でそれぞれが静的に宣言されています。

static SHADOW    = 1
static SPECULAR = 2

デフォルトではどの新しい方向ライトが作られても、ライティング属性は3です。(SHADOW+SPECULAR)
もしライトが影を投げかけるのを望まないなら、この属性が2に設定されなければなりません。(SPECULARのみ)
もしライトが鏡面での鏡のようなハイライトを望まないのなら、この属性が1に設定されなければなりません。(SHADOWのみ)
そして、少しの影も必要でなく、鏡のようなハイライトもこのライトで必要なければ、ライト属性は0でなければなりません。

e.g.
DirectionalLight [ (5, -5, 0) Intensity ‘.5,.45,.5’ ]


3.7.4 Point light


点光源は空間に単一の点を占めるライトを表します、そして均等に全ての方向に輝きます。
それはDirectionalLight と共に、インターフェイスによって提供される最も高速な光源です。
シンタックスは:

PointLight [
    point Position
    Intensity rgb color
    Decay int type
    Range float rad
    Glow float size
    LightingAttributes int flag
    MediaInteraction
]

点の位置は必要とされる唯一の引数です。
他の全ての指令はオプションです。
Intensity はライトの実際の色を設定します。
Intensityが白( '1,1,1' )に近いと黒( '0,0,0' )に近い時より明るくなります。
Intensityの値は、もしDecayレートが選択されているなら係数と掛け算しなければなりません、そしてこの減衰に依存している係数は非常に大きくなければなりません。
Decayは距離による光源の減衰による輝度を作成することを可能にします。
3種類の減衰レートから選択可能です。
アーカイブファイル "statics.vib" にはそれらが静的に宣言されています。

LINEAR = 1
QUADRATIC = 2
CUBIC = 3

Linerは輝度が距離に比例して減少します、そしてそれは現実の光の輝度より速く減衰します。
Quadraticは輝度が距離の2乗に比例して減少します、それは現実の光の輝度の減衰です。
Cubicは輝度が距離の3乗に比例して減少します、それは現実の光の輝度より遅く減衰します。
Decay2と3はレンダリングを少し遅くします、なぜなら最終的な輝度を得るのに追加の計算が必要になるからです。

範囲は距離により光の輝度を減衰させる異なる方法です。
それはその輝度が変化しない、光の影響が及ぶエリアを実際に指定します。
その半径を過ぎて、輝度は距離による減衰を始めます。
しかし、もしこの半径が正の値なら減衰率はリニアが使用され、そしてもし半径が負の値なら2次の減衰率になります。
半径が負の場合のみが正確な2次の減衰率であるのは事実です、なぜならレンダラはエリアライトの影響を評価するために半径の絶対値を使用するからです。

Glowは光のglow 効果のスケールを設定します。これは光を眼に見えるようにする機能です。
原理的には、全ての光線は光線の方向へ大気それ自身から来た拡散エネルギーの幾らかの量を輸送します。
光源の近くを通過する光線はもっと多くのエネルギーを集めます、なぜならそれから出る光は距離により減衰するからです。
このサイズはカメラ位置に関係する光の距離に依存します、しかしそれはほとんどいつも0と1の間に含まれます。
それで、これは絶対値ではありません。

LightingAttributes は光源に特有のフラグを無効にすることを可能にします。
アーカイブファイル "statics.vib"  にはそれぞれが静的に宣言されています。

static SHADOW = 1
static SPECULAR = 2

デフォルトではどの新しいライトはライトの属性が3で作成されます。(SHADOW+SPECULAR)
もし影を投げかけるライトが必要でないなら、この属性は2(SPECULARのみ)を設定しなければなりません。
もし鏡面に鏡のようなハイライトを発生させる必要がないなら、この属性は1(SHDOWのみ)を設定しなければなりません。
そして、もし少しの影も必要でなくそして鏡のようなハイライトがこのライトに必要でないなら、ライティング属性は0でなければなりません。

MediaInteraction はこのエリアライトと関係メディアとの相互作用を有効にします。(存在するなら)

Example of a point light structure:
    PointLight [ (10,-50, 95)
    Intensity ‘0.75, 0.75, 0.75’
    Glow 0.2
]


3.7.5 Skylight and Sunlight


この機能はVirtuaLightインターフェイスによって提供されるglobal illumination の方法の一部であり、開けた空の環境光を使用したシーンのレンダリングを可能にします。
SkyLightは、モンテカルロレイトレーシングアルゴリズムに類似した、太陽の放射拡散光のシミュレーションを有効にします。
skylightはsky doomと名付けられた無限大の大きな半球体の直接の光源を扱います。
それは完全に世界を抱合し、影を投げかけません。
SunLightは時間に応じたsky doom内の太陽の位置を自動的にコントロールします。
それはシャープな影あるいは極端にソフトな影を投げかける事が可能です、しかしそれはskylightが有効の時のみ効果があります。
もちろん、skylightが有効の時にシーンに人工的な光源を追加することはまだ可能です。
ComputeIrradiance (セクション3.5.7)と同じ様に、他のオプションの指令はskylightアルゴリズムの照射に影響を与えます。
基本的にSkyLightは3つの引数を持っています。

SkyLight (int samples, rgbexpr color, float brightness)

最初の引数は、照射を評価するために各交差ポイントに投げかける光線のサンプルの数を表わします。
レンダリング時間は直接この値に比例します。
それは同じくレンダリングのイメージ品質に影響を与えます。
大きな値はさらにノイズの少ないそして良質な拡散したライティングを作成しますが、より多くの計算時間を必要とします。
80から100で開始するのが良いと思われます。
2番目の引数はsky domeの色(あるいは色の式)をセットします。
単純な色を指定することは、同じ色が全ての空をカバーするのに使用される事を意味します。
しかしながら式を指定することは、式を評価した後でsky domeの各ポイントが、得られた色を受け取るであろう事を意味します。
これはイメージマッピング(雲、日没、日の出 etc.)や、ポイントの色を返すことのできるどのような処理を使うことを容易に可能にします。
それで、Background (section 3.5.4)と同じような感じで、光線がsky domeに衝突する時に少数の実行時変数は適合させられます。

Name Type   Description
I        vector Direction of the current ray
Level  int      Current level of recursion
u        float   For image map, how far across the output image (from 0.0 at left to 1.0 at right)
v        float   For image map, how far down the output image (from 0.0 at bottom to 1.0 at top)
P        vector Equal to (u, 0, v)

他の関数変数は使用されていません。
3番目の引数は空の全体的な輝きをコントロールします。
それはポイントの最終的な色を評価するために、それらを使用する前に全ての照射値を計算し、乗数係数のように作用します。
値が1.0よりも大きい時は周囲は明るくなり、1.0より小さい時は暗くなります。

デフォルトではSkyLightがリクエストされた時は、太陽は無になります。
太陽はSunLightによってリクエストされます。
この指令には1、2あるいは3つの引数の、3通りの記述方法があります。

SunLight (int hours : int minutes)
or
SunLight (int hours : int minutes, int samples)
or
SunLight (int hours : int minutes, int samples, float brightness)
or
SunLight (int hours : int minutes, int samples, float brightness, rgb color)

2ポイント" : " が時間と分を切り離すものである事に注意する必要があります。
しかし、これらの2つの値は最初の引数だけを表します。
時間は06(AM)から18(PM)まで進み、分は00から59まで進みます。
範囲から外れたどのような値も再調整されるでしょう。
12:00は太陽が天頂にある時間であることを表します。

Skylight and Sunlight

上記のイラストはVirtuaLightの午前6時から午後6時までの天頂の太陽の軌道(黄色)を示しています。

デフォルトでは太陽はシャープな影を投げかけます。
もし2番目の引数が1より大きな値が与えられた時、太陽は巨大な球形エリアライトと同じかそれ以上になり、ソフトな影を投げかけるでしょう。
値は太陽から投げかけられる追加された影の光線の数を表します。
しかし、もし数が31よりも大きいなら、光線は太陽より大きなエリアから投げかけられる事になり、非常に曇った空のような極端に拡散した影になります。

3番目の引数は太陽の輝きをコントロールする係数です。
デフォルトは0.7です。
もしライティングが明るすぎるならより小さな値を指定すること、あるいは太陽光が弱い場合はより大きな値を指定することは有用です。

4番目の引数は太陽の色を明示的に設定することが可能です。
デフォルトではレンダラは時間に基いてこの色を計算します、しかしこの引数はユーザが独自の色を与えることを可能にします。


SunLightが使用される時、空の輝度と環境光の色は指定された時間に関係して自動的に変化します。
この特徴は午前、正午、午後、そして夕方の視覚的な概念を与えます。


Example:
static bitmap = ImageFile("sky.jpg",1)
Declare sky =
mix((Level == 0 ? UVImageMapping(bitmap) : SphericalImageMapping(bitmap, I)),
'0.529412,0.807843,1', 0.3)
SkyLight(100, sky, 1.05)
SunLight(13:15, 72)


3.7.6 Spot light


この光源はかなりスポットライトとして働きます。それはカメラマンが同じ事をするためにスポットを使うと同じ様に、照らす機能として使用する事が出来ます。
インターフェイスは、エリアライトのようなソフトな影を投げかけるスポットの能力を提供します。
シンタックスは:

SpotLight [
    point Position, point PointAt, float Radius, float Falloff, float Tightness
    Intensity rgb color
    Decay int type
    Range float area
    Bulb float radius
    LightingAttributes int flag
    MediaInteraction
]

最初の5つの引数は必要です。他の指令はオプションです。
Positionはワールド空間内でのスポットライトの位置を定義します。
PointAはスポットが指し示しているシーン内の位置を定義します。
Radiusは完全に照らされるコーン円錐の角度です。
Falloffは半影部コーン円錐の角度です。そこでは光は暗く減少します。
Tightnessは光が減少する割合を決定する値です。(ホットスポットの形を決定するために使用するpower関数)

Intensityはライトの実際の色を設定します。
白( '1,1,1' )に近い輝度は、黒に近い輝度より明るいでしょう。
Intensityの値は、もしDecayの割合が選択されているなら係数と掛け算されなければなりません、そしてこのdecayに依存して係数はとても高いはずです。
Decayは距離による光源減衰の輝度を作成します。
選択すべき3つの減衰割合があります。
アーカイブファイル "staics.vib" 内には、固定でそれらが宣言されています。

LINEAR = 1
QUADRATIC = 2
CUBIC = 3

Linearでは輝度は距離に比例して減少します、そしてそれは実世界の光の輝度の減衰量より速くなります。
Quadraticでは輝度は距離の2乗に比例して減少します、それは実世界の光の輝度の減衰です。
Cubicでは輝度は距離の3乗に比例して減少します、それは実世界の光の輝度の減衰量より遅くなります。
Decayが2と3はレンダリングを遅くします、なぜなら最終的な輝度を得るために追加の計算が必要だからです。

範囲は距離により光の輝度を減衰させる異なる方法です。
それはその輝度が変化しない、光の影響が及ぶエリアを実際に指定します。
その半径を過ぎて、輝度は距離による減衰を始めます。
しかし、もしこの半径が正の値なら減衰率はリニアが使用され、そしてもし半径が負の値なら2次の減衰率になります。
半径が負の場合のみが正確な2次の減衰率であるのは事実です、なぜならレンダラはエリアライトの影響を評価するために半径の絶対値を使用するからです。

Bulbがスポットをエリアスポットライトに変化させます。
それは光を放射する球ライトの半径を設定します。
他のエリアライトのように、Options構造体のSoftShadowSamples の指令はパフォーマンスと、そしてそれの投げかけるソフトな影の品質に影響を及ぼします。

LightingAttributes は光源に特有のフラグを無効にすることを可能にします。
アーカイブファイル "statics.vib"  にはそれぞれが静的に宣言されています。

static SHADOW = 1
static SPECULAR = 2

デフォルトではどの新しいライトはライトの属性が3で作成されます。(SHADOW+SPECULAR)
もし影を投げかけるライトが必要でないなら、この属性は2(SPECULARのみ)を設定しなければなりません。
もし鏡面に鏡のようなハイライトを発生させる必要がないなら、この属性は1(SHDOWのみ)を設定しなければなりません。
そして、もし少しの影も必要でなくそして鏡のようなハイライトがこのライトに必要でないなら、ライティング属性は0でなければなりません。
MediaInteraction はこのエリアライトと関係メディアとの相互作用を有効にします。(存在するなら)

Example of a spot light structure:
    SpotLight [ (100,-100, 100), (0,10,0), 30, 12, 1.0
    Intensity ‘0.8, 0.8, 0.8’*5000
    Decay QUADRATIC
    MediaInteraction
]



next