シェーダ(Shader)というのは GPU(Graphics Processing Unit/いわゆるグラボ/描画専用ハードウェア) 上で実行されるプログラムのことです。
シェーディング言語を用いて独自の表現をプログラム可能なシェーダを「プログラマブルシェーダ」と呼びます。プログラマブルシェーダは GPU の進化とともに、昨今のゲーム分野では豊富な、そして高度な表現を実現するための機能として特に欠かせないものとなりました。
プログラマブルシェーダにも種類があり、大まかな分類ではマイクロソフト の OS (DirectX)で利用される HLSL 系、もう一方が Windows/Unix/Linux/他多数組み込み系で利用される OpenGL のプログラマブルシェーダ GLSL 系です。
- HLSL 系の利点 ≫ 高い動作互換性/マイクロソフトが提供する単一コンパイラ
- GLSL 系の弱点 ≫ 動作互換性の検証が困難/コンパイラが複数存在する
動作互換性に定評ある HLSL 系ですが、マイクロソフトの開発した DirectX はほぼゲーム専用 API となってしまい、利用されるシーンは限定的。これは同社のモバイル分野における展開が再三後手に回ったこととも関連があります。
モバイル向けには OpenGL のサブセットとして OpenGL ES が登場、モバイル(あるいは組み込み)における iPhone/Android の台頭が止めを刺す形で、ゲーム系でも DirectX を利用する意義を薄めてしまったのです。
GM:S が対応する各シェーダ記述言語
GM:S のコンパイラは複数のプログラマブルシェーダをサポートしています。
名称 | 詳細 |
---|---|
GLSL ES | All target platforms except Windows 8 (JS) |
GLSL | Mac and Ubuntu (Linux) |
HLSL9 | Windows 32 only |
HLSL11 | Windows Phone and Windows 8 (Native) |
各シェーダ言語は機能実装および表現力の差があり、異なったプログラマブルシェーダ間で表現の完全互換性を保つのは通常難しいです。だから従来は、各シェーダ記述言語を使って、それぞれプラットフォーム向けのシェーダを作成する必要がありました。
一方 GM:S はマルチプラットフォーム出力に対応したインディーズゲーム向け開発環境であり、開発者負担を減らすためにはシェーダもなるべく互換性を保った上で、一つのシェーディング言語で異なったプラットフォーム上でも共通して動かせる仕組みを模索してきました。
そこで GM:S が提供する解決策となったのが、GLSL ES (openGL Shading Language Embedded Systems)を標準とした利用の推奨です。
※ OpenGL というフルセット版に対するサブセット版として OpenGL ES が作られ、プログラマブルシェーダに対応したOpenGL ES 2.0 用のシェーダ記述言語として GLSL ES が用いられる
GLSL ES で書かれたシェーダに関して、Windows 用バイナリを作る際に GM:S の内部で HLSL 向けの変換作業が行われます。HLSL から GLSL ES への変換は組み込まれていないため、GLSL ES を標準としてシェーダを作れば、基本的には GM:S の出力できるほぼ全てのプラットフォームはカバーできるということになっています。
このような事情によって当ブログでも HLSL は今後ほぼ触らず、基本的に GM:S のシェーダとしては GLSL ES とその動作検証とが優先されます。
ちなみに、3D ゲームの統合開発環境である Unity3D や UE4 は、カスタムシェーダを作る際に Cg/HLSL 系を標準として扱います。これら開発環境ではマルチプラットフォーム向けの対応として、HLSL から各 GLSL 系などへ変換するクロスコンパイラを備えています。
参考(YoYoGames Tech Blog):Shaders Overview – Part 1
参考(YoYoGames Tech Blog):Shader Surprise!参考(MSDN – Microsoft):GLSL と HLSL の対応を示すリファレンス
[divpage]