本日は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が機能するようになりました。


本日は以上です。