Unityちゃんトゥーンシェーダv2をiOS/macOS Metal APIでCull Offで使うとシェーディングがおかしくなる場合の対処法
結論
シェーダーをちょっと書き換えればできる
しかしUnityちゃんトゥーンシェーダはPro仕様の長大なシェーダなので正直これでいいのかは分からない
あらまし
BlenderからFBXを毎回書き出すのめんどい
やってみた
https://gyazo.com/0151913574025837d4cfa136041b6c5c
※マテリアルは設定済み
よくわからないけど何かが逆ってる感はわかる
シーン上でのアリカさんモデルはY軸に-180度回転させてある
向かって奥が+Z
結局よくわからなかったけどこうしたら治った
code:Toon_DoubleShadeWithFeather.shader
// ①
Properties {
// 中略
}
code: Toon_DoubleShadeWithFeather.shader
Pass {
Name "FORWARD"
// 中略
// ②
uniform float _Invert_Norm;
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.texcoord0;
// ③
float3 norm = v.normal * (1 - 2 * _Invert_Norm);
o.normalDir = UnityObjectToWorldNormal(norm);
o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );
o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
float3 lightColor = _LightColor0.rgb;
o.pos = UnityObjectToClipPos(v.vertex );
UNITY_TRANSFER_FOG(o,o.pos);
TRANSFER_VERTEX_TO_FRAGMENT(o)
return o;
}
}
①:まず、UCTS(Unityちゃんトゥーンシェーダv2)の中で使っているシェーダのPropertyに_Invert_NormというToggle値を設定する。普通は必要ないのでdefaultは0(false)でいい。
https://gyazo.com/0d8c797737c6e2ef901d4f32711fadf1
②:Toon_DoubleShadeWithFeather/FORWARDパスの中で_Invert_Normを宣言する
③:同vert関数の中で、_Invert_Normが1(true)ならVertexInputのnormalを反転させて変換する
するとあら不思議。
https://gyazo.com/87a8da7f5184a1ca986351eb0e4471c7
見た目正しくシェーディングされるようになりましたkeroxp.icon
これを書いたあとで気がついたそもそもの問題点
UCTSv2のマニュアルに書いてあった
New!【iOS/OSX METALで使用する際の注意】
iOS/OSX METALで使用する場合、CullMode=OFF(両面表示)の時に、正しい表示が出来ない場合があります。
その場合、メッシュを両面に貼って、それぞれにCullMode=Back(背面カリング)/CullMode=Front(正面カリング)のマ>テリアルを設定するようにしてください。
確かに、Cull ModeをOffに設定したのをBackに直したら法線を反転させなくても正常にシェーディングされるようになった
Blender全然関係なかったkeroxp.icon
↑の表記ではどのような問題が起こるのかよく分からない気がする
具体的には、iOS/macOSのMetal APIで、Cull Offを使用していると、頂点シェーダ内のNORMALが反転している気がする。(自信なし)
なんか謎の遠回りをして解決法を見つけてしまったけど、今回の現象ではシェーダを書き換える必要はなかったです😂
同様の問題で悩んでいる人の何かの参考になればいいです