次世代機スタディ

説明実験其の壱。やっぱり図がないと文章だけではつらい。
其の弐:GIまわりを修正。


//////////////

次世代機のグラフィックについて

次世代機に特有の知識について説明する。
ここではプログラマーを対象として、グラフィック(特に光と影)の知識について述べる。


「物体を見る」という行為は、「物体で反射された光を網膜で捉える」ということである。これがゲームの場合は「物体で反射された光をモニタに映す」となる。現実世界での光は、光源から出てあちらこちらで減衰しつつ反射しながら網膜に到達する。そのため、直接光が当たっていない部分も真っ暗にはならず、影も輪郭がぼやけて出る。ゲームの世界でこのような光の動作を処理すると、処理に時間がかかりすぎてゲームにならない。そのため、処理が軽くて済むような光と影の処理が今までに考案されており、ここではそれについて解説する。


まず、光と影に関する処理は、おおまかに三つに分けられる

  • 影:物体に遮られてできる暗い部分(ボールの下の床にできる暗い部分)
  • 陰:光に対する角度によってできる明暗(ボールの中心は明るくて外側は暗い)
  • 光:反射した光、光の溢れなど(白い玉の下に赤い床があると玉の下も赤っぽくなる、ブレーキランプにできる光の十字架、など)

これらの処理を組み合わせて使うことが多い。また、同じ「影」に属する処理でも複数使われることもある。以下、それぞれの処理について詳しく説明する。

ここで言う「影」とは、ゲームで言えば「キャラクターの足元にできる暗い部分」などにあたる。これを作成するために以下の手法が存在する。

  • 投射テクスチャマッピング(=投影影、プロジェクトシャドウ)
    • 光源から見た物体をもとに影を作り、それを背景(床、壁)に書く。
      • 初歩的な影生成の手法で、処理が軽くて済む。しかし、机の上にボールがあっても、机の下にボールの影ができてしまうなどの問題がある。
  • シャドウボリューム
    • ポリゴンを光源の逆方向に伸ばして、それに含まれていたら影。
      • 物体の裏側にまで影をつくってしまう、透明な部分があっても真っ黒な影ができるなどの問題がある。
  • シャドウマップ(=デプスシャドウ、シャドウバッファ)
    • 光源から見えないところは影。
      • 近い部分の影のふちがギザギザになる。

また、影の生成でよく問題になるのが以下である。

  • セルフシャドウ
    • 自分で作った影が自分の上にも落ちるか(手を目の前にかざして、顔に手の影ができるか)。投射テクスチャーマッピングだとできない。
  • 半影
    • 影の境界がくっきりしすぎるとリアルじゃないので、ぼかしが必要。上記の手法はどれもそのままだと境界がはっきり出てしまう。


参考リンク

ここで言う「陰」とは、「光の方向に向いてるものほど明るく、そうでないほど暗い」という明暗表現を指す。これを実現するために、以下の手法が存在する。

  • フラットシェーディング
    • 単純にポリゴンの面と光線の角度から明るさを求める。
      • ポリゴンの継ぎ目がわかってしまう。
  • グーローシェーディング
    • 求めた色をグラデーションでつなげる
  • フォンシェーディング
    • 面の角度を徐々に変化させたと仮定して明るさを求める


ポリゴンの傾きを使わずに陰を表現する手法もある。

  • バンプマッピング
    • テクスチャに「面の傾き(=法線)」を記録しておき、それをもとに明るさを求める。
      • 細かい凹凸をポリゴンで作らずに済むため、ポリゴンの節約になる。
  • 視差マッピング
    • バンプマッピングの発展版。さらに、立体視のように浮き出て見える。
      • 近づいてもただのテクスチャだとばれにくいが、横から見ると平らなまま。


参考リンク

上の陰と影では表現できないものをここでは「光」としてまとめて考える。

  • グローバル・イルミネーション(GI)
    • 現実世界の光の処理を実際に再現してみる手法
    • 光が当たらないところは暗くなるので、陰と影を扱える。また、物体の反射光も扱うことで「照り返し」も扱える。
    • 時間がかかるので、事前に計算しておいて使うのが一般的
      • 視点からの計算:視点から出た光をもとに計算を行う。
        • レイトレーシング
          • 光が物体にぶつかる度に屈折光と反射光をつくっていき、それらの結果をまとめてその視点の色にする。
          • いかにもCGというグラフィックになる
        • 分散レイトレーシング
          • 光が物体にぶつかる度に本来の方向に加えて少しばらけた光をいくつか飛ばし、それらの結果をまとめてその視点の色にする。
          • 光がばらばらに散らばる「拡散反射」が上手く扱えない
        • パストレーシング
          • 光が物体にぶつかる度にランダムに次の方向を決定していく。それを同じ視点で何回かやって、その平均をその視点の色にする。
          • 乱数の精度と実行回数によってグラフィックの質が変わる
        • ファイナルギャザリング
          • 光が物体にぶつかる度にそこからたくさんの光線をランダムに飛ばし、それらの結果をまとめてその視点の色にする。
      • 照明からの計算:光源から出る光をもとに計算を行う:上の方法の精度や速度を上げるために使用される
        • ラジオシティ
          • ポリゴンの代わりに面素に分割して、それらをもとに計算を行う。
          • 鏡のように純粋な反射を起こす「鏡面反射」が上手く扱えない
        • フォトンマッピング
          • 光源からフォトンと呼ばれるものを飛ばして、それらの行き先を記憶しておく。あとはそれをレイトレーシングなどで参照する
          • 飛ばすフォトンの量を多くしないと、不自然な斑(まだら)模様ができる
  • アンビエント・オクルージョン(AO)
    • 陰と影の簡易表現。その点からランダムにたくさんの光を飛ばしてみて、たくさん物体に当たればその点は暗い。
      • 陰も影も同時に表現できる。半影が表現できる。
  • 環境マッピング
    • 鏡のような反射の簡易表現。まわりを箱で覆って、その箱の内面を反射する形で表示する。
      • 箱の内面には、その物体から見える画像をはりつける。
  • ハイダイナミックレンジ(HDR
    • 現実世界の(幅の広い)色と光をディスプレイ上で表現する手法。普通は減色しないと表示できないので、減色処理まで含める。
      • トーンマッピング:減色処理。処理内容を場面によって変えることで「目の明るさ(暗さ)への慣れ」を表現できる。
      • ブルーム(=グレア、ライトブリーディング):夜中の車のライトに見えるような光の溢れ表現を行う。

資料抜け

  • 「光」の項の参考リンク
  • 屈折

雑記

シェーダ(頂点シェーダ、ピクセルシェーダ)は階層が一つ違う気がするので、ここでの説明は省略。「光」の項も階層的に微妙か?あとでもう少し考える。


必要
・「処理が重い→処理に時間がかかる」など、超初心者にもわかるような置き換え
・論文のときのように、背景を示す


なんか味気ない。
→ルー語変換してみる?
→すげぇわかりづらそう


大学へのリンクは怖いな。学期が変わったり教授が異動したりで、消える可能性が他所より高い。
Wikiも書き換えられる可能性あり
→個人サイトも閉鎖の可能性あり
→ブログもエントリ削除やプライベートモードなどに移行する可能性あり
→それでも大学のは他より消える可能性が高いな。


やはり、「誰かに説明する」という行為は「自分の為」でもあるな。特に「構造化しよう」という意図が働くことにより、自分の理解が進むのは大きい。


説明する際には相手の思考誘導まで考慮する。例えば、「〜してしまう」と書くことで、それがデメリットであることを伝える、みたいな。ここは詭弁と同じ論理な気がする。何か使える詭弁パターンはないかな?
「〜できる」だとメリットになる。「〜する」だとメリットなのかデメリットなのかわかりにくい。


疲れたのでひとまずここまで。


///////////


Distribution Ray Tracing:分散レイトレーシング:レイを少し分散させるレイトレーシング
Distributed Ray Tracing:分散レイトレーシング:分散コンピューティングでレイトレーシング
ただし、Distribution Ray TracingはもともとDistributed Ray Tracingという論文で発表されたもの。
わかりづらっ!!


ソフトによって、ラジオシティじゃないんだけど表示はラジオシティになってるのがあるらしい。他の機能も同様のことが起こっている可能性がある。なので、特定のソフトでの名称ではなく、原典に当たる論文で判断すべき。面倒。


分散レイトレとかパストレーシングとか、説明がサイトによって違ったりするので確認作業が煩雑。原典の論文をあたるのが確実なんだろうけど、やってない。なので、特にGIまわりに関して間違ってる可能性が高い。現在は「名称」をもとに判断している。
パストレーシング:「光線が当たったところから大量に次の光線をつくり、ランダムに飛ばしてそれらの結果をまとめる」「パスが一つになるように決定していく」の二種類が確認され、どっちが正しいのか、あるいはどっちも正しいのか。


よくよく考えると、「正しい」かどうかは自分にとっては割りとどうも良いな。二つの説があれば二つの説をどちらも取り込めばよい。今まで何がなされたかを記憶しておいて必要なときに取り出せればよい。「使える」ことが重要か。でも、てけとーはやっぱりまずいよなー。


簡易表現を用いるため、ある程度の誤解が生じるのは仕方がない。ただ、構造的な誤解が生じるのは避けたい。例えば「円の面積の求め方」ならば「公式」はきちんと理解して欲しくて、「計算結果」が切捨てなどで微妙にずれるのは許容する感じ。さらに言えば、何故その公式でよいのかといった部分まではきちんと。


たぶん、文章をもっと平易なものに変えるだけでも読みやすくなるはず。時間的にもうそんな余裕はないけど。
→どうせ報告用にまとめる必要があるし、その時にでも。


ファイナルギャザリングは何回見ても必殺技の名前にしか見えない。


/////////


バンプマップまわりの参考リンク追加。