現実世界の中で周りを見回すと色々なものがあると思います。たとえば、あなたの前にはディスプレイか、プリントアウトした紙があるでしょう。今言ったように現実世界にはたくさんのものがあふれています。しかし「見る」という事に関連した部分だけ抜き出し分類すると主に3種類に分けられます。
まずは物体(オブジェクト)です。これは見る対象です。
二つ目は視点(カメラ)。これは見るために用いる観察点です。
そして三つ目。それは物体と視点を結びつける役割を果たす光です。又はその光を出すものである光源です。
とりあえずこれだけあればものを見ることを支障なく行うことが出来ると思います。
以上は現実世界の話ですが、現実世界の模倣であるシミュレーションされた3次元世界でもこの三つが構成要素となります。
もし皆さんがそれ相応の年をとっているならば、小学校の時に光の反射の実験をしたことを覚えていると思います。
ものが見える原理は行くところまで行くとこのように単純化できます。つまり、「光がものに当たったの見る」と言うわけですね。それで、行くところまで行くとこれな訳で、これで計算をしても良いんですよ。でも、これではリアリティが足りなさすぎです。そういうわけで別な理論に基づいた光を組み合わせるのですが、現実世界での光の振る舞いを完璧にシミュレートするためには膨大な演算が必要になります。リアルタイムで実行することは不可能です。下に載せる方法はDirect3Dが標準でサポートしている光のシミュレーション方法で、実用的なスピード出るものです。
Direct3DではAmbient(場所について、全体の)と言う言葉でよく出てきます。これは、方向を全然考えない光です。たとえて言うならば、間接照明みたいな感じでしょうか?
上の図は環境光を球にあてたものです。下の本物っぽい球と比較してみてください。
結果は歴然ですね。とりあえず、物体がどんな形だろうと同じように反射してくる光が環境光です。
ディフューズ(Diffuse)というのは拡散という意味があるらしいです。この光は、「光の向き」と「表面の法線ベクトル」の角度で強さが決まります。と言って分かる人はわずかだと思います。(分かるあなたはすごいかも)とりあえず図を見て下さい。
はい、さっきの本物っぽい球と一緒です。とりあえずもう一枚見てみましょう。
「法線」についての説明は後ほどするのでとりあえずこの光は反射する強さを変えることが出来る光と覚えておくとよいと思います。(後々色々な問題に直面すると思いますが、その時はちゃんとした3D入門の本でも読んでください)
スペキュラー(Specular)は「鏡のような、反射する」という意味の通り、金属的な反射を再現します。内部的な話をすると、「光の向き」と「表面の法線ベクトル」と「視線の向き」の三つによって決定します。例を見ましょう。
この光だけだと意味があまり無いです。と言うわけで他の光も足してみましょう。
「スペキュラー光とディフューズ光」。まあ、暗いときはこれでも良いです。でも昼間だったら、普通裏側もうっすらと見えますよね?
というわけで環境光も足してみました。まだ微妙な感じですが、勘弁してください。私にはこれが限界です。
まあ、色が付くとこんな感じです。何か変ですね。
これもDirect3Dで扱うことの出来る光の1つなのですが、これはちょっと特殊でライトに影響されない光です。どういう事かというと、物体が光るのです。(というより光っているかの様に見える)
わかりにくいと思うのですが、この図ではライトを使っていません。つまり、この球は自己発光しているのです。
片方はエミッシブ無しです。ライトをあてていないので片方は光っていません。
光源から出る光には色が設定できます。しかも、それぞれの光にごとに設定できます。(と言うよりしなければいけません)そして、光源と同じく物にも色を設定できます。
今回は白い光を二つの球に当てています。片方は赤い光を反射するように、もう片方は緑色の光を反射するようにしてあります。このように物の色の設定のことを「マテリアル(Material)」と言います。意味は「材料、素材」ですね。(正確には「マテリアルは、物の色についての設定」ですね)
上の図は、試しに白い光ではなく赤い光を当てたところです。緑色の珠がうっすらと光っているのは赤や青もすこし反射するように設定してあったからです。(現実世界だと単色ってあまり無いじゃないですか。だからちょっと他の成分も混ぜておいたのです。)
とりあえずDirect3Dで標準的に扱える光は次の三つです。
ちょっと注意があって「スペキュラー光」につては使うことを宣言してからでないと使えません。
実際にはあといくつか要素が加わりますが、全体的にはこんな感じです。
では次回こそライトを扱います。結構長くなると思うので覚悟しておいてください。
「プログラマブルシェーダー」と言うものをご存じでしょうか?その中に「ピクセルシェーダー」というものがあるのですが、これはピクセル単位の処理をするためにあるものです。オブジェクトの複雑さについては同時に扱える頂点数を増やしていけばいいのですが、光の表現についてはなかなか処理が追いつくものではありません。そこで、プログラマが独自に光り方を計算して色を設定できるようにしたのがピクセルシェーダーです。ピクセルシェーダーはビデオボード上で実行され高速な処理が出来ます。(もちろんこの速度でもリアルタイムでの光線追跡には速度が足りません)この機能により、ある一定の条件下に特化した光の計算方法でその部分だけをよりリアルに描くことが出来ます。(またはデータを独自の解釈で描くことも出来ます)
ピクセルシェーダーについてはまた後ほど扱いましょう