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では、変数が使用されている場合を除き、頂点プログラムとフラグメントプログラムは変数を共有できません。

頂点の属性

GLSLでは、属性を使用して頂点ごとの情報を渡すことができ、必要に応じて柔軟に渡すことができます。 Godotには、VERTEX``(位置)、\ ``COLORUVUV2NORMAL など、設定された数の入力属性があります。完全なリストについては Shading language reference を参照してください。

gl_Position

gl_Position は、頂点シェーダーで指定された頂点の最終位置を受け取ります。ユーザーがクリップスペースで指定します。通常、GLSLでは、position という頂点属性を使用してモデル空間の頂点位置が渡され、モデル空間からクリップ空間への変換を手動で処理します。

Godotでは、VERTEXvertex 関数の先頭にあるモデル空間内の頂点の位置を指定します。 Godotは、ユーザー定義の vertex 関数が実行された後、クリップスペースへの最終的な変換も処理します。モデルからビュースペースへの変換をスキップする場合は、render_modeskip_vertex_transform に設定できます。すべての変換をスキップする場合は、ビュースペースからクリップスペースへの最終的な変換を無効にするために、render_modeskip_vertex_transform に設定し、PROJECTION_MATRIXmat4(1.0) に設定します。

Varyings(可変)

Varyingは、頂点シェーダーからフラグメントシェーダーに渡すことができる変数の一種です。最新のGLSL(3.0以上)では、変数は in および out キーワードで定義されます。頂点シェーダーから出る変数は、頂点シェーダーでは out、フラグメントシェーダーでは in で定義されます。

メイン

GLSLでは、各シェーダープログラムは自己完結型のCスタイルプログラムのように見えます。したがって、メインエントリポイントは main です。頂点シェーダーをコピーする場合は、main の名前を vertex に変更し、フラグメントシェーダーをコピーする場合は、main の名前を fragment に変更します。

定数

現在、Godotは定数をサポートしていません。値に初期化されたユニフォームを使用して機能を偽造することはできますが、定数を使用しても速度が向上するメリットはありません。

マクロ

Cとの類似性を維持するために、GLSLではマクロを使用できます。一般的に #define は定数または小さな関数を定義するために使用されます。定義をGodotのシェーディング言語に変換する簡単な方法はありません。定義されている関数の場合は関数で置き換え、定数の場合は均一で置き換えます。他のマクロ("#if#ifdef など)については、コンパイルの前処理段階で実行されるため、同等のマクロはありません。

変数

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では、変数を定義するときに型の前に精度修飾子 lowpmediump、および highpを配置することにより、必要に応じて個々の変数の精度を設定できます。詳細については、:ref:Shading Language <doc_shading_language> リファレンスを参照してください。

Shadertoy

Shadertoy は、フラグメントシェーダーの記述と pure magic(純粋な魔法) の作成を容易にするWebサイトです。

Shadertoyでは、ユーザーがシェーダーを完全に制御することはできません。すべての入力とuniformを処理し、ユーザーにフラグメントシェーダーの書き込みのみを許可します。

種類

Shadertoyはwebgl仕様を使用しているため、GLSLのわずかに異なるバージョンを実行します。ただし、Constants やマクロを含む通常の型はまだ残っています。

mainImage(メインイメージ)

Shadertoyシェーダーへの主要なエントリポイントは mainImage 関数です。mainImage には2つのパラメーター fragColorfragCoord があり、それぞれGodotの COLORFRAGCOORD に対応しています。これらのパラメーターは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 は、GLSLgl_FragCoord およびGodotの FRAGCOORD と同じように動作します。

The Book of Shaders

Shadertoyと同様に、The Book of Shaders は、ユーザーが対話できるWebブラウザーのフラグメントシェーダーへのアクセスを提供します。ユーザーは、渡されたuniformのセット リストを持つフラグメント シェーダーコードを記述することだけが許され、新たなuniformを追加する機能はありません。

シェーダーのさまざまなフレームワークへの移植に関する一般的なヘルプについては、The Book of Shadersがさまざまなフレームワークでシェーダーを実行するための ページ を提供しています。

種類

Book of Shadersはwebgl仕様を使用しているため、GLSLのわずかに異なるバージョンを実行します。ただし、Constants やマクロを含む通常の型はまだあります。

メイン

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 と同じ座標系を使用します。