本日はMRGT枠です。
今回はMRGTシェーダーのNormalMapScaleが機能しない問題の解消を行います。
〇UnpackScaleNormalの処理
UnpcakScaleNormalの処理は次のようになります。
half3 UnpackScaleNormal(half4 packednormal, half bumpScale) { return UnpackScaleNormalRGorAG(packednormal, bumpScale); } half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) { #if defined(UNITY_NO_DXT5nm) half3 normal = packednormal.xyz * 2 - 1; #if (SHADER_TARGET >= 30) // SM2.0: instruction count limitation // SM2.0: normal scaler is not supported normal.xy *= bumpScale; #endif return normal; #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) half3 normal; normal.xy = (packednormal.wy * 2 - 1); normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); normal.xy *= bumpScale; return normal; #else // This do the trick packednormal.x *= packednormal.w; half3 normal; normal.xy = (packednormal.xy * 2 - 1); #if (SHADER_TARGET >= 30) // SM2.0: instruction count limitation // SM2.0: normal scaler is not supported normal.xy *= bumpScale; #endif normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); return normal; #endif }
UnpackScaleNormalの処理は実際はUnpackScaleNormalRGorAGと同様になります。
UnpackScaleNormalRGorAGではDXT5nm、ASTCを使用しているかによって処理が分かれます。
これはテクスチャの圧縮フォーマットであり、UnPackScaleNormalの場合ノーマルマップを使用するためこのノーマルマップの圧縮形態によって処理が変わっています。
今回はNormalMapScaleが機能しない問題ですが、これは第二引数のbumpScaleが相当しています。
bumpScaleの処理を見てみると一か所
ShaderTergetが3.0以上の場合に機能するようになっています。
#if (SHADER_TARGET >= 30) // SM2.0: instruction count limitation // SM2.0: normal scaler is not supported normal.xy *= bumpScale; #endif
ShaderTargetはデフォルトで2.5であり、これが理由で機能しなくなっていました。
〇MRGTのバグの解消
解消法はパスに#pragma target 3.0を定義しています。
SubShader { Tags { "RenderType" = "Opaque" "DisableBatching" = "False" } // Default pass (only pass outside of the editor). Pass { Name "Main" Tags{ "LightMode" = "ForwardBase" } ・・・ Stencil { Ref[_StencilReference] Comp[_StencilComparison] Pass[_StencilOperation] ReadMask[_StencilReadMask] WriteMask[_StencilWriteMask] } HLSLPROGRAM #pragma target 3.0//追加 #pragma multi_compile_instancing #pragma multi_compile _ LIGHTMAP_ON #pragma multi_compile_local _ _CLIPPING_PLANE _CLIPPING_SPHERE _CLIPPING_BOX #pragma shader_feature_local_fragment _CLIPPING_BORDER #include_with_pragmas "GraphicsToolsStandardProgram.hlsl" ENDHLSL }
以上でバグが解消され正常にNormalMapScaleが機能するようになりました。
本日は以上です。