ゲームソフト分野の鎌田です。
ゲームソフト分野は「ゲーム業界一直線!」を合言葉に、1年生の時からプログラミングに特化したカリキュラムを実践します。
また、1年次から作品制作に力を入れて取り組みゲーム業界への就職を目指すことになります。
2年次から学ぶ技術「シェーダ」とは?
ゲームソフト分野では2年次から「シェーダ」という技術を勉強します。
シェーダー(英: shader)
3次元コンピュータグラフィックスにおいて、シェーディング(陰影処理)を行うコンピュータプログラムのこと。(wikipediaより)
この機能を使用することで、物体が光に当たった時の表現を思うがままにできます。
光の計算をしない時
光の計算をした時
ゲームで美麗な表現を行うためには、この機能は欠かせません。
今回はこの光の基本的な考えについて紹介したいと思います。
我々の目は光を見ている
私たちが物体を見る時、正確には物体から反射された光を見ています。
そのため、光の色が変わると物体の色も変化して見えますし、全く光が無い場所では物体を見ることは出来ません。
上図では反射された光は1つだけのように見えますが、実際には「拡散反射光」と「鏡面反射光」の2つに分かれます。
この2つの光は、特性がかなり違うので分けて計算します。
拡散反射光
物体に当たった光の一部は物体の内部に侵入していき、これを「屈折光」と呼びます。
屈折光は物体の内部で吸収や散乱がくり返され、最終的には物体から飛び出てきます。
この光のことを拡散反射光(Diffuse)と呼び、我々が物体の色を視認できる光となります。
計算方法はいろいろありますが、有名なのがLambertモデルという計算方法です。
吸収や散乱を細かく計算するのは不可能なので、ざっくりと以下のような計算式で近似するシンプルな方法です。
<Lambertモデル>
※L … 物体の面から、光の位置への方向ベクトル
N … 物体の面の方向ベクトル
鏡面反射光
物体に侵入しなかった光の一部はそのまま跳ね返ることとなり、これを鏡面反射光(Specular)と呼びます。つるつるの物体を見たときに鋭く光ってるアレです。
そのまま跳ね返るので物体の色には変化せず、たとえ白い光が赤い物体に当たっても、白い光のまま反射されます。(ただし物体が金属の場合は違ったりします)
つるつるした材質ほど、この光の比率が高くなります。
これも計算方法はいろいろあるのですが、簡単な方法でBlinn-Phongモデルというものを紹介します。
<Blinn-Phongモデル>
※L … 物体の面から、光の位置への方向ベクトル
V … 物体の面から、目の位置への方向ベクトル
N … 物体の面の方向ベクトル
power … 物体の面の滑らかさ(細かな凹凸)
ちょっと複雑な感じの計算式に見えますが、説明を聞くと結構簡単な式なのです。
この2つの光が求まれば、あとは足すだけで目に見える光の色が求まります。
目に見える色 = 拡散反射光 + 鏡面反射光
最後に
今回紹介したものは、かなり昔から使用されている手法です。
比較的計算式が簡単なので3Dプログラミング初心者が最初に学ぶのに最適ですが、あまり品質は良くありませんし、実際はこの2つ以外の光のことも考える必要もあります。
最近のPlayStation4などで発売されているゲームタイトルでは「物理ベースレンダリング」といったエネルギー保存の法則を考慮し、ある程度光学的に正しい結果になるように計算する手法が使われている作品も多くあります。
より高品質になるように計算をしてみた例
シェーダプログラミングに慣れてくるとこのような技術を研究するのも楽しくなってくるので、興味がわいた人はシェーダを勉強してみましょう!
- Date:
- この記事を
友だちに教える - LINE
- - HatenaBookmark
- GooglePlus