GLSL
[Wikipedia|▼Menu]

GLSL設計者OpenGL ARB
開発者
クロノス・グループ
最新リリース4.6/ 2017年7月31日 (6年前) (2017-07-31)
型付け静的型付け
主な処理系glslangValidator, glslc
影響を受けた言語C言語C++
影響を与えた言語Core Image Kernel Language[1]、Android Graphics Shading Language (AGSL)[2]
プラットフォームクロスプラットフォーム
ウェブサイトwww.opengl.org
拡張子glsl, vert, frag, geom, tesc, tese, comp
テンプレートを表示
ビデオゲームはリアルタイムでレンダリングの計算をOpenGL経由でGPUにアウトソーシングする。シェーダーはOpenGL Shading Languageで書かれ、コンパイルされる。コンパイルされたプログラムはGPUで実行される。

GLSL (OpenGL Shading Language) はGLslangとしても知られ、C言語の構文をベースとした高レベルシェーディング言語である。これはアセンブリ言語やハードウェアに依存した言語を使わないで、アプリケーションソフトウェア開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARB (Architecture Review Board) [3]で策定された。
背景

Direct3D 7までの時代、すなわち1990年代までのリアルタイム3Dコンピューターグラフィックスは、OpenGLやDirect3DといったAPIを通して、グラフィックスカード上のチップ(GPU)にあらかじめ用意された固定のレンダリングパイプライン上で、固定機能のシェーダー(頂点トランスフォームや陰影計算を専門に担当するユニット)を組み合わせることで実現されていた。Direct3D 8が登場した2000年以降は、GPUの進化・性能向上に伴い、新機能はハードウェア実装による固定機能ではなく、アプリケーション開発者がソフトウェアプログラム(プログラマブルシェーダー)によって頂点レベル・フラグメントレベル(ピクセルレベル)での制御・カスタマイズを行ない、レンダリングパイプライン内での柔軟性や表現力を増すことができる形で追加されることが多くなっている。

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

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

初期のOpenGLプログラマブルシェーダーは、頂点単位のトランスフォームや陰影計算を行なうバーテックスシェーダー (vertex shader) と、フラグメント(ピクセル)単位の陰影計算を行なうフラグメントシェーダー (fragment shader) のみが利用可能であった。その後、プリミティブ[5]の増減や変更などを実行できるジオメトリシェーダー (geometry shader) がOpenGL 3.2/GLSL 1.5にて標準化された。またOpenGL 4.0で固定機能シェーダーであるテッセレーションステージが追加されるに伴い、テッセレーション・コントロールシェーダー (tessellation control shader) と、テッセレーション・エバリュエーションシェーダー (tessellation evaluation shader)、これら2つのプログラマブルなシェーダーがGLSLの仕様に追加された。フラグメントシェーダーもサンプルレベルでの制御が可能となった。

なお、OpenGLと同様の3DグラフィックスAPIであるDirectXDirect3D)およびそのシェーディング言語であるHLSLにはバージョン11以降、GPUにおける汎用的なコンピューティング(GPGPU)を可能とするDirectX Compute Shader(DirectCompute)が追加されているが、OpenGLおよびGLSLのバージョン4.0時点ではこれに相当するシェーダーは含まれていなかった。しかし、バージョン4.3においてOpenGLコンピュートシェーダー (compute shader) として同等機能が導入されることになった。なお、コンピュートシェーダーの導入以前からOpenGLの管轄を行なっているクロノスが同様にオープン仕様として策定している、GPUを汎用コンピューティングに用いることのできるAPIとしてOpenCLが存在するが、こちらはCPUやGPU等あらゆる計算資源を計算に用いることのできる異種計算資源混在(ヘテロジニアス)環境向けのAPIであり、グラフィックスパイプラインとの連携を主目的としたコンピュートシェーダーとは得意分野が若干異なる。

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

レンダリングアルゴリズムの柔軟なカスタマイズや再利用性が増すことで、従来のハードウェア固定機能にとらわれない、柔軟でユニークかつ高品質なリアルタイム3DCGシーンの構築が可能となる。

MacintoshWindowsLinuxを含む複数のOS間での互換性を確保できる。

アセンブリ言語を用いるよりもコードの再利用性やメンテナンス性が増す。

OpenGL Shading LanguageをサポートするどんなハードウェアベンダーのGPU上でも動作するシェーダーを書くことができる能力を持つ。

それぞれのハードウェアベンダーはデバイスドライバー内にGLSLコンパイラを含めることができるので、そのGPUのアーキテクチャに最適化されたコードを生成することができる。

などが挙げられる。従来の固定機能シェーダーに対するデメリットとしては、

シェーダーのコンパイルおよびアタッチなど、レンダリングのための準備作業が増える。

OpenGL APIの他に、GLSLの学習コストがかかる。

GPU特性やハードウェア仕様を把握してGLSLコードを記述する必要があり、CPUと比較してチューニングが難しい。

などが挙げられる。

なお、GLSLの派生規格として、組み込み環境向けのOpenGL ES用のシェーダー言語「GLSL ES」が存在する。これはESSLと呼ばれることもある[6]

Webブラウザ向けのOpenGL ES派生規格としてWebGLが存在するが、WebGLでもGLSLが使用される。

クロノスが策定しているローレベルグラフィックスAPIであるVulkanは、シェーダープログラムの中間表現SPIR-Vを入力として受け付けるが、SPIR-Vを出力するオフラインシェーダーコンパイラglslangValidatorにおいて最初にサポートされた上位レベルシェーディング言語はGLSLである。のちにSPIR-VはOpenGL 4.6にも導入された。
詳細
データ型

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

void 値を返さない関数に用いる

bool 条件型。値はtrueかfalseのどちらかをとる

int 符号付32bit整数

float 単精度浮動小数点数

vec2 2要素を持つ単精度浮動小数点数ベクトル

vec3 3要素を持つ単精度浮動小数点数ベクトル

vec4 4要素を持つ単精度浮動小数点数ベクトル

bvec2 2要素を持つ論理型ベクトル

bvec3 3要素を持つ論理型ベクトル

bvec4 4要素を持つ論理型ベクトル

ivec2 2要素を持つ符号付32bit整数ベクトル

ivec3 3要素を持つ符号付32bit整数ベクトル

ivec4 4要素を持つ符号付32bit整数ベクトル

mat2 2x2要素を持つ単精度浮動小数点数行列

mat3 3x3要素を持つ単精度浮動小数点数行列

mat4 4x4要素を持つ単精度浮動小数点数行列

sampler1D 1次元のテクスチャにアクセスするためのハンドル

sampler2D 2次元のテクスチャにアクセスするためのハンドル

sampler3D 3次元のテクスチャにアクセスするためのハンドル

samplerCube キューブマップテクスチャにアクセスするためのハンドル

sampler1DShadow 1次元のデプステクスチャにアクセスするためのハンドル

sampler2DShadow 2次元のデプステクスチャにアクセスするためのハンドル

なお、符号なし32bit整数のサポートはOpenGL 3.0 (GLSL 1.3) で標準化され、また科学計算などの分野で必要とされることの多い倍精度浮動小数点数のサポートはOpenGL 4.0 (GLSL 4.0) で標準化されている。
演算子

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

GLSLは、C言語に見られるif/else if/elseforwhiledo-whilebreakcontinueなどの繰り返しや分岐といった制御文もサポートしている。

いくつかの組み込み関数(ビルトイン関数)のほか、ユーザー定義関数もサポートしている。GPUベンダーは、必要に応じて組み込み関数の実装をハードウェアレベルで最適化することもできる。組み込み関数の多くはexp()やabs()のようなC言語の標準ライブラリで見られるものとよく似ているが、一方でsmoothstep()やtexture2D()のようなグラフィックスプログラミングに特化しているようなものもある。
変数

GLSLコード内における変数の宣言・使用方法は、C言語でのそれに似ている。

変数の修飾子は4つある(以下バーテックスシェーダー、ジオメトリシェーダー、フラグメントシェーダーをそれぞれVS, GS, FSと示す)。

const 変化しない。

uniform 全てのシェーダーで使用可能なグローバルな読み出し専用変数。

in 入力変数。VSではOpenGLから渡される頂点情報セットを表す(旧attribute)。GSではVSによって計算された頂点情報セット、FSではVSまたはGSによって計算された頂点情報が補間された値を表す(旧varying)。

out 出力変数。


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

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