GLSL
| OpenGLシェーディング言語 | |
| 開発元 | シリコングラフィックス |
|---|---|
| 最新版 | 4.3 / 2012年08月6日 |
| プラットフォーム | クロスプラットフォーム |
| 種別 | 3DグラフィックスAPI(シェーダー言語) |
| 公式サイト | http://www.opengl.org/ |
GLSL (OpenGL Shading Language) はGLslangとしても知られ、C言語をベースとした高レベルシェーディング言語である。これはアセンブリ言語やハードウェアに依存した言語を使わないで、開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARBで策定された。
目次 |
背景 [編集]
近年のグラフィックスカードの進化に伴い、新機能は頂点とフラグメントレベルでレンダリングパイプライン内で柔軟性を増すことができるように追加されている。この段階でのプログラマビリティはバーテックスシェーダーとフラグメントシェーダー、ジオメトリシェーダー(GLSL 1.50以降標準機能)を使うことで確保できる。またOpenGL 4.0で固定機能シェーダーであるテッセレーションステージが追加されるに伴い、テッセレーション・コントロールシェーダーと、テッセレーション・エバリュエーションシェーダー、これら2つのプログラマブルなシェーダーがGLSLの仕様に追加された。フラグメントシェーダーもサンプルレベルでの制御が可能となった。 なお、OpenGLと同様の3DグラフィックスAPIであるDirectX(Direct3D)およびそのシェーディング言語であるHLSLにはバージョン11以降、GPUにおける汎用的なコンピューティング(GPGPU)を可能とするDirectX Compute Shader(DirectCompute)が追加されているが、OpenGLおよびGLSLのバージョン4.0時点ではこれに相当するシェーダーは含まれていなかった。しかし、バージョン4.3においてOpenGL Compute Shaderとして同等機能が導入されることになった。なお、Compute Shaderの導入以前からOpenGLの管轄を行なっているクロノスが同様にオープン仕様として策定している、GPUを汎用コンピューティングに用いることのできるAPIとしてOpenCLが存在するが、こちらはCPUやGPU等あらゆる計算資源を計算に用いることのできる異種計算資源混在(ヘテロジニアス)環境向けのAPIであり、グラフィックスパイプラインとの連携を主目的としたCompute Shaderとは得意分野が若干異なる。
元々、このプログラマブルシェーディング機能は複雑で直感的でないアセンブリ言語で書かれたシェーダーを使わないと実現できなかった。OpenGL ARBは、OpenGLをグラフィックス産業の歴史の中でオープンスタンダードなものにしていく中で、グラフィックス処理を行うプログラミングをより直感的・効率的にできる方法として、OpenGL Shading Languageを作り出した。
これはOpenGL 1.5の拡張として導入されたが、OpenGL ARBはOpenGL 2.0にGLSLを含めることを正式に決定した。OpenGL 2.0は1992年に発表されたOpenGL 1.0から数えて初のメジャーバージョンアップである。
GLSLを使うメリットとして、
- MacintoshやWindows、Linuxを含む複数のOS間での互換性
- OpenGL Shading Languageをサポートするどんなハードウェアベンダのグラフィックスカード上でも動作するシェーダーを書くことができる能力
- それぞれのハードウェアベンダはデバイスドライバ内にGLSLコンパイラを含めることができるので、そのグラフィックスカードのアーキテクチャに最適化されたコードを作ることができる。
詳細 [編集]
データ型 [編集]
OpenGL Shading Language 1.50の仕様では64の基本データ型を定義している。いくつかはC言語内で使われていたものとまったく同じものであるが、一方他のものはグラフィックス処理に特化している。 例えば以下のような型が定義されている。
void値を返さない関数に用いるbool条件型。値はtrueかfalseのどちらかを返すint符号付整数float符号付浮動小数点数vec22要素を持つ浮動小数点数ベクトルvec33要素を持つ浮動小数点数ベクトルvec44要素を持つ浮動小数点数ベクトルbvec22要素を持つ論理型ベクトルbvec33要素を持つ論理型ベクトルbvec44要素を持つ論理型ベクトルivec22要素を持つ整数型ベクトルivec33要素を持つ整数型ベクトルivec44要素を持つ整数型ベクトルmat22x2要素を持つ浮動小数点数行列mat33x3要素を持つ浮動小数点数行列mat44x4要素を持つ浮動小数点数行列sampler1D1次元のテクスチャにアクセスするためのハンドルsampler2D2次元のテクスチャにアクセスするためのハンドルsampler3D3次元のテクスチャにアクセスするためのハンドルsamplerCubeキューブマップテクスチャにアクセスするためのハンドルsampler1DShadow1次元のデプステクスチャにアクセスするためのハンドルsampler2DShadow2次元のデプステクスチャにアクセスするためのハンドル
演算子 [編集]
OpenGL Shanding LanguageはホストプログラムにC言語がよく使われていることを背景にして、それによく似た多くの演算子、加えてベクトル演算に特化した特殊な演算子(Tupleを返すSwizzle演算など)も提供している。このことにより、シェーダー開発者はシェーダーを柔軟に書くことができる。GLSLはポインタを除くCやC++での演算子を含んでいる。
関数と制御構造 [編集]
C言語に似ているということは、もちろんGLSLは、if、else if/else、for、do-while、break、continueなどの繰り返しや分岐といった制御文をサポートしている。
ユーザ定義関数もサポートしており、ビルトイン関数と同様広く使われている。このことにより、グラフィックスカードメーカーは、ハードウェアレベルでそれらの組み込み関数を任意で最適化することができる。これらの関数の多くはexp()やabs()のようなC言語の標準ライブラリで見られるものとよく似ているが、一方でsmoothstep()やtexture2D()のようなグラフィックスプログラミングに特化しているようなものもある。
変数 [編集]
GLSLコード内における変数の宣言・使用方法は、C言語でのそれに似ている。
変数の修飾子には4つある(以下バーテックスシェーダー、ジオメトリシェーダー、フラグメントシェーダーをそれぞれVS, GS, FSと示す)。
const変化しない。uniform全てのシェーダーで使用可能なグローバルな読み出し専用変数。in入力変数。VSではOpenGLから渡される頂点情報セットを表す(旧attribute)。GSではVSによって計算された頂点情報セット、FSではVSまたはGSによって計算された頂点情報が補間された値を表す(旧varying)。out出力変数。 VSではGSまたはFSへ(旧varying)、GSではFSへ渡す頂点情報セットを表す。FSでは最終的にピクセル単位で出力する色情報を表す。inout入出力変数。
コンパイルと実行 [編集]
GLSLシェーダーは単体のアプリケーションではない。この実行にはOpenGL APIを利用するアプリケーションが必要である。C、C++、C#、Delphi、JavaはすべてOpenGL APIをサポートしており、OpenGL Shading Languageもまたサポートしている。
GLSLシェーダー自身は単純にOpenGL APIのエントリポイントを使ってハードウェアベンダのドライバにコンパイルするためのソースコード文字列を渡しているだけである。シェーダーはアプリケーション内で実行時に読み込み、ないしはテキストファイルから事前に読み込まれて生成されるが、あくまでドライバには文字列の形式で送られる。なお、OpenGL 4.1で標準化されたGL_ARB_get_program_binaryにより、コンパイル済みバイナリのシリアライズ・逆シリアライズがサポートされるようになったため、この状況は変わりつつある(ただしバイナリがベンダ間で互換性のある中間形式であるかどうかは保証されない)。なお、Direct3Dのシェーディング言語であるHLSLはリリース当初から、コンパイル結果はベンダ非依存のバイトコードとなり、またコンパイル済みバイナリの読み込みもサポートしていた。
単純なGLSLバーテックスシェーダーの例 [編集]
これは固定機能パイプラインと同様に入力頂点を変換する。
void main(void) { gl_Position = ftransform(); }
ftransform()はGLSL 1.40とGLSL ES 1.0からはサポートされない。代わりに、プログラマは 新しいOpenGL 3.1標準に従いモデルビュー行列と投影行列を明示的に指定する必要がある。
#version 140 uniform mat4 projectionMatrix; uniform mat4 modelviewMatrix; in vec3 position; void main(void) { gl_Position = projectionMatrix * modelviewMatrix * vec4(position, 1.0); }
単純なGLSLジオメトリシェーダーの例 [編集]
layout(triangles) in; layout(triangle_strip, max_vertices = 3) out; in Input { vec4 Position; } VSout[3]; void main(void) { for(int i = 0; i < 3; i++) { gl_Position = VSout[i].Position; EmitVertex(); } EndPrimitive(); }
単純なGLSLフラグメントシェーダーの例 [編集]
void main(void) { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }
ツール [編集]
GLSLシェーダーを作ったりテストするには、シェーダプログラムを使うアプリケーションに入力する必要がある。それらを行うためにいくつかのGLSL開発者用ツールが存在する。
- RenderMonkey - ATIによって開発。DirectXシェーダーと同様にGLSLシェーダーを作成、コンパイル、デバッグできるインタフェースを提供している。Microsoft Windows上でのみ実行できる。
- GLSLEditorSample - Mac OS X上でのみ実行できるCocoaアプリケーション。シェーダーの作成とコンパイルはできるがデバッガ機能は組み込まれていない。
- Lumina - 新しいGLSL開発ツール。プラットフォーム独立でインタフェースにQtを使っている。
- Blender - GPLライセンスのモデリングおよびアニメーション作成パッケージで、バージョン2.4.1で内蔵しているゲームエンジンがGLSLをサポートするようになった。