スライド 1

プロジェクト演習Ⅳ
インタラクティブゲーム制作
プログラミング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上で利用できるよ
うに移植してみよう
– 煙のサンプルについては移植した例があるの
で、そちらを参考にするとよい