GLSLからGodotシェーダーへの変換
このドキュメントでは、Godotのシェーディング言語とGLSLの違いを説明し、シェーダーをShadertoyやThe Book of Shadersなどの他のソースからGodotシェーダーに移行する方法に関する実用的なアドバイスを提供します。
Godotのシェーディング言語の詳細については、Shading Language リファレンスを参照してください。
GLSL
Godotは、GLSLに基づいたシェーディング言語にいくつかの「生活の質を改善させる」機能を追加して使用します。したがって、GLSLで使用可能なほとんどの機能は、Godotのシェーディング言語で使用できます。
シェーダープログラム
GLSLでは、各シェーダーは個別のプログラムを使用します。頂点シェーダーとフラグメントシェーダー用に1つのプログラムがあります。 Godotには、vertex および/または fragment 関数を含む単一のシェーダーがあります。一方のみを選択した場合、Godotがもう一方を提供します。
Godotでは、1つのファイルでフラグメントシェーダーと頂点シェーダーを定義することにより、統一された変数と関数を共有できます。 GLSLでは、varyingが使用されている場合を除き、頂点プログラムとフラグメントプログラムは変数を共有できません。
頂点の属性
GLSLでは、属性を使用して頂点ごとの情報を渡すことができ、必要に応じて柔軟に渡すことができます。 Godotには、VERTEX (位置)、COLOR、UV、UV2、NORMAL など、設定された数の入力属性があります。ドキュメントのシェーダーリファレンスのセクションにある各シェーダーのページには、頂点属性の完全なリストが付属しています。
gl_Position
gl_Position は、頂点シェーダーで指定された頂点の最終位置を受け取ります。ユーザーがクリップスペースで指定します。通常、GLSLでは、position という頂点属性を使用してモデル空間の頂点位置が渡され、モデル空間からクリップ空間への変換を手動で処理します。
Godotでは、VERTEX は vertex 関数の先頭にあるモデル空間内の頂点の位置を指定します。 Godotは、ユーザー定義の vertex 関数が実行された後、クリップスペースへの最終的な変換も処理します。モデルからビュースペースへの変換をスキップする場合は、render_mode を skip_vertex_transform に設定できます。すべての変換をスキップする場合は、ビュースペースからクリップスペースへの最終的な変換を無効にするために、render_mode を skip_vertex_transform に設定し、PROJECTION_MATRIX を mat4(1.0) に設定します。
Varying(可変)
Varyingは、頂点シェーダーからフラグメントシェーダーに渡すことができる変数の一種です。最新のGLSL(3.0以上)では、varyingは in および out キーワードで定義されます。頂点シェーダーから出る変数は、頂点シェーダーでは out、フラグメントシェーダーでは in で定義されます。
メイン
GLSLでは、各シェーダープログラムは自己完結型のCスタイルプログラムのように見えます。したがって、メインエントリポイントは main です。頂点シェーダーをコピーする場合は、main の名前を vertex に変更し、フラグメントシェーダーをコピーする場合は、main の名前を fragment に変更します。
マクロ
Godotシェーダープリプロセッサ は次のマクロをサポートしています。
#define/#undef#if,#elif,#else,#endif,defined(),#ifdef,#ifndef#include(only.gdshaderincfiles and with a maximum depth of 25)#pragma disable_preprocessor, which disables preprocessing for the rest of the file
変数
GLSLには、ハードコードされた多くの組み込み変数があります。これらの変数は均一ではないため、メインプログラムから編集することはできません。
変数 |
タイプ(型) |
同等の物 |
説明 |
|---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
各ピクセルの出力色。 |
gl_FragCoord |
vec4 |
FRAGCOORD |
フルスクリーン矩形用。小さな矩形の場合は、UVを使用します。 |
gl_Position |
vec4 |
VERTEX |
頂点の位置、頂点シェーダーからの出力。 |
gl_PointSize |
float |
POINT_SIZE |
ポイントプリミティブのサイズ。 |
gl_PointCoord |
vec2 |
POINT_COORD |
ポイントプリミティブを描画するときのポイント上の位置。 |
gl_FrontFacing |
bool |
FRONT_FACING |
プリミティブが表向きの場合はTrue。 |
座標
GLSLの gl_FragCoord とGodotシェーディング言語の FRAGCOORD は同じ座標系を使用します。 GodotでUVを使用している場合、y座標は上下逆になります。
精度
GLSLでは、シェーダーの上部で、precision キーワードを使用して特定のタイプ(floatまたはint)の精度を定義できます。 Godotでは、変数を定義するときに型の前に精度修飾子 lowp、mediump、および highpを配置することにより、必要に応じて個々の変数の精度を設定できます。詳細については、Shading Language リファレンスを参照してください。
Shadertoy
Shadertoy は、フラグメントシェーダーの記述と pure magic(純粋な魔法) の作成を容易にするWebサイトです。
Shadertoyでは、ユーザーがシェーダーを完全に制御することはできません。すべての入力とuniformを処理し、ユーザーにフラグメントシェーダーの書き込みのみを許可します。
種類
ShadertoyはWebGL仕様を使用しているため、GLSLのわずかに異なるバージョンを実行します。ただし通常の型や定数やマクロなどは残っています。
mainImage(メインイメージ)
Shadertoyシェーダーへの主要なエントリポイントは mainImage 関数です。mainImage には2つのパラメーター fragColor と fragCoord があり、それぞれGodotの COLOR と FRAGCOORD に対応しています。これらのパラメーターはGodotで自動的に処理されるため、自分でパラメーターとして含める必要はありません。 Godotに移植する場合、mainImage 関数内のすべてのものを fragment 関数にコピーする必要があります。
変数
フラグメントシェーダーを簡単かつ簡単に記述できるようにするため、Shadertoyはメインプログラムからフラグメントシェーダーに多くの有用な情報を渡します。これらのいくつかは、Godotがデフォルトで使用可能にしないように選択しているため、Godotには同等のものがありません。 Godotを使用すると、独自のuniformを作成できるため、これは問題ありません。同等のものが「Uniformで提供」としてリストされている変数の場合、ユーザーは自分でユニフォームを作成する必要があります。この説明は、代替として渡すことができるものについてのヒントを読者に提供します。
変数 |
タイプ(型) |
同等の物 |
説明 |
|---|---|---|---|
fragColor |
out vec4 |
COLOR |
各ピクセルの出力色。 |
fragCoord |
vec2 |
FRAGCOORD.xy |
フルスクリーン矩形用。小さな矩形の場合は、UVを使用します。 |
iResolution |
vec3 |
1.0 / SCREEN_PIXEL_SIZE |
手動で渡すこともできます。 |
iTime |
float |
TIME |
シェーダーが開始してからの時間。 |
iTimeDelta |
float |
Uniformで提供 |
前のフレームをレンダリングしてからの経過時間。 |
iFrame |
float |
Uniformで提供 |
フレーム番号。 |
iChannelTime[4] |
float |
Uniformで提供 |
特定のテクスチャが開始されてからの時間。 |
iMouse |
vec4 |
Uniformで提供 |
ピクセル座標でのマウスの位置。 |
iDate |
vec4 |
Uniformで提供 |
秒単位で表される現在の日付。 |
iChannelResolution[4] |
vec3 |
1.0 / TEXTURE_PIXEL_SIZE |
特定のテクスチャの解像度。 |
iChanneli |
Sampler2D |
TEXTURE |
Godotには1つのビルトインのみが用意されていまが、ユーザーは追加を作成できます。 |
座標
fragCoord は、GLSL の gl_FragCoord およびGodotの FRAGCOORD と同じように動作します。
The Book of Shaders
Shadertoyと同様に、The Book of Shaders は、ユーザーが対話できるWebブラウザーのフラグメントシェーダーへのアクセスを提供します。ユーザーは、渡されたuniformのセット リストを持つフラグメント シェーダーコードを記述することだけが許され、新たなuniformを追加する機能はありません。
シェーダーのさまざまなフレームワークへの移植に関する一般的なヘルプについては、The Book of Shadersがさまざまなフレームワークでシェーダーを実行するための ページ を提供しています。
種類
Book of ShadersはWebGL仕様を使用しているため、GLSLのわずかに異なるバージョンを実行します。ただし通常の型や定数やマクロなどはまだ残っています。
メイン
Book of Shadersフラグメントシェーダーのエントリポイントは、GLSLと同様に main です。 Book of Shadersの main 関数に書かれたものはすべて、Godotの `` fragment`` 関数にコピーする必要があります。
変数
Book of Shadersは、Shadertoyが行うよりも、プレーンなGLSLに近くなります。また、Shadertoyよりも少ないuniformを実装します。
変数 |
タイプ(型) |
同等の物 |
説明 |
|---|---|---|---|
gl_FragColor |
out vec4 |
COLOR |
各ピクセルの出力色。 |
gl_FragCoord |
vec4 |
FRAGCOORD |
フルスクリーン矩形用。小さな矩形の場合は、UVを使用します。 |
u_resolution |
vec2 |
1.0 / SCREEN_PIXEL_SIZE |
手動で渡すこともできます。 |
u_time |
float |
TIME |
シェーダーが開始してからの時間。 |
u_mouse |
vec2 |
Uniformで提供 |
ピクセル座標でのマウスの位置。 |
座標
Book of Shadersは GLSL と同じ座標系を使用します。