本日は昨日に引き続きMRGT枠です。
MRGTStandardShaderのAssigned at Runtimeの処理を見ています。
前回はShaderGUIでの処理を追っていました。Assigned at Runtimeを有効化している場合Shader内でdisableAlbedoMapNameのキーワードが無効化されていました。
こんかいはシェーダー内部の挙動を見ていきます。
〇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に関する処理やサンプリングの処理を省き最小限の描画パフォーマンスを発揮することができます。
本日は以上です。