2013年2月9日土曜日

3Dレンダリングパイプライン

ということで、次は3Dレンダリングパイプライン(3Dレンダラー)の作成に挑戦してみることになった。 匿名の方から3Dレンダリングパイプラインをやったらというコメントを頂いた。 3Dグラフィック関係は本を読んだり、OpenGLで少し遊んだ程度の知識しか無いが、面白そうだし、いつかやってみたいと思っていた。また、数値演算回路ももっと経験したいので、次のテーマとして選んだ。

上に書いたとおり3Dグラフィクスの描画回路というのは経験ないのだが、2Dの超簡単なものなら経験している。dvi_encにはデモ機能として以下のようなスプライトが組み込まれている。
これは、64x64ピクセルのTux(Linuxのマスコット)君の画像が回転しながら画面内を移動するというもので、VRAMやフレームバッファを使わずに動的に座標計算しながら表示している。


以下がその部分のRTLだ。


原点に対する座標(x,y)の回転は、回転後の座標をx', y' とすると、

   x' = x cosΘ - y sinΘ
   y' = x sinΘ + y cosΘ

で求まる。上記RTLでは基本的にこの計算を行っている訳だが、同期信号生成部からは入力として回転後の座標が入ってくるので、イメージ的に逆方向の演算を行っている。つまり、入力された座標値(x', y')からx, yを求め、これがTux画像の範囲に入っているか否かを判定し入っている場合は対応するピクセル値を出力している。

さて、3次元グラフィクスだが、Wikipediaの「グラフィクスパイプライン」やその他サイト等の情報から、3次元グラフィクス描画処理はジオメトリ演算とピクセル演算に大別されるようだ。モデル(描画する物)は個々に幾何的情報(寸法等)と色、質感(光の反射率等)の情報を持つ。これらのモデルを共通の3次元空間(ワールド座標系)に配置し、それらが視線方向に直角な平面(スクリーン座標系)に投影されることで立体的な画像になる。ジオメトリ演算はこれらの座標の演算処理で、モデリング変換(ローカル座標系からワールド座標系への変換→物体をワールド座標に配置)、陰影づけ、視点変換(視点座標系への変換)、投影変換(クリッピング処理)、ビューポート変換等を行うようである。その後のラスタライゼーション処理でピクセル演算処理が行われるらしい。

まずはジオメトリ演算系の検討から始めようと思う。


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 22

今使用しているモータードライバはDM556Dというものだが、このドライバはMicro Stepが 800 [pulse/rev] 〜 40000 [pulse/rev]の範囲で設定できる。 Mi...