Zaurus GA 3D Engine マニュアル【3D Engine 解説 詳細説明編】 Copyright 1999-2000 小笠原博之 GA 3D Engine 固有の部分に踏み込んだ詳しい解説を行います。 ●座標空間 ・2Dピクセル空間 画面の左上を原点 (0,0) として、右下に増加する 2D 座標系を取ります。レンダリン グ領域が 160x160dot の場合、左上が (0,0)、右下の座標が (159,159) になります。 ・3D座標系 画面の中央かつカメラ位置を原点とします。座標は 32bit(16:16) の固定少数値(DVAL 型)で表現されます。 X軸→ 画面に向かって右方向に増加 Y軸↑ 画面に向かって上方向に増加 Z軸 画面に向かって奥方向に増加 ●描画プリミティブ ・3D描画 GaDrawPrimitive() GaDrawModel() この2つの関数は、引数の種類が異なるだけで内部では全く同じ処理を行っています。 描画プリミティブは現在トライアングルのみで、頂点リストと、頂点を結合するため のインデックスリストの2つの情報を与えます。 描画設定により、トライアングルの描画はさらに以下の多くのバリエーションを持っ ています。 光源処理 テクスチャ グーロー ------------------------------------------------------------------------- 光源なしソリッド なし なし なし フラットシェーディング あり なし なし グーローシェーディング あり(モノ) なし あり 光源なしテクスチャマッピング なし あり なし テクスチャフラット あり(モノ) あり なし テクスチャグーロー あり(モノ) あり あり ・2D描画 GaDrawPattern() GaDrawPatternFast() GaDrawPatternCopy() 自由に座標指定ができる2D描画関数は上記の通りです。2D描画はテクスチャパターン 上の任意の矩形のバッファ転送で、それぞれの関数の違いは次の通りです。 拡縮 カラーキー クリッピング ---------------------------------------------------------------------- GaDrawPattern あり あり あり GaDrawPatternFast なし あり あり GaDrawPatternCopy なし なし なし ・フレームバッファクリア GaClear() GaDrawBg() 各フレームの最初に、フレームバッファのクリアが必要になります。フレームバッ ファの全消去命令として上記の2つを用意しています。 GaClear() 任意カラーでクリア GaDrawBg() 任意の画像でクリア アプリケーション上の描画で、画面をすべて埋め尽くしてしまう場合は特にクリアを 行う必要はありません。GaDrawBg() ではなく、代わりに GaDrawPatternCopy() を使 うこともできます。 ●描画順について 各描画命令は、フレームバッファ(バックバッファ)に対する単純転送で、必ず命令発 行順に重ね書きされます。Zバッファは処理速度に難があるため実装していません。 そのため、描画プリミティブはあらかじめ描画順を考慮してソートしておく必要があ ります。 スプライトライブラリを使うと、オブジェクト単位でソーティングを行うことができ ます。この場合オブジェクト内の位置関係はソートされないので、形状によっては正 しく表示されないことがあります。 Z-sortライブラリを使うと、より厳密にポリゴン単位でソートを行うので、ある程度 複雑な形状にも耐えます。その代わり処理が増えるために速度は大きく落ちることに なります。 ●クリッピング 描画クリッピングは、BG転送用2D描画命令を除いて正しく行われます。ただし 2Dク リッピングのみなので、3D空間におけるクリッピング(特にフロントクリッピング)は 必要に応じてアプリケーションで行わなければなりません。 ポリゴンはすべて時計周り(CW、右回り)を表面とみなします。裏面は描画されません。 ●ジオメトリ演算 ジオメトリ演算は、トランスフォームマトリクスで指定を行います。この中にプロジェ クションは含まれません。 ●マテリアルと光源計算 光源演算用のマテリアルパラメータと計算式は以下の通りです。描画する色情報(Pn) を出力しています。 環境光 Ambient (An) 拡散光 Diffuse (Dn) 反射光 Specular (Sn) Pr= intensity×Dr+Ar Pg= intensity×Dg+Ag Pb= intensity×Db+Ab 現在 Specular は使用していません。Alpha もすべて無視されます。光源カラーは含 まれていませんが、アプリケーション側で事前に光源色とマテリアル色を乗算した値 を Diffuse に設定することで対応可能です。 Ambient はただのマテリアル加算なので、シーン全体の AmbientLight を正しく計算 するには、AmbientLight×AmbientMaterial の値を Ambient に設定しておく必要が あります。 グーローシェーディングは、残念ながら現在モノライティングに制限されます。同様 にテクスチャを使った場合も、テクスチャマップブレンディングができないため無条 件でモノクロライティングとなります。モノライティングの場合、出力カラーのうち Pb の値だけ使用します。 ●テクスチャ テクスチャ画像は、RGB565 の 16bit ピクセルのみ対応しています。それ以外のピク セルフォーマットを持つ場合は、メモリに読み込んだ時点で変換しなければなりませ ん。 Direct3D など一般の 3D API 同様、テクスチャにはサイズ制限があります。 ・3D系描画関数で使う場合 画像サイズは 2 の n 乗サイズの正方形固定になります。光源処理を行う場 合は、必要に応じて展開レベルの指定が必要になります。光源処理が不要な ら展開レベルは 0 で構いません。 サイズの例: 8x8、16x16、32x32、64x64、128x128dot など。 ・2D系描画関数で使う場合 画像の横サイズは 2 の n 乗ドット固定です。縦のドット数には今のところ 制限はありません(偶数ドットにしておくのが無難)。2D では光源処理がな いので、展開レベルは必ず 0 にします。 サイズの例: 128x100、256x160 など。 ・特殊 BG専用画像は、GaDrawBg() 関数を使う場合に限り 160x160dot の画像データ を用いることができます。2のn乗サイズではフレームバッファサイズに合わ ないため、特例として専用命令を設けました。 テクスチャマップに対して光源処理を行う場合は、あらかじめ展開レベルを指定して おかなければなりません。これは階調表現を先に作っておく必要があるからで、大量 のメモリを消費します。また、階調はモノライトでありマテリアルによるサーフェー スカラーの色合成(テクスチャマップブレンディング)は行われません。 テクスチャはメモリを大量に消費するので、アイクルーズMI-EX1 や MI-C1 より前の Zaurus では、ヒープメモリが足りなくなることがあります。この場合は画像サイズ を小さ目にしておくか、光源処理を控えるかの対処が必要となります。 ●テクスチャ座標 テクスチャ座標は、頂点単位に u, v で指定します。(u, v) は、マッピングするテ クスチャ画像上の2次元座標になります。この値は 0〜1.0 の少数値で指定し、画像の 左上原点が (0,0) となります。 本来であれば、ここに 1.0 より大きな値を入れることでテクスチャリピートを表現 できるのですが、元バージョンではサポートしていません。 ●頂点形式 固定少数値である以外はほぼ Direct3D (ImmediateMode) に合わせた頂点フォーマッ トにしてあります。これは、モデルデータを取り扱うツールとの相性を考慮したため です。 ●フラットシェーディングと色との関係 グーローシェーディングにも対応していますが、速度の問題から実用になるのはフ ラットシェーディングのみと考えられます。 フラットシェーディングの場合、頂点リストのうち最初の頂点の法線及びカラーをポ リゴンの情報として使用します。残りの頂点の法線と頂点カラーは参照されません。 共有頂点でモデルを作る場合は頂点並びの順番に注意する必要があります。 ●アライメント整合 RISC CPU なので、アライメント整合には十分を気を遣うようにしてください。DVAL を初めとする多くのデータは、4byte(32bit) のアライメントに従う必要があります。 DPIXEL などの画像データも、アドレス上は 4byte 単位で並んでいなければなりま せん。 ●高速化のために すべてソフトウエア処理で行っているため、メモリアクセスが大きなボトルネックと なります。一番大きいのはパターン描画で、特に背景やテクスチャの転送は大きな負 担です。 演算負荷より描画負荷の方が大きいので、高速化のためには、演算を多くしてでもで きるだけ不要な描画を避けるようにしてください。 当たり前ですが、割り算は掛け算に比べてたいへん低速です。1割り算あたり、10〜20 乗算以上のコストがかかります。できる限り割り算を減らして乗算を使うようにして ください。 3D で最も高速な描画は、テクスチャなしのフラットシェーディングポリゴンです。 光源計算そのものはたいした負荷ではありません。 ●メモリを節約するために 旧タイプの MI Zaurus は、ヒープメモリが少なく 800Kbyte しかありません。この メモリ上に演算領域からワークメモリ、バックバッファ、テクスチャメモリが確保さ れます。 テクスチャの光源処理は大量にメモリを消費するため、十分効果を考えて使うように してください。 [例} 64x64dot のテクスチャで、展開レベル 4 の場合 128Kbyte 消費する ソリッドポリゴンの場合は光源処理が必須ですが、テクスチャを貼った場合は、光源 処理が無くても、テクスチャの画像で十分クオリティを高めることができるでしょう。 アイクルーズ MI-EX1、MI-C1 など新タイプの Zaurus は、ヒープメモリが 5Mbyte もあります。こちらの機種では、ほとんどメモリを心配する必要はありません。 ●演算精度に注意 固定少数値は注意していないとあっという間にオーバー(アンダー)フローします。3D 空間はレンジが広いので、演算時は数値範囲に注意してください。 2000/01/08 作成 2000/01/15 修正 小笠原博之 oga@art.udn.ne.jp http://www.vector.co.jp/authors/VA004474/