THE長文日記

長文とか短文とかのクレームは一切受け付けません

30分でわかるゲームグラフィックスの変遷

 ゲンロン8では、ゲームエンジンとミドルウェアの区別がついてないらしい。読んでないが、僕が考えるゲームグラフィックスの進化の歴史をとりあえずまとめておこうと思う。まあ実際のジジイたちにはいろいろ言いたいことはあるだろうが。朝おきて研究所に行くまで時間があるからね。


□第1世代 エレメカ

 「遊技機で使う表示装置」をディスプレイと呼ぶのならば、まずはエレメカに言及しておかねばなるまい。エレメカとは、エレクトロニクス+メカの略で、CRTが発明される以前のゲーム機である。

 たとえばもぐら叩きなどがこれにあたる。今でもパンチングマシンくらいはあるかもしれない。
 「太鼓の達人」はエレメカの発展形とも言える。

 エレメカの特徴は、表示が物理的なもので行われることだ。つまり表示装置とはモーターやランプである。
 机の下からモグラが飛び出す、という原始的な表示装置や、紙の巻物のような「マップ」が上下にスクロールする中を棒の先についた自動車を運転して避けていく、というものまであった。


 僕が幼稚園の頃にあったエレメカは、潜望鏡を除くと中に影絵で軍艦が動いており、タイミングにあわせて魚雷を発射して当てるという単純なものだった。でもけっこうよくできていた。


□第2世代 ベクタースキャン

 よく知られている歴史では、MITの研究室でSPACE WARというゲームがPDP-1という汎用機で開発されたのがコンピュータゲームの始まりということになっている。

https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Spacewar%21-PDP-1-20070512.jpg/1200px-Spacewar%21-PDP-1-20070512.jpg


 シリコンバレーのコンピュータ歴史博物館ではたまに実際にこのゲームのデモをやっている。意外とよく出来たゲームだ。


 スペースウォーではベクタースキャン方式のディスプレイが用いられている。ベクタースキャンとは、ブラウン管の電子ビームを任意の方向に曲げて表示する方式で、単純だがシャープな図形を高速に描画する方法として用いられていた。


□第3世代 ラスタースキャン


 SPACE WARを見たユタ大学の学生、ノーラン・ブッシュネルが「コンピュータ・スペース」として商品化する。

https://upload.wikimedia.org/wikipedia/commons/2/2f/Computer_Space-Early_arcade_games_machines.jpg


 が、ビジネス的にはうまくいかず失敗。

 ノーラン・ブッシュネルは次にAtari社を設立し、より単純なテニスゲーム「Pong」を開発。これがヒットする。


https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Pong.png/400px-Pong.png


 Pongとコンピュータ・スペースでは、ベクタースキャン方式ではなくラスタースキャン方式を採用する。
 ラスタースキャンとは、左上から右下まで順次水平に走査(スキャン)していく方式で、この方式の採用がその後のコンピュータゲームの多様化に多大な影響を与えた。


 ベクタースキャンは高速かつ省メモリという利点があったが、その半面、たくさんの物体を表示しようとすると全体の色が暗くなる(電子ビームがディスプレイ表面を照らす時間が短くなるため)という欠点があり、表現に制約が大きかった。


 ラスタースキャンは常に一定のスピードで全画面を書き換えるため、表示内容にゲームバランスが左右されないという利点があった。
 これ以後、部分的にベクタースキャンのゲームが生まれるが、基本的にはブラウン管がなくなるまでラスタースキャンが主流となり、今の液晶や有機ELといった表示方式も、概念としてはラスタースキャンの延長線上にある。


■第4世代 スプライトとラインバッファ

 ラスタースキャン方式の場合、フレームバッファ(VRAMとも呼ばれる)の大きさが大きな制約になった。
 常に1/60秒で更新しなければならないブラウン管の場合、フレームバッファからの高速な読み出しができなければならないが、高速に読めるRAMは高価なので、このRAM(ビデオRAM/VRAM)にいくら費やすことができるかがそのゲームのリッチさのひとつの指標になった。


 そのひとつの解決策として、フレームバッファを使わずにより少ないメモリでキャラクターを表現するために考案されたのがスプライトとラインバッファである。


 スプライトは、主に専用の回路で表現される。


 ラスタースキャンの水平走査線にあわせて1スキャンライン分の情報だけを扱うラインバッファを用いて、スプライト専用半導体から送られてくる画像データを合成し、表示する。


 このため、スプライトは横一列に並べることができる数がハードウェアの制約を受ける。たとえばファミコンの場合は8個までしか横に並べることが出来なかった。


 スプライトの合成処理と並行して、BG(バックグラウンド、背景)との合成処理も同時に用いられた。BGもVRAMを節約する目的で、小さなタイルの組み合わせで表現される。


■第5世代 フレームバッファ

 半導体の価格が急激に下がったおかげで、全画面に渡るフレームバッファを持つことが現実的になった。
 ところがこれも過渡的なものがあって、日本で圧倒的な人気のあったNECのPC-9801シリーズのVRAMはプレーン方式という独特なものだった。


 これは、R、G、Bそれぞれを専門に受け持つVRAMを3つ用意し、実際のピクセルは横8ドットぶんを1バイトとして扱うというかなり変則的なものだった。


 この方法の利点は、メモリを節約できること。要はコストが安いことだ。640x400という当時最大解像度を実現するのに、横方向にわずか80バイト×3 = 240バイトで済む。つまり3色合わせてわずか96000バイトで表現可能なのである。


 当時、デジタル8色が主流だったので、必要な情報量はわずか3ビット。3ビットという、16ビットCPUが極めて扱いづらいデータを効率的に表現する見事な解決策だった。


 ただしこの方式には非常に大きな問題があった。


 それは、常に横8ドットをセットで扱わなければならないため、単に「白い点」をひとつ描画するだけでも、RGBの全てのプレーンから一度値を読み出し、書き足したいドットに相当するビットをOR演算で立て、さらにRGB全てのプレーンに書き戻すという作業が必要になる。


 コンピュータの処理で最も遅いもののひとつがメモリアクセスなので、この仕様は致命的というか絶望的に性能の足を引っ張ることになった。


 そこでNECはPC-9801には専用のグラフィックスディスプレイコントローラ(GDC)という半導体を用意して高速な線分描画ができるように工夫した。これもコストバランスをよくかんがえた見事な方法だったと言える。


 しかしこの決定が、後の運命を決めてしまう。


 1981年に発売されたIBM PCがバージョンアップし、1984年にIBM PC/ATとなったとき、設計はIBM PCを踏襲し、全てオープンアーキテクチャとされた。


 それとほぼ同時期に発表されたビデオグラフィックス・アレイ(VGA)というグラフィックス処理方式はプレーン方式ではなく1ピクセルを1バイトで扱うパックドピクセル方式が採用された。


 この時期になるとグラフィックスはデジタル8色ではなく、カラーパレットから何色か選ぶ方式が当たり前になり、1ピクセルあたりの情報量は最大256色、すなわち1バイトに相当するようになった。


 この方式の利点は、圧倒的にCPUからのVRAM操作が簡単になったことだ。
 今に至るまでほぼ全てのコンピュータシステムのグラフィックスにパックドピクセル方式が採用されていることがなによりの証拠だろう。


 PC-9801シリーズも時代の趨勢にあわせてGDCがGRCG(グラフィックスチャージャー)、EGC(エンハンスドグラフィックスチャージャー)へと進化し、多様なラスターオペレーションに対応していったが、下位互換性を維持するために最後までプレーン方式に拘り、少なくともCGのプログラムに関しては作りづらいという印象のままその栄光の歴史を閉じた。


 後継となった9821シリーズはパックドピクセル方式を採用したが、それはIBM-PCがパックドピクセル方式を採用した8年も後だった。


 コンピュータの歴史において8年というのは致命的と言って良いビハインドである。自分で書いていて信じられないがおそらくこれが日本が3Dゲーム時代に突入するのが遅れた一つの根本的な理由だろう。


 ちなみに当時日本に全くパックドピクセルがなかったわけではなくて、X68000など、筋の良いマシンはいくらでもあった。しかし当時の日本では「パソコン=PC-9801」というくらいに圧倒的爆発的に普及しており、X68000は一部のマニアのものだった。


X68000では高度なグラフィックスを駆使したソフトが作られていて、初期プレイステーションの名作タイトルはほぼこのマシンでのゲームプログラミングの経験がある人たちが作っていた。グランツーリスモ、どこでもいっしょ、Jumping Flashなどである。ちなみにVR界隈の有名人であるGOROman氏もX68000ユーザーで、彼の会社名はそれにちなんでつけられている。


 一方海外では、NeXTを手に入れたジョン・カーマックが世界初の一人称視点シューティングゲームWolfenstein3Dを開発し、シェアウェアという全く新しい方法で販売し、大成功を収めていた。カーマックはそれに続いて通信対戦までサポートした傑作ゲームDOOMまで開発し、その地位を不動のものにした(彼が現在OculusのCTOなのは必然である)。そして彼はFPSというジャンルを創出し、現在主流のゲーム産業の基礎を築いた。


 コンピュータアーキテクチャというのは一国の文化や競争力を左右してしまうくらいには重要かつ重大なのである。


■第5.5世代 バイナリー空間分割とゲームエンジンの誕生


 さて、フレームバッファの時代は長いのだが、この時代に「発明」と言えるもののうちで決定的なものは、やはりジョン・カーマックが開発したWolfenstein3DやDOOMに用いられていたバイナリー空間分割法(BSP;Binary Space Partitioning)だろう。


 バイナリー空間分割とは、特に3D迷路のような図形において、ある壁の延長上の直線に沿って、他の壁を分割する二分木をつくり、そのシーンをレンダリングするのに必要な情報(つまりどの壁を描画すべきか)を高速に検索する手法である。


 これがなければ当時の非力なマシンで3D空間を歩き回るゲームの表現はほとんど不可能に近く、Wolfenstein3DやDOOMは、背景の壁の描画にBSP法を使い、手前のアイテムやモンスターの描画に擬似3Dを使うというハイブリッドな方法を作り出した。


 DOOMによって、それまでプログラムとほぼ一体だったゲーム開発を明確にゲームのマップ配置を行う「レベルデザイン」と、作成された「レベル」を実行する「ゲームエンジン」に分離することが当たり前になった。この概念を生み出したのはカーマックとともにDOOMのレベルデザインを担当したジョン・ロメロと言われている。


 カーマックとロメロはDOOMシリーズのヒットを受けてさらに複雑なQuakeを開発し、Quakeのレンダリング・エンジンを担当したマイケル・アブラッシュ(後にMicrosoftでWindowsのレンダリングエンジンを開発する)は解説書「Game Engine Black Book」を書いている。Quakeではキャラクターも擬似3Dではなく後述するポリゴンで書かれるようになる。


 バイナリー空間分割は四分木や八分木にも拡張された。



■第6世代 ポリゴン


 フレームバッファが普及することでようやくポリゴン(多角形)による3D表現が現実のものとなった。最初はテクスチャもなにもない、単純なライティング計算だけをした素のポリゴンがゲームに採用されていた。


 ゲームの歴史そのものでいけば、フレームバッファ時代の疑似3Dにも言及すべきかもしれないが、あまり本質的な問題ではないので今回は割愛する。


 ゲームにおけるポリゴンの導入は画期的であり破壊的だった。
 すでにフレームバッファの表現力を人間の職人芸によって限界まで引き出す「ドット芸」とまで呼ばれる領域に昇華していた時代に、味も素っ気もない素のポリゴン(生ポリゴンと呼ばれることもある)だけで構成された画面はあらゆる人にとって異質に見えた。


 これに先鞭をつけたのはセガのAM2研で、バーチャレーシングとバーチャファイターという2つのゲームを送り出す。画面の表現力の拙さをカバーするため、動きと空間によってこれまでにない迫力を作り出すという新しい手法を開発した2つのソフトは世界中で大ヒットし、新しい時代を切り開いた。


 さらにナムコが開発したポリゴナイザーという専用半導体を用い、リアルタイムのテクスチャマッピングをも実現したリッジレーサーの登場により、いよいよ本格的に3Dがゲームの主役になる時代が幕を開けた。


 この背景がなければプレイステーションが世界で最も売れるハードウェアになる時代は絶対にこなかっただろう。セガとナムコが3Dゲームの魅力を文字通り証明したのである。


 初代プレイステーションのアーキテクチャがいかにすごいかは何度も書いたので割愛するが、Zソート方式の後にPS2のZバッファ方式がやってきた。まあそれは重大だが些細な変化で、この時代はとにかく1枚でも多くのポリゴンを描画するレンダリングエンジンが一番えらいということになっていた。


■第7世代 プログラマブルシェーダー

 PS2まではとにかく怒涛のようにポリゴンを書けば良いと思われていたものの、どうもいくら多角形を高速に表示してもそれだけでは限界があるということがわかってきた。


 まあとっくにわかっていたのだが、他にどうすればいいのかわからなかったのでとりあえず物量で殴るというパワープレイに終始していたのだ。


 状況を変えたのはプログラマブルシェーダーだった。


 それまで、シェーディング(陰影づけ)を行うのは主にGTE(ジオメトリエンジン)と呼ばれるハードウェアの役割だった。
 しかしそれが画面全体のライトの数の制限などに繋がっていた。


 固定されたパイプラインで処理するよりも高い自由度を得るため、むしろ低質なポリゴン数を多くするよりも高質なポリゴンを少し描くだけでより豊かな表現を得るなどのトレードオフをする必要が出てきた。


 そこでシェーディングのプロセスを頂点の座標変換およびライティングを行うヴァーテックスシェーダーと、ピクセルごとに計算を行うフラグメント(ピクセル)シェーダーをプログラマーが自由に書くことができるようになった。


 プログラマシェーダーの導入により、GPUの自由度は飛躍的に高まり、それまで不可能と思われていたフォンシェーディングやバンプマッピングが当たり前のように可能になった。マルチテクスチャなどへの対応も盛んに行われ、現在のゲームグラフィックスの大半はこうしたアーキテクチャを採用している。


 余談だが、このプログラマブルシェーダーはスパコン並の性能を持っており、グラフィックス描画以外の目的に使えないかという用途が模索された結果、現在のディープラーニングの隆盛に繋がっている。筆者は1998年から2010年頃まで、たまたまGPUの専門家として働いていた経験があり、それが今の仕事に繋がっているというのは非常に運命的なものを感じる。


 

■第八世代(番外編) ゲームエンジンとミドルウェア


 ゲームエンジンとレンダリングエンジン、またはゲームエンジンとミドルウェアの違いについて説明しておこう。


 そもそもミドルウェアとは何かと言うと、ハードウェアとアプリケーション(ソフトウェア)の中間に位置するのがミドルウェアで、これはデバイスドライバよりは高級(複雑)な処理を受け持つ。いろいろなレベル、レイヤーのミドルウェアがあるが、基本的にはミドルウェアは主従で言えば「従」の位置にある。


 単なるソフトウェアライブラリもミドルウェアの一種であり、たとえばJPEGを展開するミドルウェアや、動画やサウンドを高音質で処理するミドルウェアなどが開発・販売されたこともある。


 CRIのミドルウェアは有名だが、クライテリオンのRenderWareのような、グラフィックスの処理に特化したミドルウェアも人気を博した。


 RenderWareは当初、その名の通りミドルウェアを強く指向して設計された。
 しかし、レンダリングエンジンの提供のみならずゲームを構成するコンポーネントの大半をRenderWareが提供するように進化していったため、いつのまにかミドルウェアだったはずのRenderWareがゲームエンジンと同等の機能や環境を獲得するようになっていった。


 ゲームエンジンは、主従で言えば「主」であり、これは単なる中間層ではなく、ひとつの宇宙を構成する、いわばOSのようなものである。


 たとえばUnityは、内部スクリプト言語としてC#またはJavaScript言語を使用することができるが、開発者が書くのはUnityにとって従となるこうしたスクリプト言語に限定されている。


 ゲームエンジンは「ゲーム(にはもはや限らないが)」とは何かを定義し、開発者はゲームエンジンの定義に従って自分の作りたいものが何かということをゲームエンジン専用のスクリプトで書いていく。


 ゲームエンジンと呼ばれるものには、単にゲームのメイン部分だけが提供されるもの(DOOMは本来そうだった)だけから、レベルエディタやマテリアルツール、テストプレイツールを統合した統合開発環境へと進化していった。ここまで来るともはやゲームエンジンはミドルウェアとは呼べず、ゲームの世界を定義する重要な役割を担う。


 こうしてゲームエンジンへと進化したRenderWareは普及していった。


 ところがRenderWareの有効性が理解されると、Electric ArtsはRenderWare社を買収し、一切の社外利用を禁止した。
 そのため、RenderWareに依存していた世界中のゲームメーカーは大混乱に陥った。なんせゲームエンジンを社外品に頼るようになっていたので自社のノウハウが全く無い。一朝一夕に作れるほどゲームエンジンは甘くないのである。


 そのときまず現れたのがUnreal Engineだ。その名の通りUnrealというゲームで使われているエンジンだった。他にもValveのHalfLife2エンジンとか、FarCryのCryEngineとかいろいろ出たんだけど、まあXbox360くらいの時代はUnrealEngineがほとんど唯一の選択肢だった。


 巷間に流れる噂によるとライセンス料金は一本あたり最低一億円。
 それがいまや基本無料から使えるんだから時代の流れはすごい


 数百万円のライセンス料金から利用できたRenderWareに比べるとUnrealEngineはめちゃくちゃ高価だった。
 しかしRenderWareはもうない。


 そこに彗星のように登場したのがUnityである。
 最初はPC/Mac/ブラウザ用からスタートして、少しずつ家庭用ゲーム機をサポートしていった。


 iPhoneブームのときにUnityを使った成功事例がいくつもうまれ、最終的にはUnityはソフト開発のデファクトスタンダードになった。


 いまやゲームエンジンを自作する必要性というのはほとんど失われてしまった。


 既存のゲームエンジンでもかなりのことが可能であり、できあいのものを必要に応じてカスタマイズする方が、ゼロからゲームエンジンを作るよりも遥かに簡単だし、Unityのようにアセットストアが充実していると、スクリプトを一切書かなくてもゲームのようなものを作れてしまう。


 ゲーム以外の領域でもゲームエンジンが使われることが当たり前になりつつあり、その意味では、現代のゲームエンジンはPCでいえばWebブラウザくらいの汎用性を持っている。


 特に、ゲームエンジンの普及がなければ、これほど短期間にVRコンテンツが揃うこともなかったのではないかと思う。VR用のゲームエンジンを専用に起こすのはあまりにも面倒くさいからだ。


 

    • -

 ふう、一気に書いたが思いのほか時間が掛かってしまった。
 できるだけ網羅的に書こうとしたが、僕の知らないことや事実誤認もあるかもしれない。
 まあだれかがブコメで指摘してくれるだろう