
OpenGL Shading Language (GLSL) is a high-levelshading language with a syntax based on the C programming language. It was created by the OpenGL ARB (OpenGL Architecture Review Board) to give developers more direct control of the graphics pipeline without having to use ARB assembly language or hardware-specific languages.
With advances in graphics cards, new features have been added to allow for increased flexibility in the rendering pipeline at the vertex and fragment level. Programmability at this level is achieved with the use of fragment and vertex shaders.
Originally, this functionality was achieved by writing shaders in ARB assembly language – a complex and unintuitive task. The OpenGL ARB created the OpenGL Shading Language to provide a more intuitive method for programming the graphics processing unit while maintaining the open standards advantage that has driven OpenGL throughout its history.
Originally introduced as an extension to OpenGL 1.4, GLSL was formally included into the OpenGL 2.0 core in 2004 by the OpenGL ARB. It was the first major revision to OpenGL since the creation of OpenGL 1.0 in 1992.
Some benefits of using GLSL are:
GLSL versions have evolved alongside specific versions of the OpenGL API. It is only with OpenGL versions 3.3 and above that the GLSL and OpenGL major and minor version numbers match. These versions for GLSL and OpenGL are related in the following table:
OpenGL ESとWebGLは、OpenGL ESシェーディング言語(略称:GLSL ESまたはESSL)を使用します。
この2つの言語は関連しているが、直接互換性はない。SPIRV -Crossを介して相互変換することができる。[ 19 ]
GLSLには、ポインタを除いて、CおよびC++と同じ演算子が含まれています。ビット演算子はバージョン1.30で追加されました。
C言語と同様に、GLSLはif-else、for、switchなどのループと分岐をサポートしています。再帰は禁止されており、コンパイル時にチェックされます。
ユーザー定義関数がサポートされ、組み込み関数も提供されています。グラフィックス カードの製造元は、組み込み関数をハードウェア レベルで最適化する場合があります。これらの関数の多くは、C プログラミング言語の数学ライブラリの関数と似ていますが、グラフィックス プログラミングに特有の関数もあります。組み込み関数と演算子のほとんどは、1 つまたは両方のオペランドに対して、スカラーとベクトル (最大 4 要素) の両方で動作できます。グラフィックス目的でよく使用される、提供されている一般的な組み込み関数は、、、、、、、、、、、およびベクトルとです。、、、mixなどの他のsmoothstep関数も提供されていますが、これらはすべてベクトル量 (つまり、) に対しても動作できます。GLSLは関数オーバーnormalizeロード(組み込み関数と演算子、およびユーザー定義関数の両方) をサポートしているため、inversesqrt同じ名前で、異なる数のパラメータまたはパラメータ型を持つ複数の関数定義が存在する可能性があります。それぞれが独自の独立した戻り値型を持つことができます。clamplengthdistancedotcrossreflectrefractminmaxabssinpowpow(vec3(1.5,2.0,2.5))abs(vec3(0.1,-0.2,0.3)))
GLSL は、 C プリプロセッサ(CPP)のサブセットを定義し、バージョンや OpenGL 拡張機能を指定するための独自の特別なディレクティブと組み合わせます。CPP から削除された部分は、やなどのファイル名に関連するもの#includeです__FILE__。[ 20 ]
拡張GL_ARB_shading_language_include機能[ 21 ] (たとえば、Windows および Linux 上のNvidia ドライバ[ 22 ] 、および Linux、FreeBSD、Android 上のすべての Mesa 20.0.0 [ 23 ]ドライバで実装されています) は、ソース コードで使用できる機能を実装しており#include、追加の手動による前処理なしで、多くのシェーダー間でコードと定義を簡単に共有できます。同様の拡張機能GL_GOOGLE_include_directiveと は、GL_GOOGLE_cpp_style_line_directiveGLSL を Vulkan で使用するために存在し、参照 SPIR-V コンパイラ (別名 glslangValidator) でサポートされていますglslang。[ 24 ] [ 25 ] [ 26 ]
GLSLシェーダーは単体アプリケーションではなく、OpenGL APIを利用するアプリケーションが必要です。OpenGL APIは、Linux、macOS、Windowsなど、さまざまなプラットフォームで利用可能です。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 は、以下の拡張機能に含まれています。
GLSLシェーダーはVulkanでも使用でき、Vulkanでシェーダーを使用する一般的な方法です。GLSLシェーダーは、使用前または実行時に、通常オフラインコンパイラを使用して、 SPIR-Vと呼ばれるバイナリバイトコード形式にプリコンパイルされます。