めくるめく(リアルタイム)ソフトウェアレンダラの世界
- prev: http://d.hatena.ne.jp/mjt/20130421/p1
- ソフトウェアレンダリング vs. スプライトを使用したポリゴン
今でこそ、PCや携帯電話には3Dレンダリングのためのハードウェアを搭載するのが普通だが、昔はそんなことは無いのでCPUで頑張って絵をレンダリングする"ソフトウェアレンダラ"がかなり制作された。
以下のリストは全然網羅的でない。ソフトウェアレンダラは内製ライブラリとして作られることが多く、あまり外部にライセンスされたりしないので系譜を作るのが難しい。
フラット"多角形"レンダリング
いわゆる3Dゲームの黎明期はフラットシェーディングなレンダリングが多く用いられた。例えば、Star foxのようなSuperFXチップなポリゴンゲームもここに分類される。(SuperFXチップはただのRISCプロセサで、点をセットする以外にグラフィックスのための専用システムは無い。)
多角形を高速に塗りつぶすだけでも幾つかの考察は必要になる。非常に短いループの組み合わせになるので、ハードウェアでアクセラレートするのが普通の発想とも言える。しかし、PCゲームで専用ハードウェアを要求するのは如何なものかという問題が有るのでそれなりに活発に開発された。
世界初の3Dキャラクタゲームとの呼び声も有るAlone in the dark('92)の段階で、既にプリレンダリングの背景にフラットシェーディングのキャラクタという組み合わせになっている。
この時代は、まだプリミティブが三角形に落ち着いていないこともある。
制限されたテクスチャマッピングレンダラ / 一品物
PSやSSの登場により、ハードウェアによるポリゴン描画が一般化しても、
- GBAのような2Dコンソールがそれなりにあった
- PCでは3Dハードウェアが普及していなかった
という理由で、ソフトウェアレンダリングなゲームはそれなりに作られ続けた。例えば、Windows版バーチャロン(OMG)に至るまでのSega PCシリーズは全てソフトウェアレンダリングで、MMX 166MHz程度のシステム上で、QVGAやそれより高い解像度でサターンのゲームを動作させていた。
- Yeti3D
Yeti3D('03)はGBA向けのソフトウェアレンダラで、120x80解像度でそれなりのフレームレートのレンダリングを実現していた(GBAのハードウェア拡大機能で全画面に表示させられる)。多角形プリミティブを採用し、テーブル参照への置き換えやunroll等のソフトウェアレンダラによく見られるテクニックを盛り込んでいる。
また、ソフトウェアレンダラに良くある制約 - テクスチャは64x64ドット限定 - が有る。テクスチャのサイズを限定することで、変形したポリゴンの描画ルーチンを決め打ちで作成でき、高速化できる。
- Quake II
- http://fabiensanglard.net/quake2/quake2_software_renderer.php - アーキテクチャの解説
- http://www.bluesnews.com/abrash/ - Michael Abrash本人による解説
Doomに続くQuake('96)、QuakeII('97)は高速なソフトウェアレンダリングでも注目を集めた。半透明オブジェクト等もサポートしている。
QuakeIIのソフトウェアレンダラは、商業的に採用された、一品物のレンダラとしてはある種の到達点だろう。2000年台に入ると真剣なPCゲームはDirectXやOpenGLによるレンダリングが標準となり、ソフトウェアレンダリングにコストを掛けることはなくなっていった。いわゆるDemo/Introの類としては続いているが。。
この2つのレンダラの重要な共通点は、いわゆるFPSゲームの背景描画のための考察を中心に構築されていることだろう。ポリゴンキャラクタの描画はあまり熱心な考察がない。レイキャスティングによって表示されるポリゴンを完全に導出し、overdrawを避けつつ効率的にレンダリングしている。
Quakeのレンダラを担当したMichael AbrashのシリーズはGithub等で公開されている。IBM-PC上でのゲーム制作やEGA/VGAハードウェア、i286/386に関してよく纏まっており必読。
かのジョン・カーマックも序文に以下のように書いている:
This book contains many of the original articles that helped launch my programming career. I hope my contribution to the contents of the later articles can provide similar stepping stones for others.
汎用のソフトウェアレンダラ
汎用の、つまり、DirectXやOpenGLを実装したレンダラはあまり選択肢は無い。しかし、現状でもいくつかのレンダラは生きていて使用されているのは重要な事実だろう。
MesaのGallium3DにはLLVMを使用したLLVMPipeが有る。MacOSも同様にLLVMを使用していると言われる。
WindowsはXPまではOpenGL1.xのソフトウェアレンダラを持っていたが、最近のバージョンではDirectX上に実装している"らしい"。
- 追記: もうすこし複雑なようだ
- http://www.opengl.org/wiki/Platform_specifics:_Windows
The original Windows 95 did not have OpenGL. You had to download an installer from Microsoft called opengl95a.exe and run it.
Windows 95b came with GL. It included a GL 1.1 software renderer. Windows NT 4 also came with a GL 1.1 software renderer. There were a few screensavers that utilized GL : for example the screensaver with the maze.
The case for Windows 98, 98SE, Me, 2000 was the same : they came with the same GL 1.1 software renderer and the same GL screensavers.
Windows XP changed things a bit. opengl32.dll now utilized Direct3D and since Windows comes with drivers for your hardware, the renderer was fast. The GL screensavers were rewritten to use Direct3D, probably version 8 since Windows XP came with DirectX 8.
For Windows Vista, Microsoft had announced that they will update their renderer to GL 1.4. My own experience shows that it is actually a GL 1.1 software renderer. For some reason, Microsoft decided to remove the Direct3D wrapper from opengl32.dll.
これらのソフトウェアOpenGL実装はかなり完全で、パフォーマンスに関してはなんとも言えない。いつかちゃんと比較をしたい所。。
Windows7以降は、WARPと呼ばれるかなり高速なソフトウェアレンダラが付属しており、シェーダ等もJITCによって実行される。(後にVistaにも提供された)
WARPはDirectX 10実装で、要するにWindowsのUIは描画にDirectX 10を使うようになったので。。同じような流れはUbuntuのUnity2Dにも言える。
- Pixomatic(DX7-9, custom?)
RAD Game ToolsによるPixomaticはMichael Abrashらによる汎用レンダラで、後にIntelに売却され、彼らはLarrabeeのために働いた( http://software.intel.com/en-us/articles/michael-abrash-biography )。DirectX7(Pixomatic 2)または9(同3)相当のレンダラであったらしい。
- SwiftShader(DX9)
SwiftShaderは、TransgamingによるDirectX9 APIのソフトウェア実装で、彼らはWARPより高速と主張している。x86では一時期オープンソースであったSwiftAsmによって命令列を直接生成し、他のアーキテクチャではLLVMを使用する。
TransGamingは、GoogleのOpenGL ES実装であるANGLEにもコントリビュートしていて、SwiftShaderはChromeブラウザに採用されている。
- Vincent ES (OpenGL ES 1.x) http://sourceforge.net/projects/ogl-es/
Vincent ESはオープンソースのソフトウェアレンダラで、WindowsCEでたまに使用される。現状は特に更新が無いように見えるが、Conformant productとしてKhronosにも挙げられている。ちなみにES2の実装も存在するようだ( https://github.com/hmwill/GLESv20 )
- MascotCapsule® Renderion(OpenGL ES 1.x) http://www.hicorp.co.jp/ja/pr3d_rnd.html
Renderionは携帯電話ポリゴンの黎明期からソフトウェアレンダラを提供してきたエイチアイによるレンダラだが、これといった採用事例は観察していない。Mascot CapsuleシリーズにはMascot Capsule nanoというマイコン向けソフトウェアレンダラというかなり激しい派生も存在した。
Mascot Capsuleが重要なのは、(他のソフトウェアレンダラと異なり、)ポリゴンキャラクタの描画に特化している点だろう。というか、V3以前は平行投影のみでオブジェクト間のZソートすら無く、複数キャラクタを描画することさえできなかった。ここまで先鋭的な割り切りは他に例が無いように思える。
ソフトウェアレンダラの今後
事実上、近代的なGPUはsoftware definedと言える。つまり、GPU側のプロセサによってそれなりのボリュームのあるソフトウェアを処理できるようになったので、現状ではGPUによるレンダリングであっても部分的にはソフトウェアレンダリングといえる。
IntelがLarrabeeによる3Dグラフィックスへの展開を避けたように、今後もしばらくは純粋なソフトウェアレンダリングが主流に返り咲くことは無いだろう。
しかし、大量のデータを高速に処理する必要のあるソフトウェアレンダリングはある種の"ハック"であり、それらのテクニックから得られる知見は非常に大きいように思える。