Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
Converting GLSL to Godot shaders¶
このドキュメントでは、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が使用されている場合を除き、頂点プログラムとフラグメントプログラムは変数を共有できません。
頂点の属性¶
In GLSL, you can pass in per-vertex information using attributes and have the
flexibility to pass in as much or as little as you want. In Godot, you have a
set number of input attributes, including VERTEX
(position), COLOR
,
UV
, UV2
, NORMAL
. Each shaders' page in the shader reference section
of the documentation comes with a complete list of its vertex attributes.
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
に変更します。
マクロ¶
The Godot shader preprocessor supports the following macros:
* #define
/ #undef
* #if
, #elif
, #else
, #endif
, defined()
, #ifdef
, #ifndef
* #include
(only .gdshaderinc
files 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 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つのパラメーター 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がさまざまなフレームワークでシェーダーを実行するための ページ を提供しています。
種類¶
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 と同じ座標系を使用します。