スマホやタブレットのGPUもプログラマブルシェーダアーキテクチャに
まずは簡単に、家庭用ゲーム機のグラフィックス表現ポテンシャルについて紹介しましょう。
家庭用ゲーム機のゲームグラフィックスは、1994年に登場したソニー・プレイステーション(初代PS)とセガ・サターンの登場でリアルタイム3Dグラフィックス時代を迎えました。2000年にはジオメトリ性能(ポリゴン処理能力)を高め、さらにピクセルフィルレート(ピクセル描画性能)を高めたソニーPS2が登場しました。
このPS2、そして翌年の任天堂ゲームキューブまでは、ゲームグラフィックスは、主にジオメトリ性能の強化と、テクスチャマッピングの高解像度化の方向性で進化してきたといえます。
様相が変わるのは2001年に登場したマイクロソフトのXbox(初代)からです。
Xboxのグラフィックスプロセッサ(GPU)は、「プログラマブルシェーダ」と呼ばれる新概念の機能が採用されたのです。Xboxよりも前……、すなわちPS2以前のGPUでは、「あらかじめ用意されたグラフィックス表現」(固定機能)から選んで活用することしかできませんでした。ところが、XboxのGPUには、さまざまなグラフィックス表現をソフトウェアとして記述できる(≒プログラマブルな)仕組みが搭載されたのです。簡単にいえば、GPUをプログラムすることで、アイディア次第でさまざまな表現が実装できるようになったということです。例えば、アニメチックな見た目のトゥーンシェーダー、1ポリゴン未満の微細凹凸表現を実現する法線マッピング(バンプマッピング)などは、プログラマブルシェーダによって実現することができるようになりました。
以降の据え置き型ゲーム機、具体的にはPS3、PS4、Xbox360、Xbox One、Wii UのGPUはすべてプログラマブルシェーダアーキテクチャとなっています(WiiのGPUはプログラマブルシェーダではありませんでした)。
そして、現在のスマホやタブレットに搭載されているGPUも(よほど機能の低い前時代的なものを除けば)、ほぼプログラマブルシェーダアーキテクチャのものが主流となっています。
DirectXの歩みとともにあったゲームグラフィックスの進化の歴史
現代ゲームグラフィックス(リアルタイム3Dグラフィックス)の基礎概念となっているプログラマブルシェーダアーキテクチャも、最初から今の機能レベルで登場したわけではありません。
それこそ、初代Xboxのときは、実行できるプログラマブルシェーダの規模はとても限定的でした。
このプログラマブルシェーダアーキテクチャは、Windowsパソコン向けに提供されてきたマルチメディアコンポーネントAPIである「DirectX」のバージョンアップとほぼシンクロして進化してきたのでした(正確にはDirectXではなく、DirectXを構成するAPI群の1つで3DグラフィックスプログラミングAPIに相当するDirect3Dなのですが、本稿では便宜上、「DirectX≒Direct3D」という記述で話を進めることにします)。
初代Xboxが採用していたプログラマブルシェーダはDirectX8世代に相当するものです。続く、PS3、Xbox360では、これがDirectX9世代相当になります。そして、Wii UはDirectX10世代相当、最新のPS4、Xbox OneがDirectX11世代相当です。
DirectX9世代までは、頂点処理を担当する頂点シェーダと、ピクセル処理を担当するピクセルシェーダの2種類しかなかったプログラマブルシェーダですが、DirectX10世代では、ポリゴンの増減をプログラム制御できるジオメトリシェーダが新設されています。
最新世代のDirectX11世代では、ポリゴンをプログラム制御で分割することができるテッセレーションステージが新設され、これを実践するためのプログラマブルシェーダとして、ハルシェーダとドメインシェーダが新設されました。
つまり、最新世代のGPUには、頂点シェーダ、ジオメトリシェーダ、ハルシェーダ、ドメインシェーダ、ピクセルシェーダの5種類があることになります。
図案原案:西川善司著『ゲーム制作者になるための3Dグラフィックス技術』(インプレスジャパン刊)
図案原案:西川善司著『ゲーム制作者になるための3Dグラフィックス技術』(インプレスジャパン刊)
今年、Windows10のリリースにシンクロする形で「DirectX12」の提供が始まりましたよね。
DirectX12はDirectX11の次バージョンなわけですから、何か新しいプログラマブルシェーダが追加されたかどうか気になる人もいるでしょう。しかし、簡単に結論だけ先に述べると、DirectX12ではプログラマブルシェーダの構成はDirectX11から変更ありません。実は、DirectX12では、グラフィックス表現能力の向上よりも、パフォーマンス(描画効率)向上を目的に開発されたものなので、表現ポテンシャルの観点からは大きな進化はあまりありませんでした。
スマホ・タブレットのグラフィックス表現力の世代区分
ここからスマホ・タブレットの話題になります。スマホやタブレットのメインプロセッサは、CPUとGPUを1チップに統合したSoC(System on a Chip)になっていて、今だとGPU部分はImagination TechnologiesのPowerVR系、ARMのMali系、QualcommのAdreno系の3つが「三強」といった状況です。とはいえ、PC向けGPUの巨人、NVIDIAはスマホ・タブレット向けにTEGRA系を訴求していますし、おなじみインテルも最近はAtom系でその存在感を高めてきています。
スマホ・タブレットのGPUのプログラミングAPIとしては、マイクロソフトのDirectXではなく、Khronosグループが提供しているオープンスタンダード規格である「OpenGL ES」というものが使われます。もともと、ワークステーション向けに存在していたグラフィックプログラミングAPIの「OpenGL」を、組み込み機器(ES: Embedded System)向けにコンパクトに再編したのがOpenGL ESです。
2003年、最初に登場したOpenGL ES1.0は、プログラマブルシェーダ未対応の、いってみればPS2以前の固定機能GPUを想定したAPIでした。この時代、スマホ・タブレット向けのGPUで3Dグラフィックスを取り扱えるものは種類もなかったので、OpenGL ES1.xは、それほど積極活用がなされませんでした。
2007年にリリースされたOpenGL ES2.0では、プログラマブルシェーダアーキテクチャベースのGPUを想定したものに生まれ変わりました。なお、OpenGL ES2.0でサポートされるプログラマブルシェーダは、頂点シェーダとピクセルシェーダの2つだったので、DirectX9相当、つまりPS3、Xbox360世代の表現能力と同じということになります。iPhone世代でいうとiPhone3GS~5くらい、多様な仕様のあるAndroid系だと一概にはいえませんがAndroid2.x~3.xくらいの端末がこの世代に属します。
2012年にはOpenGL ES3.0がリリースされます。「2.0→3.0」のメジャーバージョンアップを果たした割には、OpenGL ES3.0ではプログラマブルシェーダの構成には変化がありませんでした。Android系だと、大体Android4.xくらいの端末(あくまで目安)がこの世代です。
2014年にはOpenGL ES3.1が登場。ここで、GPGPUに対応するComputeShaderと呼ばれるプログラマブルシェーダが新たにサポートされることとなります。iPhone系だとiPhone5S~6、Android系だとAndroid5.xくらい(あくまで目安)の端末がこの世代です。
2015年に発表されたばかりのOpenGL ES3.2では、やっとジオメトリシェーダ、ハルシェーダ、ドメインシェーダがサポートされるようになりました。つまり、スマホ・タブレットの表現がついにDirectX11相当になったということです。いい換えれば、早くもスマホやタブレットのGPUの表現能力は、PS4、Xbox One世代の最新据え置き型ゲーム機相当に追いついてきた……ということです。iPhone系ではiPhone6s、Android系だとAndroid6.x(あくまで目安)がこの世代ということになりますが、OpenGL ES3.2自体がまだ発表されたばかりですから、開発環境は整備中ということもあり、実際にそうした新シェーダー群をフル活用したアプリやゲームが出てくるのはもう少し先になるとは思います。
なお、ここでお話ししたのは、あくまで「表現世代がどの据え置きかゲーム機に相当するか」というものです。なので、「OpenGL ES3.2世代のGPUを搭載したスマホで、PS4、Xbox Oneのゲームが動くぞ」ということをいっているわけではありません。スマホ・タブレットと家庭用ゲーム機では、メモリサイズも違いますし、プロセッサの動作速度も違いますからね。あくまで、「両者、お絵描きセットの絵の具の色数が同じ」というだけで、「画家としての実力は違う」ととらえてください。
とはいえ、表現世代が同じということは、プログラマブルシェーダを活用して制作した表現テクニック(シェーダプログラム)は流用できるということですから、数年すると、PS4、Xbox Oneの表現力に肉迫するようなグラフィックスのスマホ・タブレットのゲームが出てきても不思議ではありません。