mcpField
G
godot-shaders

godot-shaders

github.com/gamedev-skills開発5.4k7.2k 回インストール1 日前に更新
リポジトリ

godot-shaders について

Godot 4.7 向けのシェーダー作成ガイドです。2D、3D、スクリーンスペース効果を扱い、Godot シェーディング言語のパターンと 3.x から 4.x への変更点を説明します。

主な機能

  1. 01canvas_item と spatial シェーダーの作成
  2. 02uniform による調整値の公開
  3. 03TIME と UV によるアニメーション
  4. 04画面テクスチャと空間テクスチャの参照
  5. 05Godot 4.x の構文とカラー指定への対応

活用シーン

  1. 012D のディゾルブ、輪郭、水面効果の作成
  2. 023D のリムライトやトゥーンシェーダーの作成
  3. 03スクリーンスペースのポストエフェクト作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill godot-shaders

インストール後、Claude Code で/godot-shadersを入力して読み込まれたか確認します。

同梱ファイルreferences/shading-language.md

詳細

Godot Shaders(4.x)

Godot Shading Language で canvas_item(2D)および spatial(3D)シェーダーを記述し、TIME/UV でアニメーションさせ、uniform を公開して、画面を読み取ります。対象は Godot 4.7 です。

使用する場面

  • .gdshader コードや ShaderMaterial を記述するときに使用します。2D エフェクト(アウトライン、ディゾルブ、フラッシュ、水)、3D サーフェスシェーダー(リムライト、トゥーン、UV スクロール)、画面空間のポストエフェクトなどが対象です。

使用しない場面: シェーディングのエンジン非依存の概念(UV、頂点/フラグメントの理論)には shader-programming を使用します。パーティクル/VFX ノードには general 3D、シェーダー以外のビジュアル表現には適しません。

基本的なワークフロー

  1. 最初の行でシェーダーの種類を選択します。2D(Sprite2D、TextureRect、その他の CanvasItem)には shader_type canvas_item;、3D マテリアルには shader_type spatial; を使用します。(particles、sky、fog もあります。)
  2. ShaderMaterial を使って適用します。ShaderMaterial を作成して .gdshader を割り当て、ノードの material に設定します。uniform はインスペクターに表示されます。
  3. fragment() を記述して出力を設定します。2D では COLOR、3D では ALBEDO/EMISSION/ALPHA を使用します。必要に応じて、ジオメトリを移動する vertex() や、ライティングをカスタマイズする light() も記述します。
  4. 調整可能な値を uniform として公開し、ヒント(source_color、hint_range)を指定して編集可能にし、色管理が正しく行われるようにします。
  5. 組み込みの TIME でアニメーションさせ、texture(tex, UV) でテクスチャをサンプリングします。
  6. material.set_shader_parameter("name", value) を使って、コードから uniform を設定します。

パターン

1. 2D(canvas_item):色合いと UV スクロール
shader_type canvas_item;

uniform vec4 tint : source_color = vec4(1.0);     // source_color = sRGB-correct color
uniform float scroll_speed : hint_range(0.0, 2.0) = 0.3;

void fragment() {
    vec2 uv = UV;
    uv.x += TIME * scroll_speed;                  // scroll horizontally over time
    COLOR = texture(TEXTURE, uv) * tint;          // TEXTURE = the node's texture
}
2. ノイズしきい値を使った 2D ディゾルブ
shader_type canvas_item;

uniform sampler2D noise : repeat_enable;          // a NoiseTexture2D
uniform float amount : hint_range(0.0, 1.0) = 0.0;

void fragment() {
    vec4 tex = texture(TEXTURE, UV);
    float n = texture(noise, UV).r;
    if (n < amount) {
        discard;                                  // cut the pixel away
    }
    COLOR = tex;
}
3. 3D(spatial):発光するリムライト
shader_type spatial;

uniform vec4 base_color : source_color = vec4(0.2, 0.5, 1.0, 1.0);
uniform vec3 rim_color : source_color = vec3(0.6, 0.8, 1.0);
uniform float rim_power : hint_range(0.5, 8.0) = 3.0;

void fragment() {
    ALBEDO = base_color.rgb;
    // VIEW and NORMAL are view-space built-ins; rim is strong at grazing angles.
    float rim = pow(1.0 - dot(NORMAL, VIEW), rim_power);
    EMISSION = rim_color * rim;
}
4. 画面を読み取るポストエフェクト(4.x のヒント。SCREEN_TEXTURE は使用しません)
shader_type canvas_item;

// 4.x: declare the screen as a uniform with hint_screen_texture.
uniform sampler2D screen_tex : hint_screen_texture, filter_linear_mipmap;
uniform float blur : hint_range(0.0, 4.0) = 1.0;

void fragment() {
    vec2 px = SCREEN_PIXEL_SIZE * blur;
    vec4 c = texture(screen_tex, SCREEN_UV);
    c += texture(screen_tex, SCREEN_UV + vec2(px.x, 0.0));
    c += texture(screen_tex, SCREEN_UV - vec2(px.x, 0.0));
    COLOR = c / 3.0;
}

GDScript から uniform を設定します。

$Sprite2D.material.set_shader_parameter("amount", 0.7)

注意点

  • 3.x から 4.x への名称変更。 SCREEN_TEXTURE は削除されています。uniform sampler2D x : hint_screen_texture; を宣言し、SCREEN_UV でサンプリングしてください。色のヒントは hint_color から source_color に、hint_albedo/hint_white から source_color に変更されています。hint_range はそのままです。深度/法線には hint_depth_texture/hint_normal_roughness_texture を使用します。
  • 出力変数の誤り。 canvas_item では COLOR、spatial では ALBEDO(および EMISSION、ALPHA、ROUGHNESS、METALLIC)を書き込みます。spatial シェーダーで COLOR に書き込んでも何も起きません。
  • source_color のない色 uniform はリニア値としてそのまま扱われるため、色が不自然(白っぽい/暗い)に見えます。Godot が sRGB 変換を行わないためです。
  • 透過には明示的な設定が必要です(3D)。 ALPHA < 1.0 でブレンドするには、レンダーモードを追加するか、マテリアルの透過を設定してください。そうしないと不透明またはカットアウトになります。
  • repeat_enable なしで [0,1] の範囲外の UV をサンプリングすると、値がクランプされます。タイリング/スクロールには、サンプラー uniform に : repeat_enable を追加してください。
  • TIME は開始からの秒数で、増え続けます。周期的なエフェクトでは、精度のドリフトを防ぐために fract()/mod() で値を折り返してください。
  • discard は一部のハードウェアで負荷が高く、早期 Z を妨げます。可能であれば ALPHA/COLOR.a を設定してください。

参考資料

  • シェーダーの種類ごとの組み込み変数、レンダーモード、varying、カスタム light()、vertex() による変位、ビジュアルシェーダーグラフについては、references/shading-language.md を参照してください。

関連スキル

  • shader-programming — エンジンに依存しないシェーダーの概念(GLSL/HLSL)。
  • godot-3d-essentials — マテリアル、環境、spatial シェーダーの配置場所。
  • godot-ui-control — エフェクトを目的に UI へシェーダーを適用する方法。

コメント