GLSL
[Wikipedia|▼Menu]
out 出力変数。 VSではGSまたはFSへ(旧varying)、GSではFSへ渡す頂点情報セットを表す。FSでは最終的にピクセル単位で出力する色情報を表す。

inout 入出力変数。

シェーダーステージ

OpenGL 4.3 (GLSL 4.3) 以降、OpenGL ES 3.2 (GLSL ES 3.2) 以降、およびVulkan 1.0以降で、以下の6種類のシェーダーステージに対応している。

頂点シェーダー (vertex shader)

テッセレーション制御シェーダー (tessellation control shader) : GLSL 4.0 / GLSL ES 3.2で対応

テッセレーション評価シェーダー (tessellation evaluation shader) : GLSL 4.0 / GLSL ES 3.2で対応

ジオメトリシェーダー (geometry shader) : GLSL 1.5 / GLSL ES 3.2で対応

フラグメントシェーダー (fragment shader)

コンピュートシェーダー (compute shader) : GLSL 4.3 / GLSL ES 3.1で対応

コンパイルと実行

GLSLシェーダープログラムは単体のアプリケーションではない。シェーダーの実行にはOpenGL APIを利用するホストアプリケーションが必要である。ホストアプリケーションを記述する言語には、OpenGL APIをサポートする第一級言語であるC言語およびC++、あるいはWebGLをサポートするJavaScriptなどがよく利用される。

従来方式では、GLSLシェーダーはOpenGL API関数を通じて、ハードウェアベンダーの実装したデバイスドライバー上のオンラインコンパイラによって実行時にコンパイルされる。GLSLシェーダープログラムのソースコードはホストプログラム上の文字列リテラルとして記述されたり、アプリケーション実行時に外部テキストファイルなどから読み込まれたりしたものがメモリ上の文字列データとして実体化されるが、オフラインの事前コンパイル方式ではなく、あくまでドライバーにはソースコード文字列の形式で送られ、ドライバーが実行時にシェーダーのソースコードをコンパイルして「シェーダープログラムオブジェクト」を生成する。具体的な手順として、アプリケーションはまずglCreateShader()で各シェーダーステージのシェーダーオブジェクトを生成し、そのシェーダーオブジェクトに対してGLSLソースコード文字列をglShaderSource()で設定した後、glCompileShader()によってシェーダーをコンパイルする。その後、glCreateProgram()で生成したプログラムオブジェクトに対して、glAttachShader()で前述のコンパイル済みシェーダーオブジェクトを関連付け、glLinkProgram()でリンクすることで、ようやく一連のプログラマブルシェーダーパイプラインが完成する。シェーダープログラムを利用して描画するには、描画命令を発行する前にglUseProgram()で現在のOpenGLコンテキストにプログラムオブジェクトをバインドしておく必要がある。

シェーダープログラムのコンパイルやリンクは時間のかかる処理であり、アプリケーション初期化のボトルネックとなりうるため、直近のソースコード文字列に対応するコンパイル結果はドライバー側でキャッシュされる実装になっていることも多い。なお、OpenGL 4.1で標準化されたGL_ARB_get_program_binaryにより、コンパイル済みバイナリのシリアライズ・逆シリアライズが拡張としてサポートされるようになったが、バイナリがベンダー間で互換性のある中間形式であるかどうかは保証されない。OpenGL 4.5で標準化されたGL_ARB_parallel_shader_compileにより、マルチスレッドを利用したシェーダーの並列コンパイルが拡張としてサポートされるようになった。デバイスドライバーがGLSLコンパイラを内蔵していることから、ドライバーによってシェーダープログラムのコンパイル結果や実行結果が異なる可能性があるなどの品質問題も抱えている。

OpenGL 4.6では中間表現SPIR-Vがサポートされるようになり、オフラインコンパイルが可能になったことから、OpenGLでプログラマブルシェーダーを利用するために必ずしもGLSLを利用する必要はなくなった。なお、Direct3Dのシェーディング言語であるHLSLはリリース当初から、コンパイル結果はベンダー非依存のバイトコードで出力され、またコンパイル済みバイナリの読み込みもサポートしていた。
単純なGLSLバーテックスシェーダーの例

これは固定機能パイプラインと同様に入力頂点を変換する。void main(void){ gl_Position = ftransform();}

ftransform()はGLSL 1.40とGLSL ES 1.0からはサポートされない。代わりに、プログラマは新しいOpenGL 3.1標準に従いモデルビュー行列と投影行列を明示的に指定する必要がある。#version 140uniform 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); // Red.}
バージョン

GLSLはOpenGL仕様とともにバージョンアップされている。OpenGL 3.2までは、対応するGLSLのバージョン番号はOpenGL本体のバージョン番号と無関係にナンバリングされていたが、OpenGL 3.3以降は同一の番号が割り当てられるようになった。

OpenGLバージョンGLSLバージョン#versionディレクティブ
1.51.0
2.01.1#version 110
2.11.2#version 120
3.01.3#version 130
3.11.4#version 140
3.21.5#version 150
3.33.3#version 330
4.04.0#version 400
4.14.1#version 410
4.24.2#version 420
4.34.3#version 430
4.44.4#version 440
4.54.5#version 450
4.64.6#version 460

GLSL ESもOpenGL ES仕様とともに更新されている。

OpenGL ESバージョンGLSL ESバージョン#versionディレクティブ
2.01.0#version 100
3.03.0#version 300 es
3.13.1#version 310 es
3.23.2#version 320 es

ツール

GLSLシェーダーは単独で動作するプログラムではなく、シェーダープログラムをGPU上で走らせるためには、まずC/C++などで書かれたホストアプリケーションに入力する必要がある。具体的にはOpenGL APIを使ってシェーダープログラムをコンパイル・リンクしたのち、OpenGLレンダリングコンテキストにプログラムオブジェクトをバインドしてからプリミティブのレンダリングを実行する必要があるが、それらの一連の処理を簡略化するためにいくつかのGLSL開発者・デザイナー用ツール(オーサリングツール)が存在する。

RenderMonkey - ATIによって開発された。DirectXシェーダーと同様にGLSLシェーダーを作成、コンパイル、デバッグできるインタフェースを提供している。Microsoft Windows上でのみ実行できる。GPUOpen(英語版)に移管されているが、開発およびサポートは終了している。

GLSLEditorSample - macOS上でのみ実行できるCocoaアプリケーション。シェーダーの作成とコンパイルはできるがデバッガ機能は組み込まれていない。

Lumina - 新しいGLSL開発ツール。プラットフォーム独立でインタフェースにQtを使っている。

Blender - GPLライセンスのモデリングおよびアニメーション作成パッケージで、バージョン2.4.1で内蔵しているゲームエンジンがGLSLをサポートするようになった。

Mozilla Firefox - 開発者向けツールとして、WebGL用のバーテックスシェーダー・フラグメントシェーダーを参照・編集できるシェーダーエディターが実装されている[8]

脚注[脚注の使い方]^ Core Image Kernel Language Reference


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:30 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef