GLSL

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索

GLSL (OpenGL Shading Language) はGLslangとしても知られ、C言語をベースとした高レベルシェーディング言語である。これはアセンブリ言語やハードウェアに依存した言語を使わないで、開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARBで策定された。最新版は、GLSL 4.10(米国時間2010年7月28日)である。

目次

[編集] 背景

近年のグラフィックスカードの進化に伴い、新機能は頂点とフラグメントレベルでレンダリングパイプライン内で柔軟性を増すことができるように追加されている。この段階でのプログラマビリティはバーテックスシェーダとフラグメントシェーダ、ジオメトリシェーダ(GLSL 1.50以降標準機能)を使うことで確保できる。またOpenGL 4.0で固定機能シェーダーであるテッセレーションステージが追加されるに伴い、テッセレーション・コントロールシェーダーと、テッセレーション・エバリュエーションシェーダー、これら2つのプログラマブルなシェーダーがGLSLの仕様に追加された。フラグメントシェーダーもサンプルレベルでの制御が可能となった。 OpenGLと同様のグラフィックスAPIであるDirectXにはバージョン11以降、GPUにおける汎用的なコンピューティングを可能とするDirectX Compute Shaderが追加されている。OpenGL、GLSLの仕様にはこれに相当するシェーダーは含まれていないが、実際にはOpenGLの管轄であるクロノスが策定している、GPUを汎用コンピューティングに用いるAPI(実際にはCPUやGPU等あらゆる計算資源を計算に用いるAPI)のOpenCLが相当する。

元々、この機能は複雑で直感的でないアセンブリ言語で書かれたシェーダを使わないと実現できなかった。OpenGL ARBは、OpenGLをグラフィックス産業の歴史の中でオープンスタンダードなものにしていく中で、グラフィックス処理を行うプログラミングをより直感的にできる方法として、OpenGL Shading Languageを作り出した。

これはOpenGL 1.5の拡張として導入されたが、OpenGL ARBはOpenGL 2.0にGLSLを含めることを正式に決定した。OpenGL 2.0は1992年に発表されたOpenGL 1.0から数えて初のメジャーバージョンアップである。

GLSLを使うメリットとして、

  • MacintoshWindowsLinuxを含む複数のOS間での互換性
  • OpenGL Shading Languageをサポートするどんなハードウェアベンダのグラフィックスカード上でも動作するシェーダを書くことができる能力
  • それぞれのハードウェアベンダはデバイスドライバ内にGLSLコンパイラを含めることができるので、そのグラフィックスカードのアーキテクチャに最適化されたコードを作ることができる。

[編集] 詳細

[編集] データ型

OpenGL Shading Language 1.50の仕様では64の基本データ型を定義している。いくつかはC言語内で使われていたものとまったく同じものであるが、一方他のものはグラフィックス処理に特化している。 例えば以下のような型が定義されている。

  • void 値を返さない関数に用いる
  • bool 条件型。値はtrueかfalseのどちらかを返す
  • int 符号付整数
  • float 符号付浮動小数点数
  • vec2 2要素を持つ浮動小数点数ベクトル
  • vec3 3要素を持つ浮動小数点数ベクトル
  • vec4 4要素を持つ浮動小数点数ベクトル
  • bvec2 2要素を持つ論理型ベクトル
  • bvec3 3要素を持つ論理型ベクトル
  • bvec4 4要素を持つ論理型ベクトル
  • ivec2 2要素を持つ整数型ベクトル
  • ivec3 3要素を持つ整数型ベクトル
  • ivec4 4要素を持つ整数型ベクトル
  • mat2 2x2要素を持つ浮動小数点数行列
  • mat3 3x3要素を持つ浮動小数点数行列
  • mat4 4x4要素を持つ浮動小数点数行列
  • sampler1D 1次元のテクスチャにアクセスするためのハンドル
  • sampler2D 2次元のテクスチャにアクセスするためのハンドル
  • sampler3D 3次元のテクスチャにアクセスするためのハンドル
  • samplerCube キューブマップテクスチャにアクセスするためのハンドル
  • sampler1DShadow 1次元のデプステクスチャにアクセスするためのハンドル
  • sampler2DShadow 2次元のデプステクスチャにアクセスするためのハンドル

[編集] 演算子

OpenGL Shanding LanguageはホストプログラムにC言語がよく使われていることを背景にして、それによく似た多くの演算子、加えてベクトル演算に特化した特殊な演算子(Tupleを返すSwizzle演算など)も提供している。このことにより、シェーダ開発者はシェーダを柔軟に書くことができる。GLSLはポインタを除くCやC++での演算子を含んでいる。

[編集] 関数と制御構造

C言語に似ているということは、もちろんGLSLは、if、else if/else、for、do-while、breakcontinueなどの繰り返しや分岐といった制御文をサポートしている。

ユーザ定義関数もサポートしており、ビルトイン関数と同様広く使われている。このことにより、グラフィックスカードメーカーは、ハードウェアレベルでそれらの組み込み関数を任意で最適化することができる。これらの関数の多くは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を利用するアプリケーションが必要である。CC++C#DelphiJavaはすべて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をサポートするようになった。
個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語