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``(位置)、\ ``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) に設定します。

Varying(可変)

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

メイン

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

定数

Global array constants are not supported in Godot 3.x. You can fake the functionality by using a uniform initialized to the value, but you will not benefit from the increased speed from using a constant.

マクロ

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

Shadertoy

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

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

種類

Shadertoy uses the webgl spec, so it runs a slightly different version of GLSL. However, it still has the regular types, including constants and macros.

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がさまざまなフレームワークでシェーダーを実行するための ページ を提供しています。

種類

The Book of Shaders uses the webgl spec, so it runs a slightly different version of GLSL. However, it still has the regular types, including constants and macros.

メイン

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