GLSL(
OpenGL Shading Language)は、
OpenGLの
グラフィックスパイプラインを制御するための高レベル
シェーディング言語です。
C言語の構文をベースにしており、開発者が
アセンブリ言語やハードウェアに依存した言語を使わずに、GPUを直接制御できるように設計されています。これにより、柔軟で効率的なグラフィックス処理が可能になります。
背景
1990年代までのリアルタイム3Dグラフィックスは、固定のレンダリングパイプライン上で、あらかじめ用意された固定機能の
シェーダーを組み合わせることで実現されていました。しかし、2000年以降、GPUの進化に伴い、ソフトウェアプログラムによるプログラマブル
シェーダーが登場し、レンダリングパイプラインの柔軟性と表現力が大幅に向上しました。GLSLは、このプログラマブル
シェーディングをより直感的かつ効率的に行うために開発されました。
OpenGL ARBによって策定され、
OpenGLをオープンスタンダードにする上で重要な役割を果たしました。
GLSLは2003年に
OpenGL 1.5の拡張機能として導入され、その後
OpenGL 2.0に正式に組み込まれました。初期のプログラマブル
シェーダーは、頂点単位の処理を行うバーテックス
シェーダーと、ピクセル単位の処理を行うフラグメント
シェーダーのみでしたが、その後、ジオメトリ
シェーダー、テッセレーション
シェーダー、コンピュート
シェーダーなどが追加され、より複雑で高度なグラフィックス処理が可能になりました。
GLSLのメリット
GLSLを使用することで、以下のようなメリットが得られます。
レンダリングアルゴリズムの柔軟なカスタマイズが可能になり、ハードウェアに依存しない高品質な3DCGシーンを構築できます。
Macintosh、Windows、
Linuxなど、複数のOS間で互換性が確保できます。
アセンブリ言語よりもコードの再利用性やメンテナンス性が向上します。
OpenGLをサポートするハードウェアベンダーのGPU上で動作する
シェーダーを記述できます。
各ハードウェアベンダーは、デバイスドライバー内にGLSLコンパイラを含めることで、GPUアーキテクチャに最適化されたコードを生成できます。
一方で、GLSLには以下のようなデメリットも存在します。
シェーダーのコンパイルやアタッチなど、レンダリングのための準備作業が増えます。
OpenGL APIに加えてGLSLの学習コストがかかります。
GPU特性やハードウェア仕様を考慮したコード記述が必要であり、CPUと比較してチューニングが難しい場合があります。
GLSLの派生規格
GLSLの派生規格として、組み込み環境向けの
OpenGL ES用の
シェーダー言語「GLSL ES」があります。これはESSLと呼ばれることもあります。また、Webブラウザ向けの
OpenGL ES派生規格である
WebGLでもGLSLが使用されます。さらに、ローレベルグラフィックスAPIであるVulkanでは、
シェーダープログラムの中間表現であるSPIR-Vを入力として受け付けますが、GLSLはSPIR-Vを出力するオフライン
シェーダーコンパイラで最初にサポートされた上位レベル
シェーディング言語です。
詳細
データ型
GLSLは、
C言語に似た基本データ型に加え、グラフィックス処理に特化したデータ型を定義しています。例として、以下のような型があります。
`void`: 値を返さない関数に使用
`bool`: 真偽値
`int`: 符号付き32ビット整数
`float`: 単精度浮動小数点数
`vec2`, `vec3`, `vec4`: 2, 3, 4要素の単精度浮動小数点数ベクトル
`bvec2`, `bvec3`, `bvec4`: 2, 3, 4要素の論理型
ベクトル
`ivec2`, `ivec3`, `ivec4`: 2, 3, 4要素の符号付き32ビット整数ベクトル
`mat2`, `mat3`, `mat4`: 2x2, 3x3, 4x4の単精度浮動小数点数
行列
`sampler1D`, `sampler2D`, `sampler3D`, `samplerCube`, `sampler1DShadow`, `sampler2DShadow`: テクスチャアクセス用のハンドル
符号なし32ビット整数や倍精度浮動小数点数も、後のバージョンでサポートされています。
演算子
GLSLは、C言語に似た演算子に加え、ベクトル演算に特化した演算子を提供しています。これにより、シェーダー開発者は柔軟かつ効率的にコードを記述できます。ポインタを除くC/C++の演算子を含んでいます。
関数と制御構造
GLSLは、C言語に見られる`if/else`、`for`、`while`、`do-while`、`break`、`continue`などの制御文をサポートしています。組み込み関数(ビルトイン関数)やユーザー定義関数も使用でき、GPUベンダーは組み込み関数の実装をハードウェアレベルで最適化できます。
変数
GLSLでは、C言語と同様に変数宣言と使用が可能です。変数には、以下の修飾子を付与できます。
`const`: 変化しない定数
`uniform`: 全てのシェーダーで使用可能なグローバルな読み出し専用変数
`in`: 入力変数(バーテックス
シェーダーでは頂点情報、ジオメトリ
シェーダーではバーテックス
シェーダーの出力、フラグメント
シェーダーでは補間された頂点情報を表す)
`out`: 出力変数(バーテックスシェーダーではジオメトリシェーダーまたはフラグメントシェーダーへ、ジオメトリシェーダーではフラグメントシェーダーへ、フラグメントシェーダーでは最終的なピクセル出力を表す)
`inout`: 入出力変数
GLSLは、以下の
シェーダーステージに対応しています。
頂点シェーダー (vertex shader)
テッセレーション制御
シェーダー (tessellation control shader)
テッセレーション評価シェーダー (tessellation evaluation shader)
ジオメトリ
シェーダー (geometry shader)
フラグメントシェーダー (fragment shader)
コンピュート
シェーダー (compute shader)
コンパイルと実行
GLSL
シェーダープログラムは、
OpenGL APIを使用するホストアプリケーションによって実行されます。通常、C/
C++や
JavaScriptで書かれたホストアプリケーションが、GLSL
シェーダーのコンパイル、リンク、実行を行います。
シェーダープログラムは、オンライン
コンパイラによって実行時にコンパイルされますが、最近ではオフラインコンパイルも可能になっています。コンパイル済みのバイナリをキャッシュすることで、パフォーマンスの向上が図られています。
GLSLのバージョン
GLSLは
OpenGLの仕様とともにバージョンアップされており、
OpenGL 3.3以降は
OpenGL本体と同じバージョン番号が付与されています。GLSL ESも
OpenGL ESの仕様に合わせて更新されています。
GLSL開発ツール
GLSL
シェーダー開発を支援するために、以下のようなツールが提供されています。
RenderMonkey: DirectXシェーダーと同様にGLSLシェーダーを作成、コンパイル、デバッグできるツール(現在は開発終了)。
GLSLEditorSample: macOSで動作するシンプルなエディター。
Lumina: クロスプラットフォーム対応の新しいGLSL開発ツール。
Blender: GLSLをサポートするモデリングおよびアニメーション作成パッケージ。
Mozilla Firefox: 開発者向けツールとして、WebGL用のシェーダーエディターが実装されている。
関連項目
OpenGL
OpenGL ES
Vulkan (API)
WebGL
HLSL
Cg (プログラミング言語)
シェーディング言語
*
Core Image