Cgとは?
そもそもCgって何をするのかとか,そーゆー話をまとめようと思う.
サンプルコードやwebで調べた上での自分なりの解釈だから,間違ってたらゴメンなさい.
Cgはグラフィックスハードウェアを使ってレンダリングするオブジェクトのshape, appearance, motionをプログラムレベルで制御するための言語.このような言語をシェーディング言語(GLSLやHLSLも同じ)と呼んでいるが,Cgはシェーディングに限った能力だけではなく,例えば,物理シミュレーション等も行える.
シェーディング言語はdata-flow computational modelに基づいているという点が,他の言語と違う理由.このモデルでは,処理の一連の流れを通して流れるデータに対して計算が生じる.
Cg言語のプログラムは,レンダリングを行う時に,バーテックスとフラグメント上で処理を行う.Cgプログラムをブラックボックスだと考えてみる.あるサイドからバーテックスやフラグメントが入力され,何らかの処理を加えられて,別のサイドから出力される.ブラックボックスの中身は,Cgプログラムで指定した処理が行われる.
3dシーンをレンダリングしながらバーテックスが処理される(ラスタライザがフラグメントを生成する)度に,Cgプログラムがそのバーテックスやフラグメントを処理している.
Cgプログラムを利用するには,GPUが必要.
C/C++で書いたプログラムからCgプログラムをロードするためにはCgランタイムを使う.CgランタイムはCgプログラムをload, compile, manipulate, configureするためのサブルーチンのセット.C/C++のプログラムからGPUに対して,どのようなレンダリングを行うか(どのようなCgプログラムを使用するか)を指定してあげる.
どうやってGPUが画像をレンダリングするか.
簡単に流れをまとめると
- vertex transformation: バーテックスを座標変換
各バーテックス上で数学的な処理の流れを行う.これは,バーテックスの座標から,スクリーン上のどの座標に表示するのか?という座標変換をラスタライザによって行う.
この処理が終わった段階では,GL側から渡されたバーテックスの座標(おそらく3次元)がスクリーン座標系での座標になっている. - primitive assembly and rasterization: 座標変換されたバーテックスをフラグメントに変換
まず始めに,座標変換されたバーテックスを幾何学的primitive(線,ポリゴンなど)へと変換する.この処理によって,単なる点群データだったバーテックスが,意味がある図形?のようになる.この段階で,スクリーンに表示されない部分は捨てられるみたい.
捨てられなかったポリゴンがラスタライズされる.ラスタライズとは,幾何学的primitiveが存在する画素を決定する処理.例えば,三角形があるとすると,その内部の画素は全て幾何学的primitiveが存在する画素となる.
素とは,ある特定の場所におけるフレームバッファのコンテンツ(カラー,デプスなど)を表す.一方で,フラグメントはある特定の画素を更新するために潜在的に必要とされている状態を表す. - fragment texturing and coloring: フラグメントに色づけ
幾何学的primitiveがフラグメントの集合へとラスタライズされると,次は,テクスチャやカラーの内挿をい,最終的なカラーを決定. - raster operations: 色がついたフラグメントをピクセルに
フレームバッファの更新の前に,最終的なフラグメントレベルでの処理のシーケンスを行う.隠れている部分を消したりなど.
このような流れで,バーテックスからレンダリングする画像を生成する.