3DCGが画面に表示されるまで
3DCGは、ポリゴンと呼ばれる三角形が画面に沢山表示されています。
このポリゴンを表示するまでの流れを簡単に説明します。
内容については、分かりやすくするために一部正確ではない部分もあります。ご了承ください。
1. ポリゴンは3つの頂点から
ポリゴンは三角形なので、頂点が3つあります。
この頂点の位置を、例えば以下の通りとします。
これは、図にすると大体下のような感じの三角形です。
頂点Aが、ちょっと奥に入ってる感じですね。
以降の処理で、この3つの頂点を使って画面にポリゴンを描画していきます。
2. カメラにはどう映るか
この3つの頂点が、カメラから見てどこにあるかを決めます。
ものすごく端的に言うと、3次元から2次元にします。
これは白い布を吊り下げ、三角形の後ろからライトを当てると白い布に三角形の影ができるのと似ています。
この白い布がカメラのレンズであり、まさにディスプレイの画面ということになります。
3. ディスプレイはドットで描画されています
ディスプレイの画面は、ご存知の通り四角いドットが並んでいて、それぞれに色が付いていることで絵が表示されています。
ですので、この三角形を画面上のドットに置き換えます。
この2から3までの処理は、ものすごく大雑把に言うと「頂点シェーダ」と呼ばれるもので処理されます。
白い布に三角形を投影(頂点座標にWorldViewProjection行列を掛ける)するのが頂点シェーダの主な役割です。
4. 各ドットには沢山の情報が詰まっています
さて、このドットですが、単なるドットではありません。
3Dの情報が沢山詰まったドットです。
ドットには、画面上の位置(XY座標)、奥行き(カメラからそのドットまでの距離)、法線や色、UV座標など、様々です。
ちなみに、基本的に座標はX=100, Y=100などのドット座標ではなく、X=0.5、Y=0.5といった画面相対座標で表されます。
5. このドットは表示していいの?
さあ、ドットを描画しよう・・・の前に、ちょっと確認することがあります。
そうです、表示する画面は2Dですが、このドットは3Dなので"このドットが何かに隠れている"場合、表示してはいけません。
それをどのように判定するかというと、非常に単純です。
前述の「奥行き」を使って比較すればいいのです。
今描画されているドットに保存されている奥行きよりも、自分の奥行きが小さければ、今のドットよりも手前にあるということになるので、
描画してよいことになり、ドットを上書きしてしまいます。
逆に、奥行きが大きいと、現在のドットよりも後ろにあるので、描画しません。
なお、この奥行きを保存しているのが「深度ステンシルバッファ」と呼ばれるものです。
6. さあ、ドットを描画です
いよいよドットを描画します。
このドットを描画するときに、3Dに必要な陰影や影を計算します。
つまり、このドット単位で、カメラと法線から明るさを、UV座標とテクスチャから色を、ドットに割り当てられた材質から質感を作り出します。
この部分が「ピクセルシェーダ」の役割です。
ピクセルシェーダは、その名の通り、1ドット(ピクセル)ごとに、そのドットを何色にすべきなのかを計算します。
この計算方法を工夫することで、リアルな光を表現したり、アニメ調の色にしたり、メカの光沢を作り出したりすることができるのです。
7. できあがり
これらの処理が、すべてのポリゴン、ポリゴンによるすべてのドットに対して行われ、結果、ポリゴンが無事画面に描画されます。
お疲れ様でした!
このポリゴン、最近のグラフィックカードでは(最速で)1秒間に2億個ぐらい表示可能です。恐ろしいですね。
補足. グラフィックカードがなぜ速いのか
さて、これらの複雑な処理はグラフィックカードで実行されるのですが、なぜグラフィックカードはこんな複雑な処理を速く実行できるのでしょうか。
だって、考えてみてください。
画面の大きさが、最近では小さめの 1024 x 768 だったとしても、約78万ドットに対して、グラフィックカードはこの処理を行わないといけません。
しかも、これを1秒間に60回も描画する場合、1秒間に4700万ドットも処理することになります。大変な量です。
最近のグラフィックカードでは、並列処理を行うことによって、速度を向上させています。
つまり、ドットごとの処理を、沢山のプロセッサが処理してくれるのです。
こうすれば、プロセッサの数だけ、処理が速くなります。
更に、ドットごとの処理は完全に独立しているので、ドット処理に関してはプロセッサ数に比例して速度が向上します。
なので、グラフィックカードの速度は、このプロセッサ自体の速度と、プロセッサの数が速度に大きな影響を与えます。
最近のグラフィックカードのスペックで、コア数とかプロセッサ数とか言っているのはこのことです。
画面が大きくなればなるほど、ピクセルシェーダが複雑になればなるほど、これらの影響は大きくなるというわけです。