
近年のAAAクラスのゲームの初回起動時に良く行われるのが、「シェーダーコンパイル」と呼ばれる長い処理です。最近だと『モンスターハンターワイルズ』のベンチマークやオープンベータテストの初回起動でもこの表示が行われ、その長い待ち時間に「これはいったい何をやっているんだ!?」と思われた方々も多いのではないかと思います。そこで今回の記事では、この「シェーダーコンパイル」がいったい何者なのかを説明していきます。
そもそも「シェーダー」って?
そもそも、「シェーダーコンパイル」の「シェーダー」とは何者なのでしょう。Wikipediaの「シェーダー」の記事には、こうあります。
シェーダー(英: shader)はグラフィックスパイプラインを構成する各ステージの挙動を記述したプログラムである。
はい、何のことやら?ですね。これを多少わかりやすく翻訳すると、以下のような感じになります。
シェーダーは、グラフィックを描画している最中に「ここは特別にこう描写して!」とお願いする指示書です。
CGに興味のある方や昔からゲームを遊んでいる方は「グローシェーディング」や「トゥーンシェーディング」といったフレーズを聞いたことがあるかもしれませんが、これらはこの「シェーダー」にいろいろ指示を出して、描画されるポリゴンの合間や表面に特殊な描画処理を行ったものになります。これらの処理によって、グラフィックの質感が向上するわけです。
個人製作のゲームではシェーダーまで細かく作り込む例は稀ですが、AAAタイトルやCG映画ともなるとシェーダー専属のアーティストがいることも珍しくありません。こういったタイトルでは、膨大なシェーダーが使用されます。
ではなぜ「シェーダーコンパイル」が必要なのか
便利な「シェーダー」ですが、処理されるグラフィック環境によって受け付ける言語が異なるという問題があります。主にWindows向けのグラフィックを取り扱うDirectX向けに書いたシェーダーのプログラムは、他の環境で主にグラフィックを取り扱うOpenGL向けには動きませんし、逆もまた然りです。また、コンソール機向けにはコンソール独自のシェーダープログラムしか受け付けない、という例もあります。
ここで登場するのが「シェーダーコンパイル」です。あらかじめシェーダーの作成者は共通のシェーダー記述言語でシェーダーを書き、それぞれの環境でゲームが初回起動された際にその環境に合ったシェーダーを調べ、その環境向けにシェーダーを翻訳(コンパイル)する……ということを近年のゲームでは数多く行っています。この仕組みを採用することで、シェーダーの作成者は個別の環境ごとにシェーダーを書くことなく、それぞれの環境に最適化されたシェーダーコードが自動生成されるのでゲーム制作者の負担が大幅に減り、環境によって動かないということも少なくなるというわけです(その代わりにユーザーのゲーム初回起動時に多大な時間を要するわけですが)。
なお、ここでいう「環境」には、グラフィックボードの挙動に影響を及ぼすドライバも含まれています。したがって、グラフィックドライバが更新されるだけでも再度「シェーダーコンパイル」が発生してしまうわけです。
「シェーダーコンパイル」は近年のゲームエンジンにはほぼ搭載されており、UnityやUnreal Engineにもこれを実現する機能が搭載されています。冒頭の『モンスターハンターワイルズ』はカプコン内製のREエンジンで制作されていることが明らかにされていますが、同エンジンにも同等の「シェーダーコンパイル」機能が搭載されているものと思われます。
以上、「シェーダーコンパイル」について簡単に説明してみました。ユーザーからしてみると初回起動に時間がかかるのはたまったものではありませんが、そこではゲーム開発に関わったグラフィッカーの魂がこもったシェーダーたちが展開されているのだ……と考えると、少しこの初回起動の待ち時間の見方が変わってくるのではないでしょうか。