この記事は、GDShaderの実践ガイド https://ziva.sh/blogs/godot-shaders のうち、AIによるシェーダー修正のテストの節の日本語版です(英語の原文はZiva.shが2026年11月10日に更新)。
検証:ChatGPTでつくったシェーダーを、AIがエディターの中で直す
チャットのアシスタントはGDShaderを書けますが、書いたコードをコンパイルすることはできません。コードをGodotに貼り付け、エラーをコピーして戻し、それを繰り返すことになります。エディターの中で動くエージェントなら、変更のたびにコンパイルし、実行中のシーンを見ることができます。このループを、実際に壊れたシェーダーを使ってZivaでテストしました。
シェーダーは、2025年12月(Godot 4.5)のGodotフォーラムの投稿のものです。投稿者は「made the individual parts with the help of ChatGPT」(個々の部分はChatGPTの助けを借りてつくった)と書いており、背景の除去、ぼかし、オーバーレイテクスチャー、色補正の各部分を1つのcanvas_itemシェーダーにつなぎ合わせていました。すべてのモジュールが既定値のままでも、スプライトは「much more contrasty」(コントラストがずっと強い)状態になり、「a lot of brightness」(かなりの明るさ)が失われていました。フォーラムのページからコピーしたシェーダーは、コンパイルすら通りません。フォーラムの書式によって一部の*記号が消えている(6.0 * dが6.0dになっている)からです。
そのテキストをそのままプロジェクトに入れ、Godotのアイコンを2つ置きました。1つはそのままのスプライト、もう1つはシェーダーを適用したスプライトです。そのうえで、投稿者の文章を言い換えたプロンプトで、既定値のときは画像が変わらないように修正し、2つのスプライトを並べて見せるようZivaに依頼しました。Zivaがしたことは次のとおりです。
- 壊れたトークン(
6.0d、c.x6.0、2.0boなど)を挙げ、8つの編集を一度に送りました。ほとんどは1つのトークンを直す編集です。編集はすべて却下されました。Zivaは編集のたびにシェーダーをコンパイルし、Godotがエラーを報告するとその編集を元に戻しますが、そのときほかの壊れた行がまだ残っていたためです。そこでZivaは、ファイル全体を一度に書き直しました。この元に戻す動作はZivaのバグで、すでに報告済みです。 - 書き直したシェーダーはエディターではエラーなく読み込まれましたが、シーンを実行すると失敗しました。
TEXTUREとCOLORをヘルパー関数の中に移していたためで、canvas_itemシェーダーではヘルパー関数からこの2つを読めません。Zivaは実行時のエラーを読み、2つを引数として渡すように直しました。 - 次の実行で、投稿者の問題が再現しました。シェーダーを適用したスプライトのほうが暗く、コントラストが強くなっていました。Zivaは原因を切り分けるために、小さなテスト用のシーンをいくつかつくりました。1行だけのシェーダー
COLOR = texture(TEXTURE, UV);は元の画像と一致しましたが、マット処理だけのバージョンと色補正だけのバージョンは、すでに暗くなっていました。 - Godotのシェーディングのドキュメントを確認しました。そこには、
fragment()の中では入力のCOLORがすでにテクスチャーと乗算されていると書かれています。つなぎ合わせたシェーダーはvec4 col = texture(TEXTURE, UV) * COLOR;で始まっていて、テクスチャーを2回適用していました。フォーラムのメンバーが手作業で突き止めたのと同じ行です。 - Zivaはその行を書き直してシーンを実行し、使い捨てのピクセルチェックで2つのスプライトを比べ、10個のデバッグ用ファイルを削除して、最後のスクリーンショットを見せました。
かかったのは12分、ツールの呼び出しは48回で、既定のモデルZiva SmartでのZivaの使用量は$0.12でした。修正後のシーンを描画する別のスクリプトで独自にチェックしたところ、既定値では2つのスプライトにピクセルの違いはありませんでした。コントラスト、色相、ぼかし、背景の除去の値を上げると、シェーダーを適用したスプライトは期待どおりに変化したので、試した4つのモジュールは引き続き動作していました。
同じ症状がある場合の修正は1行です。canvas_itemシェーダーでは、texture(TEXTURE, UV) * COLORではなくCOLORから始めてください。
vec4 col = COLOR; // already texture color * modulate
ZivaはZiva.shが開発しており、このテストもZiva.shが作成しました。
テストは2026年11月10日に、Linux上のGodot 4.7.2とZivaの開発ビルドで実行しました。1つのシェーダーで1回だけ実行した結果なので、ベンチマークではなく1つの例として見てください。
このループがなければ、ChatGPTにコードを貼り付け、エラーメッセージをコピーして戻すことになります。フォーラムの投稿者は、助けを求める前に、つなぎ合わせたChatGPTのコードをエラーなしで動かそうと「quite a while」(かなり長い間)取り組んでいました。
Godotの制作工程で使えるAIツールをより広く調べた記事は、Best AI Tools & Plugins for Godot Game Engine(英語)です。
よくある質問
AIはGodotのシェーダーを書いたり直したりできますか?
GDShaderを書くことはできますが、チャットのアシスタントは書いたコードをコンパイルできないので、エラーは自分で見つけることになります。Godotエディターの中で動くエージェントなら、変更のたびにコンパイルし、結果を見ることができます。Godotフォーラムにあった、投稿者がChatGPTでつくったシェーダーでZivaをテストしました。Zivaはコンパイルエラーを直し、スプライトが暗くなる原因を見つけ、2つのスプライトを並べて見せました。独自のピクセルチェックでも、2つは同一でした。かかったのは12分で、既定のモデルでのZivaの使用量は$0.12でした。
Godotのcanvas_itemシェーダーでスプライトが暗くなるのはなぜですか?
よくある原因は、fragment()の中のtexture(TEXTURE, UV) * COLORです。canvas_itemシェーダーでは、COLORにはすでにテクスチャーの色と頂点カラーを掛け合わせた値が入っているので、もう一度テクスチャーを掛けると2回適用されることになります。モジュレートの色が必要な場合を除き、COLORをそのまま使うか、余分なCOLORを掛けずにtexture(TEXTURE, UV)を使ってください。
この記事の原文(英語):https://ziva.sh/blogs/godot-shaders
