
OpenGL シェーディング言語( GLSL ) は、C プログラミング言語に基づいた構文を持つ高水準 シェーディング言語です。これは、開発者がARB アセンブリ言語やハードウェア固有の言語 を使用せずにグラフィックス パイプラインをより直接的に制御できるようにするために、 OpenGL ARB (OpenGL Architecture Review Board) によって作成されました。
背景
グラフィック カードの進歩により、頂点レベルとフラグメントレベルでのレンダリング パイプラインの柔軟性を高める新しい機能が追加されました。このレベルでのプログラミング可能性は、フラグメント シェーダーと頂点シェーダーの使用によって実現されます。
当初、この機能は、ARB アセンブリ言語でシェーダーを記述することで実現されていましたが、これは複雑で直感的ではありません。OpenGL ARB は、 OpenGL の歴史を通じて推進されてきたオープン スタンダードの利点を維持しながら、グラフィックス処理ユニットをより直感的にプログラミングする方法を提供するために、OpenGL シェーディング言語を作成しました。
GLSL はもともと OpenGL 1.4 の拡張機能として導入されましたが、2004 年に OpenGL ARB によって OpenGL 2.0 コアに正式に組み込まれました。これは、1992 年に OpenGL 1.0が作成されて以来、OpenGL に対する最初のメジャー リビジョンでした。
GLSL を使用する利点は次のとおりです。
- Linux、macOS、Windowsを含む複数のオペレーティング システムでのクロスプラットフォーム互換性。
- OpenGL シェーディング言語をサポートする任意のハードウェア ベンダーのグラフィック カードで使用できるシェーダーを作成する機能。
- 各ハードウェア ベンダーは、ドライバーに GLSL コンパイラーを組み込んでおり、これにより、各ベンダーは特定のグラフィック カードのアーキテクチャに最適化されたコードを作成できます。
バージョン
GLSL バージョンは、OpenGL API の特定のバージョンとともに進化してきました。GLSL と OpenGL のメジャー バージョン番号とマイナー バージョン番号が一致するのは、OpenGL バージョン 3.3 以上のみです。GLSL と OpenGL のこれらのバージョンの関連は、次の表のとおりです。
OpenGL ESとWebGL は、OpenGL ES シェーディング言語(略称: GLSL ESまたはESSL ) を使用します。
2つの言語は関連しているが、直接互換性はない。SPIRV -Crossを介して相互変換することができる。[18]
言語
オペレーター
GLSL には、ポインタを除いて、C および C++ の演算子と同じ演算子が含まれています。ビット演算子はバージョン 1.30 で追加されました。
機能と制御構造
C プログラミング言語と同様に、GLSL はループと分岐 (if-else、for、switch など) をサポートしています。再帰は禁止されており、コンパイル時にチェックされます。
ユーザー定義関数がサポートされ、組み込み関数が提供されます。グラフィックス カードの製造元は、ハードウェア レベルで組み込み関数を最適化する場合があります。これらの関数の多くは、C プログラミング言語の数学ライブラリの関数に似ていますが、グラフィックス プログラミングに固有の関数もあります。組み込み関数と演算子のほとんどは、スカラーとベクトル (最大 4 要素) の両方で、一方または両方のオペランドに対して操作できます。提供され、グラフィックスの目的でよく使用される一般的な組み込み関数は、、、、、、、、、、、、、およびベクトルmixとです。、、、などのその他の関数も提供されていますが、これらはすべてベクトル量、つまり に対しても操作できます。GLSLは関数のオーバーロード(組み込み関数と演算子、およびユーザー定義関数の両方)をサポートしているため、同じ名前でパラメーターの数やパラメーターの型が異なる複数の関数定義が存在する場合があります。それぞれに独立した戻り値の型を設定できます。
smoothstepnormalizeinversesqrtclamplengthdistancedotcrossreflectrefractminmaxabssinpowpow(vec3(1.5, 2.0, 2.5), abs(vec3(0.1, -0.2, 0.3)))
プリプロセッサ
GLSLはCプリプロセッサ(CPP)のサブセットを定義し、バージョンとOpenGL拡張機能を指定するための独自の特別なディレクティブを組み合わせています。CPPから削除された部分は、#includeやなどのファイル名に関連する部分です__FILE__。[19]
GL_ARB_shading_language_include拡張機能[ 20] ( WindowsおよびLinux上のNvidiaドライバ[21] 、 Linux、FreeBSD、Android上のすべてのMesa 20.0.0 [22]#includeドライバなどで実装)は、ソースコードで使用する機能を実装し、追加の手動前処理なしで多くのシェーダ間でコードと定義を簡単に共有できるようにします。同様の拡張機能GL_GOOGLE_include_directiveがGL_GOOGLE_cpp_style_line_directiveVulkanでGLSLを使用するために存在し、リファレンスSPIR-Vコンパイラ(glslang別名glslangValidator)でサポートされています。[23] [24] [25]
コンパイルと実行
GLSL シェーダーはスタンドアロン アプリケーションではありません。さまざまなプラットフォーム ( Linux、macOS、Windowsなど) で利用可能なOpenGL API を利用するアプリケーションが必要です。C 、C++、C#、JavaScript、Delphi、Javaなど の言語バインディングがあります。
GLSL シェーダー自体は、 OpenGL API のエントリ ポイントを使用してアプリケーション内からコンパイルするためにハードウェア ベンダーのドライバーに渡される文字列のセットにすぎません。シェーダーは、アプリケーション内からオンザフライで作成することも、テキスト ファイルとして読み込むこともできますが、文字列の形式でドライバーに送信する必要があります。
GLSL プログラムをコンパイル、リンク、およびパラメータを渡すために使用される API セットは、3 つの OpenGL 拡張機能で指定され、OpenGL バージョン 2.0 以降はコア OpenGL の一部になりました。API は、OpenGL 3.2 のジオメトリ シェーダ、OpenGL 4.0 のテッセレーション シェーダ、 OpenGL 4.3 のコンピュート シェーダで拡張されました。これらの OpenGL API は、拡張機能にあります。
- ARB 頂点シェーダー
- ARBフラグメントシェーダー
- ARB シェーダー オブジェクト
- ARB ジオメトリ シェーダー 4
- ARB テッセレーション シェーダー
- ARB コンピュートシェーダ
GLSL シェーダーはVulkanでも使用でき、Vulkan でシェーダーを使用する一般的な方法です。GLSL シェーダーは、使用前または実行時に、通常はオフライン コンパイラを使用して、 SPIR-Vと呼ばれるバイナリ バイトコード形式に事前コンパイルされます。
参照
- Khronos Group による中間シェーダー言語であるStandard Portable Intermediate Representation
- 3Dコンピュータグラフィックス
- クロノスグループ
- WebGL はウェブブラウザ用の OpenGL-ES 方言で、シェーダに GLSL を使用します。
- シェーダートイ
- LWJGLは、OpenGL 用の Java バインディングを含むライブラリです。
その他のシェーディング言語
- ARBアセンブリ言語、低レベルシェーディング言語
- Cg、頂点シェーダとピクセルシェーダをプログラミングするための高レベルシェーディング言語
- HLSL は、 Direct3Dで使用する高水準シェーディング言語です。
- TGSI 、 Gallium3Dによって導入された低レベル中間言語
- AMDIL、AMD社内で使用されている低レベル中間言語
- RenderMan シェーディング言語
- WGSL は、元々 SPIR-Vをベースにした、WebGPU 用の Rust 風の構文を持つシェーディング言語です。
- Metal Shading Languageは、 Appleプラットフォーム独自のMetal Graphics APIで使用されるシェーディング言語である[26]
- ソニー・ピクチャーズ・イメージワークスが開発したシェーディング言語、Open Shading Language
参考文献
- 引用
- ^ 「GLSL言語仕様、バージョン1.10.59」(PDF)。
- ^ 「GLSL言語仕様、バージョン1.20.8」(PDF)。
- ^ 「GLSL言語仕様、バージョン1.30.10」(PDF)。
- ^ 「GLSL言語仕様、バージョン1.40.08」(PDF)。
- ^ 「GLSL言語仕様、バージョン1.50.11」(PDF)。
- ^ 「GLSL言語仕様、バージョン3.30.6」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.00.9」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.10.6」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.20.11」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.30.8」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.40.9」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.50.7」(PDF)。
- ^ 「GLSL言語仕様、バージョン4.60.5」(PDF)。
- ^ 「GLSL ES 言語仕様、バージョン 1.00、リビジョン 17」(PDF)。
- ^ 「GLSL ES 言語仕様、バージョン 3.00、リビジョン 6」(PDF)。
- ^ 「OpenGL ES® シェーディング言語、バージョン 3.10、リビジョン 5」(PDF)。
- ^ 「OpenGL ES® シェーディング言語、バージョン 3.20.6」(PDF)。
- ^ KhronosGroup/SPIRV-Cross、The Khronos Group、2019-09-06、2019-09-08に取得
- ^ 「シェーダー プリプロセッサ」。OpenGL プログラミング ガイド: OpenGL を学ぶための公式ガイド、バージョン 4.3、第 8 版。
- ^ “ARB_shading_language_include”. Khronos.org . 2020年5月31日閲覧。
- ^ “NVIDIA ドライバー 265.90 WHQL Quadro”. LaptopVideo2Go フォーラム。
- ^ 「Mesa 20.0.0 リリースノート / 2020-02-19」。www.mesa3d.org 。 2020年5月31日閲覧。
- ^ 「#include ディレクティブのサポート by antiagainst · Pull Request #46 · KhronosGroup/glslang」。GitHub 。 2020年5月31日閲覧。
- ^ 「antiagainst による前処理行番号処理 · Pull Request #38 · KhronosGroup/glslang」。GitHub。
- ^ 「antiagainst による #line と __FILE__ の構文を拡張してファイル名文字列をサポートする · Pull Request #43 · KhronosGroup/glslang」。GitHub。
- ^ 「Metal Shading Language 仕様バージョン 3.2」。
さらに読む
- 書籍
- Rost, Randi J. (2009 年 7 月 30 日)。OpenGLシェーディング言語(第 3 版)。Addison- Wesley。ISBN 978-0-321-63763-5。
- Kessenich, John; Baldwin, David; Rost, Randi. OpenGL シェーディング言語。バージョン 1.10.59。3Dlabs, Inc. Ltd.
- ベイリー、マイク、カニンガム、スティーブ(2009 年 4 月 22 日)。グラフィックス シェーダー: 理論と実践(第 2 版)。CRC プレス。ISBN 978-1-56881-434-6。
外部リンク
- 公式OpenGLウェブサイト
