From ccbc53d0d8cdec2b4c52cba815ecb8e78eb03fb4 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Mon, 7 Jun 2021 20:11:00 +0900 Subject: [PATCH] Suppress TextureFetch if not needed. --- .../VRM10/vrmc_materials_mtoon.shader | 23 +++++++--- .../VRM10/vrmc_materials_mtoon_define.hlsl | 44 ++++++++++++++++++- .../vrmc_materials_mtoon_geometry_uv.hlsl | 6 +-- .../vrmc_materials_mtoon_geometry_vertex.hlsl | 14 +++++- .../vrmc_materials_mtoon_lighting_mtoon.hlsl | 18 ++++++-- 5 files changed, 89 insertions(+), 16 deletions(-) diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon.shader b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon.shader index ef2b0a5f7..ffed3c5cb 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon.shader +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon.shader @@ -89,8 +89,11 @@ Shader "Hidden/VRM10/vrmc_materials_mtoon" #pragma multi_compile_instancing #pragma multi_compile_local __ _ALPHATEST_ON _ALPHABLEND_ON - #pragma multi_compile_local __ _NORMALMAP - #pragma multi_compile_local __ _UVANIMATION + #pragma multi_compile_local __ _MTOON_NORMALMAP + #pragma multi_compile_local __ _MTOON_SHADINGMAP + #pragma multi_compile_local __ _MTOON_EMISSIVE + #pragma multi_compile_local __ _MTOON_UVANIMATION + #pragma multi_compile_local __ _MTOON_RIM #pragma vertex MToonVertex #pragma fragment MToonFragment @@ -122,11 +125,14 @@ Shader "Hidden/VRM10/vrmc_materials_mtoon" #pragma multi_compile_instancing #pragma multi_compile_local __ _ALPHATEST_ON _ALPHABLEND_ON - #pragma multi_compile_local __ _NORMALMAP - #pragma multi_compile_local __ _UVANIMATION + #pragma multi_compile_local __ _MTOON_OUTLINEMAP + #pragma multi_compile_local __ _MTOON_NORMALMAP + #pragma multi_compile_local __ _MTOON_SHADINGMAP + #pragma multi_compile_local __ _MTOON_EMISSIVE + #pragma multi_compile_local __ _MTOON_UVANIMATION + #pragma multi_compile_local __ _MTOON_RIM #define MTOON_PASS_OUTLINE - #define MTOON_OUTLINE_WIDTH_WORLD #pragma vertex MToonVertex #pragma fragment MToonFragment @@ -158,8 +164,11 @@ Shader "Hidden/VRM10/vrmc_materials_mtoon" #pragma multi_compile_instancing #pragma multi_compile_local __ _ALPHATEST_ON _ALPHABLEND_ON - #pragma multi_compile_local __ _NORMALMAP - #pragma multi_compile_local __ _UVANIMATION + #pragma multi_compile_local __ _MTOON_NORMALMAP + #pragma multi_compile_local __ _MTOON_SHADINGMAP + #pragma multi_compile_local __ _MTOON_EMISSIVE + #pragma multi_compile_local __ _MTOON_UVANIMATION + #pragma multi_compile_local __ _MTOON_RIM #pragma vertex MToonVertex #pragma fragment MToonFragment diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_define.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_define.hlsl index 4c1eac67a..2de74dd5d 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_define.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_define.hlsl @@ -31,7 +31,27 @@ inline bool MToon_IsOutlinePass() // Compile-time constant inline bool MToon_IsUvAnimationOn() { -#if defined(_UVANIMATION) +#if defined(_MTOON_UVANIMATION) + return true; +#else + return false; +#endif +} + +// Compile-time constant +inline bool MToon_IsRimOn() +{ +#if defined(_MTOON_RIM) + return true; +#else + return false; +#endif +} + +// Compile-time constant +inline bool MToon_IsEmissiveOn() +{ +#if defined(_MTOON_EMISSIVE) return true; #else return false; @@ -41,7 +61,27 @@ inline bool MToon_IsUvAnimationOn() // Compile-time constant inline bool MToon_IsNormalMapOn() { -#if defined(_NORMALMAP) +#if defined(_MTOON_NORMALMAP) + return true; +#else + return false; +#endif +} + +// Compile-time constant +inline bool MToon_IsShadingMapOn() +{ +#if defined(_MTOON_SHADINGMAP) + return true; +#else + return false; +#endif +} + +// Compile-time constant +inline bool MToon_IsOutlineMapOn() +{ +#if defined(_MTOON_OUTLINEMAP) return true; #else return false; diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_uv.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_uv.hlsl index 2c64f5f6e..c07980ae2 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_uv.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_uv.hlsl @@ -6,7 +6,7 @@ #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" -float2 GetMToonGeometry_Uv(const float2 geometryUv) +inline float2 GetMToonGeometry_Uv(const float2 geometryUv) { // get raw uv with _MainTex_ST const float2 uvRaw = TRANSFORM_TEX(geometryUv, _MainTex); @@ -14,10 +14,10 @@ float2 GetMToonGeometry_Uv(const float2 geometryUv) if (MToon_IsUvAnimationOn()) { const float uvAnimationCoef = UNITY_SAMPLE_TEX2D(_UvAnimMaskTex, uvRaw).b * _Time.y; - const float2 uvAnimationAdd = uvAnimationCoef * float2(_UvAnimScrollXSpeed, _UvAnimScrollYSpeed); + const float2 translate = uvAnimationCoef * float2(_UvAnimScrollXSpeed, _UvAnimScrollYSpeed); const float rotateRad = uvAnimationCoef * _UvAnimRotationSpeed * PI_2; const float2 rotatePivot = float2(0.5, 0.5); - return mul(float2x2(cos(rotateRad), -sin(rotateRad), sin(rotateRad), cos(rotateRad)), uvRaw + uvAnimationAdd - rotatePivot) + rotatePivot; + return mul(float2x2(cos(rotateRad), -sin(rotateRad), sin(rotateRad), cos(rotateRad)), uvRaw + translate - rotatePivot) + rotatePivot; } else { diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_vertex.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_vertex.hlsl index dad41bfcc..21af39c3e 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_vertex.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_vertex.hlsl @@ -12,12 +12,24 @@ struct VertexPositionInfo float4 positionCS; }; +inline half MToon_GetOutlineVertex_OutlineWidth(const float2 uv) +{ + if (MToon_IsOutlineMapOn()) + { + return _OutlineWidth * UNITY_SAMPLE_TEX2D_LOD(_OutlineWidthTex, uv, 0); + } + else + { + return _OutlineWidth; + } +} + inline VertexPositionInfo MToon_GetOutlineVertex(const float3 positionOS, const half3 normalOS, const float2 uv) { if (MToon_IsOutlineModeWorldCoordinates()) { const float3 positionWS = mul(unity_ObjectToWorld, float4(positionOS, 1)).xyz; - const half outlineWidth = _OutlineWidth * UNITY_SAMPLE_TEX2D_LOD(_OutlineWidthTex, uv, 0); + const half outlineWidth = MToon_GetOutlineVertex_OutlineWidth(uv); const half3 normalWS = UnityObjectToWorldNormal(normalOS); VertexPositionInfo output; diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_mtoon.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_mtoon.hlsl index aa97eaa13..d871bf3c5 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_mtoon.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_mtoon.hlsl @@ -17,11 +17,23 @@ struct MToonInput half outlineFactor; }; +inline half GetMToonLighting_Reflectance_ShadingShift(const MToonInput input) +{ + if (MToon_IsShadingMapOn()) + { + return UNITY_SAMPLE_TEX2D(_ShadingShiftTex, input.uv).r * _ShadingShiftTexScale + _ShadingShiftFactor; + } + else + { + return _ShadingShiftFactor; + } +} + inline half GetMToonLighting_Reflectance(const UnityLighting lighting, const MToonInput input) { const half dotNL = dot(input.normalWS, lighting.directLightDirection); const half shadingInput = lerp(-1, 1, mtoon_linearstep(-1, 1, dotNL) * lighting.directLightAttenuation); - const half shadingShift = UNITY_SAMPLE_TEX2D(_ShadingShiftTex, input.uv).r * _ShadingShiftTexScale + _ShadingShiftFactor; + const half shadingShift = GetMToonLighting_Reflectance_ShadingShift(input); const half shadingToony = _ShadingToonyFactor; return mtoon_linearstep(-1.0 + shadingToony, +1.0 - shadingToony, shadingInput + shadingShift); } @@ -55,7 +67,7 @@ inline half3 GetMToonLighting_GlobalIllumination(const UnityLighting unityLight, inline half3 GetMToonLighting_Emissive(const MToonInput input) { - if (MToon_IsForwardBasePass()) + if (MToon_IsForwardBasePass() && MToon_IsEmissiveOn()) { return UNITY_SAMPLE_TEX2D(_EmissionMap, input.uv).rgb * _EmissionColor.rgb; } @@ -67,7 +79,7 @@ inline half3 GetMToonLighting_Emissive(const MToonInput input) inline half3 GetMToonLighting_Rim(const MToonInput input, const half3 lighting) { - if (MToon_IsForwardBasePass()) + if (MToon_IsForwardBasePass() && MToon_IsRimOn()) { const half3 worldUpWS = half3(0, 1, 0); // TODO: use view space axis if abs(dot(viewDir, worldUp)) == 1.0