夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedRealityGrapicsToolsのNormalMapScaleが機能しない問題の解消 その②

本日はMRGT枠です。

今回はMRGTシェーダーのNormalMapScaleが機能しない問題の解消を行います。

redhologerbera.hatenablog.com

〇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

redhologerbera.hatenablog.com

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

本日は以上です。