[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D>光(光源と物体)

光(光源と物体)

現実世界の中で周りを見回すと色々なものがあると思います。たとえば、あなたの前にはディスプレイか、プリントアウトした紙があるでしょう。今言ったように現実世界にはたくさんのものがあふれています。しかし「見る」という事に関連した部分だけ抜き出し分類すると主に3種類に分けられます。

まずは物体(オブジェクト)です。これは見る対象です。

二つ目は視点(カメラ)。これは見るために用いる観察点です。

そして三つ目。それは物体と視点を結びつける役割を果たすです。又はその光を出すものである光源です。

とりあえずこれだけあればものを見ることを支障なく行うことが出来ると思います。

以上は現実世界の話ですが、現実世界の模倣であるシミュレーションされた3次元世界でもこの三つが構成要素となります。

光の反射

もし皆さんがそれ相応の年をとっているならば、小学校の時に光の反射の実験をしたことを覚えていると思います。

入射角と反射角の角度は一緒

ものが見える原理は行くところまで行くとこのように単純化できます。つまり、「光がものに当たったの見る」と言うわけですね。それで、行くところまで行くとこれな訳で、これで計算をしても良いんですよ。でも、これではリアリティが足りなさすぎです。そういうわけで別な理論に基づいた光を組み合わせるのですが、現実世界での光の振る舞いを完璧にシミュレートするためには膨大な演算が必要になります。リアルタイムで実行することは不可能です。下に載せる方法はDirect3Dが標準でサポートしている光のシミュレーション方法で、実用的なスピード出るものです。

環境光(アンビエント光)

Direct3DではAmbient(場所について、全体の)と言う言葉でよく出てきます。これは、方向を全然考えない光です。たとえて言うならば、間接照明みたいな感じでしょうか?

環境光

上の図は環境光を球にあてたものです。下の本物っぽい球と比較してみてください。

本物っぽい球

結果は歴然ですね。とりあえず、物体がどんな形だろうと同じように反射してくる光が環境光です。

ディフューズ光

ディフューズ(Diffuse)というのは拡散という意味があるらしいです。この光は、「光の向き」と「表面の法線ベクトル」の角度で強さが決まります。と言って分かる人はわずかだと思います。(分かるあなたはすごいかも)とりあえず図を見て下さい。

ディフューズ光

はい、さっきの本物っぽい球と一緒です。とりあえずもう一枚見てみましょう。

ディフューズ光(立方体)

「法線」についての説明は後ほどするのでとりあえずこの光は反射する強さを変えることが出来る光と覚えておくとよいと思います。(後々色々な問題に直面すると思いますが、その時はちゃんとした3D入門の本でも読んでください)

スペキュラー光

スペキュラー(Specular)は「鏡のような、反射する」という意味の通り、金属的な反射を再現します。内部的な話をすると、「光の向き」と「表面の法線ベクトル」と「視線の向き」の三つによって決定します。例を見ましょう。

スペキュラー光だけ

この光だけだと意味があまり無いです。と言うわけで他の光も足してみましょう。

スペキュラー光とディフューズ光

「スペキュラー光とディフューズ光」。まあ、暗いときはこれでも良いです。でも昼間だったら、普通裏側もうっすらと見えますよね?

三つの光をミックス

というわけで環境光も足してみました。まだ微妙な感じですが、勘弁してください。私にはこれが限界です。

剣玉みたいなの

まあ、色が付くとこんな感じです。何か変ですね。

エミッシブ

これもDirect3Dで扱うことの出来る光の1つなのですが、これはちょっと特殊でライトに影響されない光です。どういう事かというと、物体が光るのです。(というより光っているかの様に見える)

エミッシブ

わかりにくいと思うのですが、この図ではライトを使っていません。つまり、この球は自己発光しているのです。

エミッシブ比較

片方はエミッシブ無しです。ライトをあてていないので片方は光っていません。

光源から出る光には色が設定できます。しかも、それぞれの光にごとに設定できます。(と言うよりしなければいけません)そして、光源と同じく物にも色を設定できます。

赤玉緑玉

今回は白い光を二つの球に当てています。片方は赤い光を反射するように、もう片方は緑色の光を反射するようにしてあります。このように物の色の設定のことを「マテリアル(Material)」と言います。意味は「材料、素材」ですね。(正確には「マテリアルは、物の色についての設定」ですね)

赤玉緑玉(ほとんど赤い光を当てたとき)

上の図は、試しに白い光ではなく赤い光を当てたところです。緑色の珠がうっすらと光っているのは赤や青もすこし反射するように設定してあったからです。(現実世界だと単色ってあまり無いじゃないですか。だからちょっと他の成分も混ぜておいたのです。)

今日のまとめ

光の種類

とりあえずDirect3Dで標準的に扱える光は次の三つです。

ちょっと注意があって「スペキュラー光」につては使うことを宣言してからでないと使えません。

光かたを決める要素は「マテリアル(物体側の設定)」と「光源の設定」

実際にはあといくつか要素が加わりますが、全体的にはこんな感じです。



では次回こそライトを扱います。結構長くなると思うので覚悟しておいてください。

「プログラマブルシェーダー」と言うものをご存じでしょうか?その中に「ピクセルシェーダー」というものがあるのですが、これはピクセル単位の処理をするためにあるものです。オブジェクトの複雑さについては同時に扱える頂点数を増やしていけばいいのですが、光の表現についてはなかなか処理が追いつくものではありません。そこで、プログラマが独自に光り方を計算して色を設定できるようにしたのがピクセルシェーダーです。ピクセルシェーダーはビデオボード上で実行され高速な処理が出来ます。(もちろんこの速度でもリアルタイムでの光線追跡には速度が足りません)この機能により、ある一定の条件下に特化した光の計算方法でその部分だけをよりリアルに描くことが出来ます。(またはデータを独自の解釈で描くことも出来ます)

ピクセルシェーダーについてはまた後ほど扱いましょう


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-3-17 最終更新2006-3-18
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D>光(光源と物体)