概要
ShaderForge 自体は今ではあまり使われていなそうではあるが、Asset Store 等に入っている Shader で利用されていることが偶にある。しかし、ShaderForge 製のシェーダーは WebGL ビルドを行うと正常に動作しないため、これを WebGL でも利用可能にする方法をメモしておく。
Unity バージョンは Unity 2021.1.4f1 で確認済み。
解決策
こちらの記事に解決策が記載されていた。
Shader Forge on webgl - Unity Forum
対応としては Shader コード内にある #pragma only_renderers
から始まる行を削除するだけで良い。
解説
Unity 公式ドキュメントによると、only_renderers
の機能は下記の通り。
#pragma only_renderers space separated names
- 指定のレンダラー用にのみシェーダーをコンパイルします。デフォルトではすべてのレンダラー用にシェーダーがコンパイルされます。詳細は後述の Renderers を参照してください。
Renderers の項目を見てみると、下記のように記載されていた。
Unity はいくつかのレンダリング API (例えば Direct3D 11 と OpenGL) をサポートしており、デフォルトではすべてのシェーダープログラムは、サポートされているすべてのレンダラーにコンパイルされます。#pragma only_renderers または #pragma exclude_renderers ディレクティブを使用してどのレンダラーをコンパイルするかを指定できます。これは、一部のプラットフォームでは使用不可であることが分かっているシェーダー言語の機能を、明示的に使用する場合に最も役立ちます。
つまり、WebGL のレンダラー用にシェーダーがコンパイルされていなかった模様。
only_renderers
の行を削除して WebGL で ShaderForge の機能を動作させても期待通りの挙動をすることが確認できた。(もしかすると、一部の機能は動作しないのかもしれない)
まとめ
シェーダーは難しいが、学べば学ぶほど 3D の世界に対する理解が深まって楽しい。
これからもシェーダーに対しての知見を深めていければと思う。