コンピュータグラフィックスの本質
Essentials of Computer Graphics
2015.08.27
Updated by Ryo Shimizu on August 27, 2015, 15:07 pm JST
Essentials of Computer Graphics
2015.08.27
Updated by Ryo Shimizu on August 27, 2015, 15:07 pm JST
コンピュータグラフィックスの学術研究機関であるUEIリサーチをドワンゴに移管してから一ヶ月が過ぎようとしています。
まだ内装工事も住んでいないので、私も秋葉原にあるUEI本社と銀座のドワンゴとを毎日行ったり来たりする生活が続いています。
先日、UEIリサーチの絡みで、ロサンゼルスで開催された世界最大のコンピュータグラフィックス学会、SIGGRAPHに行ってきました。
SIGGRAPHへの参加は久しぶりでしたが、相変わらず熱気あふれる楽しい学会でした。
しかし同時に、「イノベーションがなかなか起きにくくなってる分野だな」とも感じます。
コンピュータグラフィックスは、ひたすらリアリティを追求するしかなくなります。しかしいま現在、映画のほとんどの場面はコンピュータグラフィックスです。コンピュータで処理していない場面はないと言っていいほどです。これ以上のリアリティをどこに求めればいいのでしょうか。
結局、今年の学会では、動きの生成にディープラーニングによる人工知能技術を適用した例が少しと、モンテカルロ法という、色を確率的に求める物理学ベースレンダリングの手法の平滑化、高速化といったものが技術論文の目立った内容でした。
時折、コンピュータグラフィックスを学びたい、という学生を指導することがあります。今の学生はそれぞれバラバラの要素技術は知っていても、統合された知識として体系的には知らないことがあまりにも多く、逆にその事実に驚かされています。
とはいえ地頭は良いので教えがいがあるのですが、私が学生の頃はコンピュータグラフィックスが生き様そのもの、といった感じでしたので、一見すると凄いプログラムを書いているのに、コンピュータグラフィックスの知識はほとんどない、というギャップに驚いたのです。
逆に言えば、知識なしでも凄いプログラミングが出来てしまうのが今の技術の凄いところです。
たとえばUnity3Dを使えば、コンピュータグラフィックスに関する知識が完全になかったとしても、それを学ぶことなく3Dのゲーム開発が可能です。
以前、UEIにインターンに来ていた成蹊大学経済学部の学生は、Kinectによる三次元空間キャプチャと通信を組み合わせたオンラインテニスゲームをわずか半年で作ってしまいました。彼はインターンとしてUEIに来るまで、全くプログラミングの経験がなかったのです。おどろくべきことです。
私が学生の頃は、到底、通信と空間認識とコンピュータグラフィックスを同時にやるなんていう離れワザは、想像することすらできませんでした。
しかし今は専門知識がなくても、なんとなくそこまで出来てしまうのです。
とはいえ、基礎がわかっていればより幅広い応用が可能になります。
そこで気まぐれに学生にコンピュータグラフィックスの基礎を教えてみたくなります。
そして学生に基礎を教えているうちにコンピュータグラフィックスという分野の本質を不意に思い出したのです。
コンピュータグラフィックスの本質は、「インチキ」です。
最適化でも高速化でもなく、インチキが本質なのです。
どういうことでしょうか。
コンピュータグラフィックスの基礎中の基礎は、ポリゴン(多角形の面)に当たる光量の計算です。
3Dコンピュータグラフィックスでは、画面に登場する全ての要素を三角形のポリゴンの集合体として扱うのが一般的です。このポリゴンを綺麗に塗り分けることでリアルな質感を出しているのです。
あるポリゴンの色がどのくらい明るい色になるか計算するためには、そのポリゴンが光源からどのくらい光を浴びるかを計算する必要があります。
そこで、ポリゴンに当たる光量を計算するには、ポリゴンの法線ベクトルというものを利用します。
通常「面(ポリゴン)の法線ベクトル」とは、ポリゴンから垂直に伸びる長さ1の単位ベクトルを意味します。
この法線ベクトルNと、ポリゴンから光源に向かって伸びる別の単位ベクトルLを想定します。
この法線ベクトルNと光源ベクトルLの内積がポリゴンが光源から受け取る光のエネルギー量になります。
ベクトルの内積というと大げさに聞こえますが、要は光に向かってポリゴンが向き合っていれば1、全く向き合ってない、90度の状態なら0となるなめらかな関数が内積(ベクトルNとベクトルLのなす角をθとした場合、cosθ)で計算するのがちょうどよいからです。
さて、この方式を使って立方体を描画すると、下図のようになります。
見えている3つのポリゴンは全て同じ色ですが、右側だけ暗い色になっているのは、光源から与えられる光のエネルギーが少ないから影として表現されているというわけです。
さて、この段階ではなにもインチキはありません。
しかし、例えば球体を描画してみるとしましょう。
通常の3Dプログラミングでは、画面上に表示する全ての物体をポリゴンの集合として表さなければならないので、球体といえど完全な球体は表現できません。
そこで、正100面体などの多数のポリゴンが集まって球状の形をしているもので近似するのですが、近似しただけでは球には見えないのです。
実際、そのような球体を先ほどと同じ方法でレンダリングすると下図のようになってしまいます。
どうもボコボコして不格好です。
もちろんポリゴンをどんどん細かくしていけばいずれ肉眼では本当の球と区別できないほど滑らかになるはずです。あくまで理論上は。
しかしコンピュータグラフィックスという分野が生まれた1960年代は、コンピュータの処理能力は今からは考えられないほど低く、到底そこまで細かい多面体を表現することはできませんでした。
そこである「インチキ」が考えだされました。
球のような滑らかな物体を多面体で近似しようとすると、それぞれのポリゴンが隣接しているところは下図のようになっているはずです。
ポリゴンの法線を便宜上、それぞれのポリゴンの頂点ごとに伸ばしていますが、こんな感じで、法線が全く違う方向を向いていると、ここが色の境目となって滑らかに見えない原因となっています。
インチキをせずに真面目にレンダリングしようとすると、これが正しいのです。
しかし、処理能力の足りないコンピュータでなんとかなめらかな曲面を表現したいと思ったある科学者が、法線をインチキするという方法を考えだしました。
滑らかにしたい場合、隣り合う頂点の法線ベクトルを重ねて歪めてしまうという手法です。
法線の定義に従えば、本来、面に対して垂直でなければいけません。
しかし法線を歪めてしまって、面の頂点ごとに異なる向きを向かせ、間の色を補完していけば滑らかな面を創りだすことがデキると考えた科学者がいたのです。
明らかにインチキですが、この手法を用いて球体をレンダリングすると、下図のように美しいなめらかな球体が生まれます。
これがコンピュータグラフィックスの基礎中の基礎、スムースシェーディングの原理です。
スムースシェーディングには、色を線形に補完するグーローシェーディングと、法線そのものを補完してピクセルごとに光量計算を行うフォンシェーディングがあります。
ですがどちらにせよインチキであることには変わりありません。
むしろコンピュータグラフィックスは、いかに人間の視覚を欺き、リアリズム(現実への拘り)ではなくリアリティ(現実感)を追求してきたかという、幻惑と模倣の歴史なのです。
私がマジックバーにハマっているのも、もしかするとこのような性質が関係しているかもしれません。
マジックは人間の錯覚や心理の隙を利用して人間の想像を超える世界を体験させます。
コンピュータグラフィックスも同様に、人間の認知機能の限界を利用して計算の手を抜くという手法がごく普通に行われます。
私がコンピュータグラフィックスのプログラマーとして最も感銘を受けたコンピュータ・アーキテクチャは、初代プレイステーションです。
初代プレイステーションは、まるで魔法の玉手箱でした。
ありとあらゆる人間の目を欺く工夫が詰まっています。
たとえば初代プレイステーションのテクスチャマッピングは、二次元的に変形させただけで三次元的に正しい描画になっていません(三次元的に正しいテクスチャマッピングをパースペクティブコレクトといいます)。
普通に考えたら、そんないい加減なものを3Dでございますと言って出せないはずです。しかし、初代プレイステーションの設計を指揮した久夛良木健氏は天才でした。
「二次元的に変形させて、歪みが目立ってしまうなら、目立たないレベルまでポリゴンを分割すればいい」
という発想に切り替えてしまうのです。
他にも、Zバッファを使わずZソートをリアルタイムに行うためのオーダリングテーブルという工夫や、ムービーを再生するときは解像度を極端に落とす工夫など、ありとあらゆるワザとテクニックを駆使して人間の認知能力をだましています。
その後、プレイステーションは、2、3、4と進化していきましたが、私は初代プレイステーションの設計が一番好きです。
PS2もPS3も映像は格段に美しく、パワフルですが、そのやり方はブルートフォース(力任せ)です。
コンピュータ・アーキテクチャ的にはもちろんずっと進んでいるのですが、アーキテクトの創意工夫が一番盛り込まれているのは、やはり初代プレイステーションなのです。
最近、iOS版のファイナルファンタジーVIIが大好評で売れているそうです。
FFVIIは初代プレイステーションで作られたゲームの最高傑作といえるでしょう。現NVIDIAの橋本和幸氏がプレイステーションの設計に惚れ込んで作ったとんでもない怪物ゲームです。LISPハッカーであり、(称号ではなく)真の天才プログラマーが命を懸けて作った傑作です。
当時、駆け出しのプログラマーだった私は、FFVIIを見て「どんなインチキを使ったら、こんなに凄いプログラムが書けるのだろう」と度肝を抜かれたものです。
そういう目で初代プレイステーションのゲームをぜひ遊んでみてください。メモリがたった2MBしかありません。今ならデジカメの写真一枚も入らない容量です。大半のゲームの解像度はわずか256x256。初代iPhoneより粗い画面でした。テクスチャもよく見ると歪んでいます。FFVIIはテクスチャの歪みをほとんど全くといっていいほど感じさせないよう優れた設計をされています。キャラクターが全体的につるんとしているのは、テクスチャを下手に貼るとパースペクティブコレクトでないことがバレるからです。
「このテクスチャはこんなにゆがんでる。なのに今までぜんぜん気にならなかった!凄い!」
そんな発見が、初代プレイステーションのゲームにはたくさん隠されています。
初心に帰るというのはこういう心境なのでしょうか。
おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)
登録はこちら新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。