Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2009-09-09

僕が3Dプログラマをやめた理由 または3Dプログラミングを学ぶべき6つの理由 15:48

先日、ある方から「ところで御社には3Dプログラミングに詳しい方はいらっしゃるんですか?」と言われて、軽くショックを受けた。


うちは、もともとゲーム屋でもあるのだ。ゲーム屋とは、少し前まで、3Dプログラミングができないと名乗れなかったのだ。


僕は、それが流行するよりずっと以前から、3Dプログラミングを経験していて、著書もある。

Direct3Dプログラミングガイドブック

Direct3Dプログラミングガイドブック

3Dプログラムを最初に書いたのは7歳のとき。もちろん、数式の意味なんか解らなかった。なにしろ割り算すら学校では習ってないのだ。


本と、強電エンジニアの親父の特訓(?)とで、なんとかそれっぽいものを作ってるに過ぎなかった。


けれども、コンピュータの中に架空の世界を構築するという魅力に取り付かれ、それが原動力となってマシン語を学び、Cを学び、ハードウェアアクセラレーションを学び、データ資源の効率的な管理手法を学び、ゲーム開発に応用し、98年にマイクロソフトDirect3Dに関わるに至って、99年の春には僕の長い長い青春の日々が終わった。


当時、僕の得た結論は、結局、3Dプログラミングは単純なアイデアで問題を乗り越える時代を終え、数学や電磁気学、物理学を総動員して未踏領域を探していく分野に昇華してしまったということ。


99年頃まで、ゲーム機で使うリアルタイムの3Dプログラミングと、大学の研究室でやるような高度な3Dプログラミングは根本的に違うものだった。だから無学な僕にもチャレンジの余地があった。


しかし、マイクロエレクトロニクスが進化するにつれ、その境界は薄くなり、今や、完全に一致したと言っても良い。場合によっては、ゲーム技術の方が最先端の研究より先行している。



十分な学力のない僕はこの道をどれだけ行っても一流にはなれないことを知り、それで早々にその道を諦めたのだった。


ちょうどそのとき、コンピュータグラフィックスの世界的権威で、CGの教科書にも必ず名前が出てくる東大の西田友是先生と出会ったことも大きかった。



先生はこう仰っていた。


 「僕が若い時代は、なにをしても最先端だった。けど、いまの3Dプログラミングで最先端となるには、非常に難しいことをしなければならない。自分が3Dで身を立てることができたのは、誰もやっていなかった時代からコツコツずっとやってきたからであって、自分が特別賢かったというわけではない」



これは非常に得心のいく話で、僕はあっさりと3Dプログラミングというものを追いかけるのをやめた。


それから10年経って、なにが変わったかというと、実は、あまり変わっていない。


半年に一度バージョンアップすると言われていたDirectXは、僕が最後に触ったのはXbox360のDirectX9で、それから5年経った今でも最新のDirectXは10でしかない。来年頭には11になるらしい。


昔はめまぐるしくバージョンが上がっていたのに、ちょうど停滞している。性能向上のネタが尽きたというのと、ハードウェア化できるアルゴリズムのネタが尽きかけているのだ。


そういう部分が停滞しているのと、そもそも最新のDirectXの機能アップポイントは難し過ぎる。かなりの専門家でないとDirect3D11の新機能を全て使いこなすのは難しい。


DirectXのバージョンアップがそもそもDirect3Dのバージョンアップをほぼ直接的に意味するようになって久しい。



それだけ3D技術は進化が激しく面白かったし、今現在も進化を続けている。その意味で驚異的だ。

僕の経験上、同じくらい早いスピードで進化した技術がある。携帯電話だ。それもこの10年で再び停滞した。


どうも熱い技術というのは10年で停滞する習性があるらしい。


で、次はなにか?

僕はタッチスクリーンだと思っている。

タッチスクリーンこそが重要で、それが携帯電話に搭載されているかどうかは二の次だ。



閑話休題。

15年前、3Dプログラミングがにわかに脚光を浴びたのは、それが目立っていたからだ。

しかし、3Dプログラミングの純粋な面白さというものが、最近は忘れられているような気がする。


そこで数あるプログラミングの題材のなかから、3Dプログラミングを選ぶことがなぜ「面白い」のか、その魅力を語る試みをしてみようと思った。



■3Dプログラミングの魅力その1 結果がすぐに見える

 昔はこれが最大のウリだったのだが、Webに比べると弱くなってしまった。

 それでも、プログラムした図形が画面に表示されるとそれだけで非常に楽しいのは事実である。

 けれども、3Dプログラミングは苦労すればしただけ結果として返ってくる。

 Webプログラミングでは、ブラウザ間の互換性とか、JavaScriptの謎すぎるバグとかを死ぬ気で回避したとしても、できあがるのはGUIの粗悪品みたいなシロモノだけである。この徒労感は半端ない。

 とはいえ最近はHTML5でも3Dプログラミングができるので、一概に全てを否定するわけではない。

■3Dプログラミングの魅力その2 仮想的な世界を構築できる

 たとえばセカンドライフのLSLプログラミングにはまったことのあるような人であれば、本格的な3Dプログラミングを学んでみることをお勧めしたい。やるべきことは圧倒的に増えてしまうけれども、自分自身の頭で考えた世界をコンピュータの中に構築していく快感はなにものにも代え難いものがある。

 そのやり方も、ひとつではない。



 さらに最近は、GPUの計算能力が向上したので影付けの問題やグローバルイルミネーションの計算、PRTの計算、オコルージョンカリングの計算、バイナリスペース分割の計算など、やること、やれることが無数にあって、飽きない。


 Webのセキュリティ関連のプログラムもやることが無数にあるのだけど、誰も使わないかもしれない処理をえんえん作っているとめいってくるが、3Dの場合、作りこめば作りこんだだけ結果が良くなるという形で返ってくるため、作っていて楽しい。


 最初は立体的なものを表示するだけで楽しく、次に視点を移動できるようにするだけでたのしく、さらに複数の物体を出すのが楽しく、物体同士を親子関係でつないだり、変形させたりするのが楽しく、全く新しい世界に自ら作り出した法則をあてはめ、弄ぶ楽しみ。いわば空間のプログラミングを通じて神と一体化するような感覚は、陶酔と恍惚に近い感覚である。

 もちろん、そこまで辿り着くのは容易ではない。

 最初は教科書を読んでその通りにするだけでも面白いが、完成したあとで、自分なりの改良を加えて独自の3Dエンジンを組んでいくのは非常に面白い。

■3Dプログラミングの魅力その3 最先端のハードウェア支援を受けられる

 世の中にはいろいろなプログラミングの形態があるが、最先端のGPUによるハードウェア支援を受け続ける贅沢が許されるのは3Dプログラミングをおいて他に無いだろう。

 最近はGPUの有り余る計算パワーを3Dだけでなく一般的な目的(General Purpose)に使うGPGPUなども研究されているが、GPGPUを基準に物事を考えようとすると、結局スーパーコンピュータが扱うような複雑系の領域(これはこれで面白いが)くらいしか題材がなくなってしまう。

 これに比べると3DプログラミングはGPUの恩恵が解り易く、いかにも「おれが活用した!」と感動できるようなものが多い。


 特に最近のプログラマブルシェーダー関連の技術向上は、プログラミングそのものを格段に面白くしてくれるし、うまくいったときの達成感は半端ない。

■3Dプログラミングの魅力その4 開発に終わりがない

仮想世界を構築する能力を手に入れた後も、やることに終わりが無い。

これは、宇宙と全ての生命体の進化に終わりが無いのと同様、空間を制するものにやれることは無数にあるのだ。

もちろん計算機でもマンガでも、想像力に限界がないのは当然だが、3Dプログラミングの場合、実世界という決して辿り着けないゴールがある。


さらに、計算速度は向上すれば向上するほど、つまり最適化すれば最適化するほど、個人のユーザーエクスペリエンスがリニアに上がっていく。


検索エンジンやWebプログラムの場合、最適化すべき部分というのは主に個人に見えない部分で、「全体として高速・効率的」ということがあり得るが、それを評価してくれるのは上司や経営者だけである。


しかも、客観的な指標がないため、本当にそれが凄いのか良く解らない。

「井の中の蛙」みたいなタコ壺型「天才技術者」が無数に存在しているのが良くも悪くもWebの世界だ。


ところが3Dの場合、それが良い物かどうか「見れば解る」

客観的な指標としてのピクセルフィルレート、フレームレートなどがある。

そしてプログラマの能力と努力はそのままユーザーエクスペリエンスに直結する。

従ってやる気も出る。


 とてつもなく複雑なやり方もあれば、シンプルなやりかたもある。

 ふつうのプログラムでここまで複雑なものを作ることはあまりない。


 たとえば、ある時代のハードウェアでは、マテリアルの切り替えにコスト(時間)が掛かった。また、半透明の物体は最後にまとめて奥から順に並び替えて描画しないといけなかった。

 そこで、物体の親子関係(ツリー構造)を管理するオクトツリーと、それを無視したポリゴンごとのオーダリングテーブルを経由した片方向リスト、さらにマテリアル毎にソートしたリスト、アニメーションをするための物体とふるまいを集めたコールバック関数のリスト、アニメーションの各段階における姿勢のリスト(アニメーションパターンのリスト)、半透明のポリゴンだけを横断的にあつめたリスト、などを同時に管理する、という複雑な問題を楽しめる。

 これは極端な最適化の例なので、ここまで面倒なことをしなくても、そこそこは動いてくれる。



■3Dプログラミングの魅力その5 マネタイズしやすい

いまどき、センター試験にもBASICの問題が出るくらいなのだから、昔と違ってたんにプログラムが出来るというのは、なんの特技にもならない。


下手なITコンサルタントよりも、Excelを使いこなしている一般職OLの方が遥かにコンピュータの能力を引き出しているような時代に「プログラミングできる」というだけで食えるほど世の中に仕事はない。


そうした時代においても、3Dプログラミングは明らかな特殊技能であり、これを収めるには最低限の数学的・論理的・美術的センスと知識が必要とされ、それは理論面と芸術面の両方を満たしていることになる。


そしてそもそも人間は空間上で生活をしているのだから、世の中には3Dを必要とする産業がまだまだ沢山あり、こうした空間に関する技術や理論は、既に人型ロボットの動作や世界認識、AR技術、といったものへと転用され、応用されている。


特にAR技術にとって3Dプログラミングは前提条件であり、人型ロボットの動作であるフォワードキネマティクス、歩行パターンを決定するインバースキネマティクスなどはもちろん3Dプログラミング技術の応用である。


NASAで宇宙船の軌道を定義するために使用されたオイラー角は、3Dプログミングでは今や時代遅れの遺物となり、より本格的には3つの相異なる虚数単位を利用した特殊な複素数によって姿勢を表現する。このやり方は、おそらく現在のNASAでも使われているはずだ。


数年前からの常識であるプラグラマブルシェーダーの扱いに習熟すれば、これはいわば家庭用スーパーコンピュータであるため、実際にスーパーコンピュータで動作するプログラムを開発する際にこの経験が多いに役立つのではないかと思う。


つまり、宇宙工学、航空機、ロボット、AR、スーパーコンピューティングという最先端の分野で不可欠な知識を、3Dプログラミングのみによって得ることができる。


また、そこまで最先端でなくても、iPhoneOSやMacOSCore Image、Core Animationのように、3Dプログラミング技術の応用成果であるGPUが、ごく普通の画像処理にも適用されている。


■3Dプログラミングの魅力そ6 素人に「すごい」と言わせやすい

 たとえばGoogleより二倍速い検索エンジンを開発したとする。

 それは凄いことだが、0.05秒が0.025秒になったものを見て「凄い」とは直感的にわかりにくい。

 しかも、検索の速さを武器にのし上がったGoogleも、今の評価は検索が速いことではなく、お金をもっていること、お金を稼ぎ出していることである。

 ここに辿り着き、「Googleより凄い」と言わせるには、速い検索エンジンを作るだけでなくビジネス的にも成功を収めなければならない。


 それに比べると、3Dプログラミングでは計算が速ければそれだけで褒められるし、それがたとえ世界一の技術でなくても「これをおれが作ったんだ」と言って素人にも「凄い」と解ってもらえる可能性は非常に高い。なぜなら普段お気楽なWebサービスに慣れた素人の目から見れば、仮想的な空間を自在に構築することはゲーム機の世界の話であり、それを作ってみせたら、「凄い」と言われる確率は高いのだ。


 また、見た目が奇麗なものを簡単に作れるので、「凄い」は無理でも「奇麗」という答えは引き出すことができやすい。


 これは本当にしょうもないことのように感じるかもしれないが、日々の生活の局面で同級生や家族に「凄い」と言わせることはモチベーションの向上に大きく寄与するのである。Webプログラムで「凄い」と唸るのは玄人が多い。けど、「凄い」より「上手い」という評価の方がWebは多い。どうしたってブラウザの制約をうけGPUの支援を殆ど受けられないWeb環境で凄いWebというのは、作るのがとても難しい。






と、ここまで書いたくせに、僕は今や3Dプログラミングなんかさっぱりやっていないのだ。

ときどき、本当にときどき、誰かのコードを直したりするくらいである。

その理由は、僕はもうこんな複雑な問題を理解し、解き明かし、応用するにはもう歳をとりすぎてると思うからだ。


若く、情熱的であった時代なら、こうした複雑な問題に意欲的に取り組み、迫り来る数々の難問をちぎっては投げ、ちぎっては投げ、ということに没頭できたのだが、最近の技術は進化が鈍化しているとはいえ、前提として必要な数学的知識が多過ぎる。


従って、僕の先端知識はPaul Debevecあたりで止まっていて、時折SIGGRAPHを覗いたり、論文集を取り寄せたりしても、書いてある内容の半分も理解できない有様だ。


こんなこと、36歳まで地道に論文を書いて16通もの学会論文をもって博士号を獲得した西田先生に言ったら、怒られてしまうと思うが、僕の脳はそこまで複雑な問題に対処するには、あまりに足りなすぎるのである。



だが、若い人にこそ、ぜひ3Dプログラミングを学んで欲しい。

これほど刺激的で、人に褒められて、食いはぐれることもなく、しかも時代の最先端に居ることを肌で感じることのできる分野は他に無いと思う。もちろんこれは、3Dプログラマだった人間としての主観的偏見的意見だと思って聞いて欲しい。




※本当はケータイ週アスのコラムに載せようかとおもって原稿を書いたのだけど、あまりに専門的な話なので発表媒体をブログにしました。