2. GLSL 概要
GLSLには様々な方言があり、シェーダーの種類も異なります。ここで其れらを全て説明します。
2.1 方言
GLSLの場合、異なるプラットフォームが異なる方言を使用します。
OpenGL Core
OpenGL Core用のシェーダーは、OpenGLバージョン3.3から4.6を使用するデスクトップで使用される事を目的としています。
これはこのチュートリアルシリーズで焦点を当てる方言です。前章でダウンロードしたGLSLテスターに含まれるシェーダーファイルを自由に確認して下さい。
OpenGL ES 及び WebGL
OpenGL ES用のシェーダーは、OpenGL ES 3.0を使用するモバイルデバイスで使用される事を目的としています。
この方言はOpenGL Coreの物と僅かに異なるだけです。主な違いはヘッダー部分にあります。
OpenGL Core:
#version 450 core
in vec2 vUv;
out vec4 out_color;
OpenGL ES:
#version 300 core
precision highp float;
varying vec2 vUv;
WebGL:
#version 100
precision highp float;
varying vec2 vUv;
其の他の違いには、頂点からフラグメントへの通信にvarying
を使用する事、又はカスタム変数(我々の場合はout_color
)の代わりにgl_FragColor
を使用する事が含まれます。OpenGL Coreとは異なり、OpenGL ESとWebGLでは浮動小数点数やベクターに精度修飾子(highp
、mediump
、lowp
)を定義する必要があります。
Vulkan
此れはOpenGL Core 4.5以降の修正版で、Vulkan固有の拡張機能が含まれています。然し、上記とは異なり、VulkanではGLSLシェーダーを使用する前にSPIR-Vにコンパイルする必要があります。興味深い事に、一度コンパイルされると、GLSLやHLSL、MSLに戻す為のツールも利用可能です。此れにより、他の2つの主要なシェーディング言語を学ぶのがずっと簡単になります。
OpenGL Core:
#version 450 core
in vec2 vUv;
out vec4 out_color;
Vulkan:
#version 450
layout(location = 0) in vec2 vUv;
layout(location = 0) out vec4 out_color;
ニンテンドーシステム
残念ながら、NDAの為に此れについて多くを語る事は出来ませんが、あたしの経験では、Vulkanで使用したシェーダーはNintendo Switchで修正せずに動作しました。
2.2 シェーダーの種類
シェーダーの種類は幾つかあります。其の中で、頂点シェーダーとフラグメントシェーダーのみが必須であり、残りは必要に応じて使用されます。
頂点シェーダーとフラグメントシェーダーが何故必要かを理解する為に、Vulkanで使用されるグラフィックスパイプラインの画像を示す必要があります:
グラフィックスパイプラインは、近日公開予定のVulkanチュートリアルシリーズで更に詳しく説明されます。
頂点シェーダー
頂点シェーダーは、3Dモデルの各頂点を処理し、其の位置をモデル空間からスクリーン空間に変換します(モデル、ビュー、プロジェクション変換を適用)。又、後の段階で使用する為の法線、色、テクスチャ座標等の頂点ごとの属性を計算する事も出来ます。
此れにより、3D座標を変換し、頂点ごとのライティングを計算し、テクスチャ座標をフラグメントシェーダーに渡します。
フラグメントシェーダー
フラグメントシェーダーは、ラスタライゼーションによって生成された各ピクセル(又はフラグメント)を処理し、其の最終的な色と深度を決定します。テクスチャリング、ピクセルごとのライティング、後処理効果などのタスクを処理します。
此れにより、テクスチャを適用し、ライティング効果を計算し、色をブレンドし、フォグを適用します。
ジオメトリシェーダー
ジオメトリシェーダーは、頂点シェーダーの後に全体のプリミティブ(三角形、線)に対して動作し、ジオメトリの修正、作成、又は破棄を可能にします。新しい頂点を生成したり、プリミティブのトポロジーを変更したり出来ます。
此れにより、パーティクルを作成し、シルエットを押し出し、シャドウボリュームを生成し、単純なジオメトリをより複雑な形状にテッセレーションします。
テッセレーション制御シェーダー
テッセレーション制御シェーダーは、テッセレーションパイプラインの一部です。プリミティブ(例:パッチ)がより小さなプリミティブにどの様に分割されるかを定義します。テッセレーションのレベルを設定し、テッセレーション評価シェーダーにデータを渡します。
これにより、曲面(例:ベジェパッチ)や地形レンダリングの詳細レベルを制御します。
注:テッセレーションはOpenGL 4.0で導入された為、古いゲームではこれをサポートしていません。
テッセレーション評価シェーダー
テッセレーション評価シェーダーは、テッセレーション段階で生成されたテッセレートされたジオメトリを評価し、テッセレーションのパターンに基づいて新しい頂点の最終的な位置と属性を決定します。
此れにより、分割された表面の形状(例:滑らかな曲線や詳細な地形)を定義します。
コンピュートシェーダー
コンピュートシェーダーは、グラフィックスパイプラインに結びついていない汎用シェーダーで、GPU上で任意の計算(物理シミュレーション、画像処理、機械学習タスクなど)に使用されます。
此れにより、パーティクルシミュレーション、流体力学、又はブラーなどの後処理効果の様なタスクの並列処理に使用されます。
注:コンピュートシェーダーはOpenGL 4.3で導入された為、非常に新しいシェーダーの種類です。