GLSL (OpenGL Shading Language) はGLslangとしても知られ、C言語をベースとした高レベルシェーディング言語である。これはアセンブリ言語やハードウェアに依存した言語を使わないで、開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARB (Architecture Review Board) で策定された。Direct3D 7までの時代、すなわち1990年代までのリアルタイム3Dコンピューターグラフィックスは、OpenGLやDirect3DといったAPIを通して、グラフィックスカード上のチップ(GPU)にあらかじめ用意された固定のレンダリングパイプライン上で、固定機能のシェーダー(頂点トランスフォームや陰影計算を専門に担当するユニット)を組み合わせることで実現されていた。Direct3D 8が登場した2000年以降は、グラフィックスカードの進化・性能向上に伴い、新機能はハードウェア実装による固定機能ではなく、アプリケーション開発者がソフトウェアプログラム(プログラマブルシェーダー)によって頂点レベル・フラグメントレベル(ピクセルレベル)での制御・カスタマイズを行ない、レンダリングパイプライン内での柔軟性や表現力を増すことができる形で追加されることが多くなっている。元々、このプログラマブルシェーディング機能は複雑で直感的でないアセンブリ言語で書かれたシェーダーを使わないと実現できなかった。OpenGL ARBは、OpenGLをグラフィックス産業の歴史の中でオープンスタンダードなものにしていく中で、グラフィックス処理を行うプログラミングをより直感的・効率的にできる方法として、OpenGL Shading Languageを作り出した。OpenGL Shading Languageは2003年に発表されたOpenGL 1.5の拡張機能として導入されたが、OpenGL ARBはOpenGL 2.0にGLSLを含めることを正式に決定した。OpenGL 2.0は1992年に発表されたOpenGL 1.0から数えて初のメジャーバージョンアップである。初期のOpenGLプログラマブルシェーダーは、頂点単位のトランスフォームや陰影計算を行なうバーテックスシェーダーと、フラグメント(ピクセル)単位の陰影計算を行なうフラグメントシェーダーのみが利用可能であった。その後、プリミティブの増減や変更などを実行できるジオメトリシェーダーがOpenGL 3.2/GLSL 1.5にて標準化された。また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とは得意分野が若干異なる。GLSLを使うメリットとして、などが挙げられる。従来の固定機能シェーダーに対するデメリットとしては、などが挙げられる。なお、GLSLの派生規格として、組み込み環境向けのOpenGL ES用のシェーダー言語「GLSL ES」が存在する。OpenGL Shading Language 1.50の仕様では64の基本データ型を定義している。いくつかはC言語内で使われていたものとまったく同じものであるが、一方他のものはグラフィックス処理に特化している。例えば以下のような型が定義されている。なお、符号なし32bit整数のサポートはOpenGL 3.0 (GLSL 1.3) で標準化され、また科学計算などの分野で必要とされることの多い倍精度浮動小数点数のサポートはOpenGL 4.0 (GLSL 4.0) で標準化されている。OpenGL Shanding LanguageはホストプログラムにC言語がよく使われていることを背景にして、それによく似た多くの演算子、加えてベクトル演算に特化した特殊な演算子(Tupleを返すSwizzle演算など)も提供している。このことにより、シェーダー開発者はシェーダーを柔軟にかつ効率よく書くことができる。GLSLはポインタを除くCやC++での演算子を含んでいる。C言語に似ているということは、もちろんGLSLは、codice_23などの繰り返しや分岐といった制御文をサポートしている。ユーザ定義関数もサポートしており、ビルトイン関数と同様広く使われている。このことにより、グラフィックスカードメーカーは、ハードウェアレベルでそれらの組み込み関数を任意で最適化することができる。これらの関数の多くはcodice_24やcodice_25のようなC言語の標準ライブラリで見られるものとよく似ているが、一方でcodice_26やcodice_27のようなグラフィックスプログラミングに特化しているようなものもある。GLSLコード内における変数の宣言・使用方法は、C言語でのそれに似ている。変数の修飾子は4つある(以下バーテックスシェーダー、ジオメトリシェーダー、フラグメントシェーダーをそれぞれVS, GS, FSと示す)。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はリリース当初から、コンパイル結果はベンダ非依存のバイトコードとなり、またコンパイル済みバイナリの読み込みもサポートしていた。これは固定機能パイプラインと同様に入力頂点を変換する。codice_36はGLSL 1.40とGLSL ES 1.0からはサポートされない。代わりに、プログラマは新しいOpenGL 3.1標準に従いモデルビュー行列と投影行列を明示的に指定する必要がある。GLSLはOpenGL仕様とともにバージョンアップされている。OpenGL 3.2までは、対応するGLSLのバージョン番号はOpenGL本体のバージョン番号と無関係にナンバリングされていたが、OpenGL 3.3以降は同一の番号が割り当てられるようになった。GLSLシェーダーは単独で動作するプログラムではなく、シェーダープログラムをGPU上で走らせるためには、まずC/C++などで書かれたホストアプリケーションに入力する必要がある。具体的にはOpenGL APIを使ってシェーダープログラムをコンパイル・リンクしたのち、OpenGLレンダリングコンテキストにプログラムオブジェクトをバインドしてからプリミティブのレンダリングを実行する必要があるが、それらの一連の処理を簡略化するためにいくつかのGLSL開発者・デザイナー用ツール(オーサリングツール)が存在する。
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。