夜風のMixedReality

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

MixedRealityGraphicsTools StndardShader全機能解説 その⑥ Assigned at Runtime その②

本日は昨日に引き続きMRGT枠です。

MRGTStandardShaderのAssigned at Runtimeの処理を見ています。

前回はShaderGUIでの処理を追っていました。Assigned at Runtimeを有効化している場合Shader内でdisableAlbedoMapNameのキーワードが無効化されていました。

こんかいはシェーダー内部の挙動を見ていきます。

redhologerbera.hatenablog.com

〇Assigned at Runtineが有効な場合に無視されるパラメータ

Assigne at Runtimeを有効化している場合disableAlbedoMapNamのキーワードが無効化されていました。

これは実際には_DISABLE_ALBEDO_MAPのパラメータがShader上で無効化されています。

これにより2か所の条件分岐コンパイルが走っています。

① UV

_DISABLE_ALBEDO_MAPが無効な場合=Assigned at Runtimeが有効な場合は_UVが定義されるようになっています。

#if !defined(_DISABLE_ALBEDO_MAP) || defined(_TRIPLANAR_MAPPING) || defined(_CHANNEL_MAP) || defined(_NORMAL_MAP) || defined(_DISTANCE_TO_EDGE) || defined(_GRADIENT) || defined(_EMISSION)
#define _UV
#else
#undef _UV
#endif

通常テクスチャを使用していない場合_UVはコンパイル対象外にされています。

②フラグメントシェーダー内でのサンプリング

#if defined(_DISABLE_ALBEDO_MAP)
    half4 albedo = half4(1.0h, 1.0h, 1.0h, 1.0h);
#else
#if defined(_TRIPLANAR_MAPPING)
#if defined(_URP)
    half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uvX) * triplanarBlend.x +
                   SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uvY) * triplanarBlend.y +
                   SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uvZ) * triplanarBlend.z;
#else
    half4 albedo = tex2D(_MainTex, uvX) * triplanarBlend.x +
                   tex2D(_MainTex, uvY) * triplanarBlend.y +
                   tex2D(_MainTex, uvZ) * triplanarBlend.z;
#endif
#else
#if defined(_USE_SSAA)
    // Does SSAA on the texture, implementation based off this article: https://medium.com/@bgolus/sharper-mipmapping-using-shader-based-supersampling-ed7aadb47bec
    // per pixel screen space partial derivatives
    float2 dx = ddx(input.uv) * 0.25; // horizontal offset
    float2 dy = ddy(input.uv) * 0.25; // vertical offset
    // supersampled 2x2 ordered grid
    half4 albedo = half4(0.0h, 0.0h, 0.0h, 0.0h);
#if defined(_URP)
    albedo += SAMPLE_TEXTURE2D_BIAS(_MainTex, sampler_MainTex, float2(input.uv + dx + dy), _MipmapBias);
    albedo += SAMPLE_TEXTURE2D_BIAS(_MainTex, sampler_MainTex, float2(input.uv - dx + dy), _MipmapBias);
    albedo += SAMPLE_TEXTURE2D_BIAS(_MainTex, sampler_MainTex, float2(input.uv + dx - dy), _MipmapBias);
    albedo += SAMPLE_TEXTURE2D_BIAS(_MainTex, sampler_MainTex, float2(input.uv - dx - dy), _MipmapBias);
#else
    albedo += tex2Dbias(_MainTex, float4(input.uv + dx + dy, 0.0, _MipmapBias));
    albedo += tex2Dbias(_MainTex, float4(input.uv - dx + dy, 0.0, _MipmapBias));
    albedo += tex2Dbias(_MainTex, float4(input.uv + dx - dy, 0.0, _MipmapBias));
    albedo += tex2Dbias(_MainTex, float4(input.uv - dx - dy, 0.0, _MipmapBias));
#endif
    albedo *= 0.25;
#else
#if defined(_URP)
    half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
#else
    half4 albedo = tex2D(_MainTex, input.uv);
#endif
#endif
#endif
#endif

Assigned at Runtimeが有効な場合はテクスチャによるサンプリングが行われています。

#if defined(_URP)
    half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
#else
    half4 albedo = tex2D(_MainTex, input.uv);
#endif

しかしAssigned at Runtimeを無効にしている場合単純にサンプリングが行われない値が使用されます。

#if defined(_DISABLE_ALBEDO_MAP)
    half4 albedo = half4(1.0h, 1.0h, 1.0h, 1.0h);

〇Assigned at Runtimeまとめ

Assigned at Runtimeはテクスチャを使用していない場合のみ表示されるパラメータで、有効化している場合テクスチャを使用していないにもかかわらずサンプリングが行われ、UVに関する処理も行われます。

しかしながら無効な状態ではUVに関する処理やサンプリングの処理を省き最小限の描画パフォーマンスを発揮することができます。

本日は以上です。