プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4 2012/11/21 Inside of 3DCG 今日の内容 • リアルタイム3DCGの描画処理の流れを 知ろう – FKの内側を少しだけ解剖します • ネット上のサンプルや、他のライブラリ との連携がやりやすくなる! – シェーダプログラミングもやりやすいはず 描画処理の流れ • 多くのライブラリは 「描画」しかできない – OpenGL、Direct3Dは もちろん、XNAやDXライ ブラリもそう • これらのライブラリを用 いた場合は、自分で右の 流れを組む必要がある 1. 画面をまっさらに 塗りつぶす 2. カメラの位置と向き、 その他諸々をセット 3. 描画したいモデルの 座標系をセットする 4. 三角形をたくさんたく さんたくさん描画する (3,4をモデルの個数分) 5. 描き上がった画面を まるっと差し替え FKの最大の特長 • 形状-モデル-シーン-ウィンドウからなる 階層構造 – なかでもモデルの存在は大きい • 同じ形状を複数描画する際の効率化 • 位置、姿勢、スケールの柔軟な制御 • シーンへの登録制による描画処理のカプセル化 • 他にも特長はあるが、あまりゲーム向き ではない – 形状自体の高度な変形、編集操作など FKのデメリット • カプセル化しすぎてて、融通を利かせる のがちょっと難しい – 形状ごとに描画処理内容が固定されており、 自由に実装することができない – 一般的な描画処理の流れが隠蔽されており、 処理のイメージをつかみづらい • これらを紐解きつつ、自分でいじりたい ところのいじり方を伝授したい 描画処理の解剖 • エントリーした順に 画面上の領域を塗り つぶしていく – 画面上のどの位置を塗 りつぶすかは、カメラ の座標系とモデルの座 標系で決まる – どのような色、画像で 塗りつぶすかはマテリ アルやテクスチャの設 定と、光源と法線ベク トルで決まる !? 何故こうならずに済むのか? • エントリー順に塗り つぶすのであれば、 右のようになってし まうはず • 奥のものから順番に エントリーしないと いけないようだが、 実際は大丈夫 • 何故か? デプス(深度)テスト • 塗りつぶす際に、その ピクセルがカメラから どのくらいの距離かを 記録していく – 色で表すと右図のような モノクログラデーション になる • 実際に塗りつぶす前に ピクセル単位で距離を 比較し、手前の位置に くる部分だけを塗りつ ぶす 半透明との組み合わせによって 起きる問題 1. 手前に半透明物体を描く – – この時点では奥に何も描 かれてないので、 背景とのブレンド結果で 塗りつぶす 当然デプス値にも手前の 距離を書き込む 2. 奥に物体を描く – – 上で手前の距離値が書き 込まれている部分は塗り つぶされない 半透明物体を描いた領域 は「背景とのブレンド結 果のまま」になる !? 考えられる対策 • 半透明物体の描画順を後回しにする – 半透明物体同士の順番も、出来るだけカメラから 遠い順になるようにする • カメラの最前面に来るような物体(パラメー タやメッセージなど)はオーバーレイ描画を 使う – FKならばentryOverlayModel()を使えばよい • 半透明物体はデプス値に影響を与えないよう にする – 今後もちょくちょく使うテクニック 2段階のデプス値制御命令 • これから描く物体は「デプス値に従って前後 関係を解決する」or 「その場所がいかなる 距離でも無視して上書きする」 – glEnable(GL_DEPTH_TEST) – glDisable(GL_DEPTH_TEST) • これから描く物体は「描画する際にデプス値 も一緒に更新する」or「描画する際にデプス 値は参照するが更新はしない」 – glDepthMask(GL_TRUE) – glDepthMask(GL_FALSE) 目的別デプス制御状態まとめ • 通常の描画 – デプステスト有効、デプス値書き込み有効 • オーバーレイ描画 – デプステスト無効、デプス値書き込み有効 • 背景の後書きを邪魔しない半透明描画 – デプステスト有効、デプス値書き込み無効 アルファ値の扱いについて • マテリアルとテクスチャで2段階のアルファ 値(透明度)が扱える • アルファ値は0で完全透過を表す – アルファ値0のピクセルは描画領域から除かれる ようになっており、デプステストからも外れる – これをアルファテストと呼ぶ • FKではデフォルトで有効になっている • 1で完全不透明となり、その間の値は半透明 としてブレンド処理が行われる – FKの場合はfk_Sceneでの設定が必要 制御命令ぶっ込みポイント • 先ほどの処理の流れ に注目 • fk_Modelを継承する とこのポイントに割 り込みが可能 preShader() postShader() • preでいじってpostで 戻せば無問題! 1. 画面をまっさらに 塗りつぶす 2. カメラの位置と向き、 その他諸々をセット 3. 描画したいモデルの 座標系をセットする 4. 三角形をたくさんたく さんたくさん描画する (3,4をモデルの個数分) 5. 描き上がった画面を まるっと差し替え どんな命令を突っ込めるか? • デプス値制御命令 • アルファブレンド制御命令 – glBlendFunc() • (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)がデフォ • (GL_ONE, GL_ONE)にすると加算ブレンドになる • シェーダ処理命令 • 独自の描画処理命令 • preでいじった状態値はpostで戻すこと とても参考になるサイト • PROJECT ASURA – http://asura.iaigiri.com/top.html – XNA中心ですが、OpenGLによる実装サンプ ルも豊富です – あくまでターゲットにするスペックの範囲で やれることを探してみるのも良いでしょう まとめ • 一般的な3DCGプログラミングにおける 処理の流れを把握 • 描画処理の各段階において何が行われて いるかを知る • デプス、アルファなどの挙動と制御 • 正しい見た目の表現と、外部サンプルを うまく取り込むための基礎知識 今日の課題 • 「PROJECT ASURA」に掲載されている エフェクトのサンプルのうち、自分たち で使いそうなものをFK上で利用できるよ うに移植してみよう – 煙のサンプルについては移植した例があるの で、そちらを参考にするとよい
© Copyright 2024 ExpyDoc