西川善司のグラフィックスMANIAC

ためになる3Dグラフィックスの歴史(1)。かつては二流扱いだった「DirectX」

「バーチャファイター」(1993年)。ポリゴン単位のライティングが基本の「フラットシェーディング」のみであり、テクスチャマッピングという概念もなかった。そのため、顔や服は"その形のポリゴン"を描画して表現していた。このゲームのシステム基板は「MODEL 1」と呼称された。グラフィックス描画担当プロセッサは富士通製のDSP「MB86233」だった。描画性能は秒間18万ポリゴン

 連載名が「西川善司のグラフィックスMANIAC」なのに、ずっと「ゲームと遅延」の話をしてきたこの連載だが、実はまだ遅延の話はやり足りていない(笑)。

 とは言え、さすがに「やりすぎ」感が出てきたし、編集部側からのリクエストもあったので、ここで連載タイトルらしい内容も挟んでいくことにした。

 編集部からいただいたお題はこんな感じだ。

「なぜ、NVIDIAとAMD、Intelといった異なる半導体メーカーが作るGPUで、同じようなゲームグラフィックスが出せるのでしょうか」。

 結論から言ってしまえば「業界が定めたプログラマブルシェーダアーキテクチャというものがあって、それに従ってGPUをプログラムできているから」ということになるわけだが、実はこの結論(≒現在の状態)に辿り着くまでには、業界にはさまざまな歴史的な闘いがあった。

 今回から、数回にわたって、この歴史的な動向について、半導体やプロセッサ、そしてゲームエンジンなどの視点から見ていきたいと思う。

“ゲーセン”から始まった先端3Dゲームグラフィックス
当時はDSPが3DCGが描画を行なっていた

 スーパーコンピュータや業務用のグラフィックスワークステーションを除けば、現在、最も先進的なリアルタイム3Dグラフィックス環境が利用できる民生向けハードウェアはハイエンドスペックなパソコン(PC)ということになる。

 しかし、1990年代前半くらいまで、むしろPCは、今からは想像できないくらいグラフィックス(サブ)システムが遅れていた。この時代、すでにコンピュータグラフィックス(CG)という言葉の認知度は高かったが、それでも「家庭のPC」と「(3D)CG」が結びつくのは、少し先のことになる。

 この時代、我々に最も身近で、なおかつ先進的なリアルタイム3Dグラフィックスを実現していたのはアーケードゲームの方だった。

 そう、いわゆるゲームセンター(ゲーセン)向けのゲームだ。

 現在はアーケードゲームの筐体の多くは、マザーボード上に組み込み向けWindowsを搭載したPCベースとなっているが、この時代は各アーケードゲームメーカーが独自に3Dグラフィックシステムのハードウェアを設計して、その上で独自の3Dゲームグラフィックスを動かしていた。

 当時は、今のGPUのような手頃な価格の「3Dグラフィックス専用ハードウェア」はほとんど存在しなかったし、ゲームメーカーがチップから専用開発するほどの予算はなかったので、いわゆるDSP(Digital Signal Processor)を活用(≒流用)することが多かった。

 使用目的に応じていろんなものが存在するが、DSPとはざっくりと言えば「信号処理高速に行なうことに特化したプロセッサ」のこと。

 一方で「CPUでのデータ処理」と言えば、プログラムが動作することで、その処理対象のメモリ領域に格納されているデータが順番に処理されていく……というイメージだ。

 しかし、DSPは概念的に真逆。

 あらかじめセットしておいた“こぢんまり”としたプログラムに対して、ベルトコンベア式にどんどんデータを入力していくと、そのプログラムによって処理された結果がどんどん吐き出されてくる……そんなイメージだ。

 大量のデータに対して特定の計算をパラメータ違いで行なうことが得意なのがDSPだ。

 大量のデータを「ポリゴンの頂点データ」として、実行するプログラムを「幾何学的な演算」とすれば、現在のGPUっぽい処理ができることになる。当時のアーケードゲームのシステム基板に搭載された3Dグラフィックスハードウェアは、そんな感じの成り立ちのものが多かった。

 当時、最も技術的に先端を行っていたのはナムコ(現バンダイナムコアミューズメント)とセガで、ナムコは「ウイニングラン」(1988)、「スターブレード」(1991)、セガは「バーチャレーシング」(1992)、「バーチャファイター」(1993)などを出していた。

 この時代の3Dグラフィックシステムは、主にCPUとこれをサポートするコプロセッサ、そして前出のDSPがグラフィックスレンダリングを担当しており、ライティング(照明演算)はポリゴン単位にしか行なわれず、テクスチャマッピングの機能も持っていなかった。

 テクスチャマッピングが3Dゲームグラフィックスに採用されて、それが一般ユーザーの目に広く触れることになったのはナムコの「リッジレーサー」(1993)がアーケードに登場したときだ。

アーケード版の「リッジレーサー」はテクスチャマッピングの威力を世に知らしめた作品。当時、この作品ではグローシェーディングが使われていると話題になったが、実際にはテクスチャにそれっぽいグラデーション陰影を焼き付けていただけだったらしい。このゲームのシステム基板は「システム22」と呼称された。グラフィックス描画担当プロセッサは、ジオメトリ処理をTI製のDSP「TMS320C25」で、テクスチャマッピングはEvans & Sutherland社製「TR3」が担当した。描画性能は秒間24万ポリゴン

 それまでゲーム向けの3Dグラフィックスと言えば、カクカクとした積み木チックな3Dオブジェクトがシーンに展開しているだけの表現が主流で、プレイヤー側は「これは車」「これは人」という風に、ある程度の想像力を働かせてゲーム内画面を認識して楽しんでいた。

 対して「リッジレーサー」の画面では、そのまま「それ」と分かる3Dオブジェクトがそのまま縦横無尽動き回っていたため、多くのゲームファンはカルチャーショックを受けたものだった。

当時のPCゲーミングシーンにおいて二流扱いだった「DirectX」

 1990年代中期には3Dゲームグラフィックスがさらに身近な存在となる大事件が起きる。それは、プレイステーションとセガサターンの発売だ。

プレイステーション
セガサターン

 1994年に発売されたこの2つのゲーム機は、映像解像度はそれほど高くはなかったものの、当時のアーケードゲームシステムにとっても最先端技術であったテクスチャマッピングに対応していただけでなく、隣接するポリゴン同士の陰影をグラデーションで塗る「グローシェーディング」(グーローシェーディング)法にも対応していた。

 この1年後の1995年にWindows95が発売され、これに同期する形で、PCにも3Dグラフィックスを実現するためのサブシステムとして「DirectX」(正確にはDirectXに含まれるDirect3D)が提供されるのだが、当時のWindows PC向けの3Dグラフィックスハードウェアはかなり機能が低く、さらにDirectXの完成度も今一歩だったために、プレイステーションやサターンの表現力に近づくのは、DirectX 5がリリースされる1997年ごろまで掛かることになる。

 ただ、この時代のPC向けの3Dグラフィックスハードウェアメーカーの情熱はすさまじいものがあり、今でこそNVIDIAとAMD(当時はATI)の2強にIntelが追従を仕掛けているような状態だが、当時は数十社のメーカーがPC向けの独自の3Dグラフィックスハードウェア製品をリリースしていた。

 中でも一時代を築いたのが、1995年頃から当時のPCゲームファンの間で絶大な人気を博した「Voodoo」シリーズと呼ばれる3Dグラフィックスハードウェア製品を送り出した3dfx社だ。

筆者宅のガラクタ箱にまだ残っていた3dfx社製の初代Voodooを搭載した3Dグラフィックスハードウェア。グラフィックスメモリは4MB(EDO-DRAM)。2枚のVoodooボードをPCに搭載して倍速レンダリングを実践する「SLI」モードは3dfx社の発明だった。3dfx社は2000年に経営破綻してNVIDIAに買収されている

 今、考えれば驚くべきことだが、Voodooシリーズを使って美しい3Dゲームグラフィックスを描画させるには、DirectXではなく、3dfx社独自のAPI「Glide」を用いる必要があった。

 当時、初代Voodoo(1995年)から2世代目のVoodoo2(1998年)までの当時のPCゲーム業界の間では、DirectXは「二流扱い」だったのだ。なので、ゲーム開発スタジオ側も最上位グラフィックスはGlideベースで開発してゲームを提供することが多かった。

 今でも人気シリーズとして知られる「トゥームレイダー」の第1作などはまさしくその典型例で、PCでは当初、Voodooシリーズでないと美しいゲームグラフィックスが楽しめないタイトルであった。

初代「トゥームレイダー」(Voodoo1で動作させた画面)。最上位グラフィックスはDirectXではなくGlide向けに提供された

 言うなれば「負け組」扱いだったDirectX(Direct3D)に転機が訪れるのは、1999年に発表されたDirectX 7の時代からだ。

本当の意味での「GPU」はDirectX 7の時代から始まった

 現代を生きる我々からは信じがたいことだが、1998年登場のDirectX 6世代以前の3Dグラフィックスハードウェアは、ポリゴンとピクセルの対応付けを計算する「ラスタライズ」処理や、画像テクスチャをポリゴン面に沿う形で適用しながらピクセルを描画する「ピクセル描画」処理だけを担当していた。

 なんと、ポリゴン単位の座標変換処理やポリゴン単位のライティング処理に代表されるいわゆる「ジオメトリ処理」は、この時代まだCPUが担当していたのだ。

 なので、当時のPCゲームグラフィックスを高品位に描画するためには、現代以上にCPUに演算性能の高さが求められていたのである。

 そんな時勢の中で流行したのが、CPUに「1つの命令で複数のデータに対しての演算が実行できるSIMD拡張命令」だ。最初のSIMD拡張命令セット「MMX」に対応したCPUは1997年にリリースされている。第1号CPUはこのSIMD拡張命令トレンドの仕掛け役、Intelの「MMX Pentium」だ。やや遅れてAMDは対抗のMMX対応CPUとして「K6」をリリースしている。

MMX Pentium

 実際のところ、MMXは浮動小数点には未対応で整数演算に特化したSIMD拡張命令だったが、精度よりも速度を求めるゲーム開発用途では当時、積極的に活用された。Intelも積極的に資料を出してMMXの普及に努めていたため、「MMX」のキーワードは当時のPCゲーミングファンにとっては一大ブランドとして認識されていたと思う。

1997年、PC用のMMX対応CPU専用「バーチャロン」も発売された

 当時のPCは、そのデスクトップ画面こそ、現代とさほど変わらない1,600×1,200ドットで使うことも多くなっていたが、3Dゲームグラフィックスとなると、ターゲット解像度は640×480~800×600ドット程度。解像度は結構粗かったのだ。

 そのため「精度よりも速さ」が重んじられたこともあり、ゲームにおいては、浮動小数点から固定小数点に置き換えるなどしてMMXを積極活用してジオメトリ処理の高速化を狙う実装事例もあった。

 なお、1998年にはAMDが浮動小数点対応版MMXとも言える「3DNow!」を発表して「K6-2」に搭載。やや遅れて1999年、IntelもAMDと似たコンセプトの「SSE」を発表して「Pentium III」に搭載している。

K6-2
Pentium III

 ただ、PCゲーミングシーンにおいて、MMXのようなフィーバーは、3DNow!やSSEに対しては起きなかった。

 というのも、1999年に登場したDirectX 7において、3Dグラフィックス描画の全工程を3Dグラフィックスハードウェアが受け持つことができるようなアーキテクチャが提唱されたため。

 そう、CPUが「ジオメトリ処理」を受け持つ必要がなくなったのである。

 今では3Dグラフィックスハードウェアを「GPU」と呼ぶことが定着しているが、この呼び名が提唱され、定着し始めたのも1999年頃からだ。

 なお、DirectX 7対応GPUの第1号は1999年にNVIDIAから発表された初代GeForceブランド製品の「GeForce 256」だ。やや遅れて2000年、ATI(現在はAMDに統合)が初代「RADEON」をリリースした。現在の二大GPUブランドが頭角を現してきたのもこのタイミングからになる。

「NVIDIA GeForce 256」を搭載するビデオカード。3DグラフィックスハードウェアをGPUと呼ぶようになったのは、このGeForce 256から

「GPU」ではなく「VPU」と呼びたかったATI

 ここで、ちょっとした余談を。NVIDIAにライバル心を燃やすATIは、当時「GPU」という呼称を嫌い「VPU」(Visual Processing Unit)というキーワードを提唱していた。今は亡き、Permediaシリーズなどを送り出した3DLabsなどとともに「VPU」の呼び名を推進したが結果的には浸透せず。

Permedia 2を搭載するFire GL 1000 Pro

 それまでソニーの初代プレイステーションやセガサターンといった家庭用ゲーム機とどっこいどっこいだったPCゲームグラフィックスの表現も、DirectX 7時代以降からはそれらを上回るような魅力的なタイトルが出始めるようになる。

 当時は、家庭用ゲーム機はTVでプレイすることが標準スタイルだったので、映像解像度は640×480ドット程度が限界。対して、PCではこの頃から今で言うHD(ハイデフ)相当の1,024×768ドット程度でプレイすることもできたので、解像度面ではすでに家庭用ゲーム機での体験を凌駕していた。

画面はDirectX 7時代の代表作「GIANTS:CITIZEN KABUTO」(2000年、PLANET MOON STUDIOS)より。巨大モンスターの皮膚の微細凹凸表現は法線マッピングによるもの。後述する「プログラマブルシェーダ」世代の表現を先取りして実装していた

2000年、3Dゲームグラフィックスは「プログラマブルシェーダ」革命を経て怒濤の近代化へ

 家庭用ゲーム機は1998年にセガ・ドリームキャストが、2000年にソニーのPS2が発売になっている。PCの3Dグラフィックス技術は、このタイミングあたりで、同時代の家庭用ゲーム機に追いついた感じだ。

PlayStation 2
Dreamcast

 5~7年サイクルで進化する家庭用ゲーム機の3Dグラフィックス技術に対し、PC向けGPUは、それこそ毎年進化していたため、この頃からPCゲームの3Dグラフィックス技術は怒濤の進化を遂げていく。

 しかし、この進化の過程で「問題」も生じ始めていた。それは互換性の問題である。

 あるメーカーが「魅惑のグラフィックス表現機能」を自社GPUに搭載したとしても、それは別メーカーのGPUでは再現できないことが当たり前だった。「せっかく時間を掛けて作り込んだリアルな表現も、特定メーカーのGPUでしか再現されない」ということになれば、ゲーム開発側はどのGPUでも再現できる「必要最低限のグラフィックス表現」を用いてしか、ゲームグラフィックスを制作しなくなってしまう。

 また、このまま各GPUメーカーが好き勝手に新機能を拡張していっては「誰も使わないような機能」がグラフィックスサブシステムに増殖していってしまう。

 これを危惧した業界は、新しいグラフィックス技術を直接ハードウェアで実行するのではなく、「GPUで実行できるソフトウェア」の形で実装していける新技術「プログラマブルシェーダ」アーキテクチャを提唱する。

2001年に発売された初代「Xbox」は世界初のプログラマブルシェーダ技術採用の家庭用ゲーム機。NVIDIA GeForce3をベースとしたGPUを搭載し、APIにDirectXを採用したMicrosoft初のゲーム専用機。同世代のドリームキャスト、PS2はプログラマブルシェーダ技術には未対応だった

 現在のPCやスマートフォンが、さまざまな用途で使え、さまざまな機能を実現できているのは、そのPCやスマートフォン上でアプリ(アプリケーション・ソフトウェア)が実行できるからだ。昔は文書を作成するためだけの専用コンピュータとして「ワードプロセッサ」(ワープロ)がもてはやされたが、今では完全に姿を消した。それは、どのPCでもワープロソフトを動かすことができるようになったためだ。

 そんなイメージで、「微細な凹凸表現を行ないたい」「人間の肌の質感を再現したい」「液体に濡れている質感を表現したい」といった、多様なグラフィックス表現を“プログラムできる”ようにし、さらにそれを“実行できる”ようにする仕組みが「プログラマブルシェーダ」アーキテクチャになる。

 そう、プログラマブル(Programmable)とは「プログラムできる」の意である。シェーダ(Shader)は、直訳的には「陰影を司るもの」という意味になるが、本稿では「グラフィックス表現」の意味……くらいの理解でよい。

 ちなみに、このプログラマブルシェーダの概念は、現在ではPCやゲーム機はもちろん、スマートフォンにまで採用されている。

 なので、今、目にしているほとんどの現行3Dゲームグラフィックス表現は、GPUが実行している「シェーダプログラム」によって実現されているのである。

 次回は、このプログラマブルシェーダ技術が激烈な進化を迎える時代を取り上げていくことにしたい。あの、AMDとNVIDIAの「仁義なき戦い」は、このプログラマブルシェーダ時代の幕開けとともに激化することになる。