diff --git a/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials.meta b/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials.meta new file mode 100644 index 000000000..2c542f476 --- /dev/null +++ b/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1987bdfe8c2df174abb9cf04caaaba15 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials/UrpVrm10MToonMaterialImporter.cs b/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials/UrpVrm10MToonMaterialImporter.cs new file mode 100644 index 000000000..1a690e060 --- /dev/null +++ b/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials/UrpVrm10MToonMaterialImporter.cs @@ -0,0 +1,49 @@ +using System; +using System.Linq; +using UniGLTF; +using UnityEngine; +using VRMShaders; +using VRMShaders.VRM10.MToon10.Runtime; + +namespace UniVRM10 +{ + /// + /// Convert MToon parameters from glTF specification to Unity implementation.(for URP) + /// + public static class UrpVrm10MToonMaterialImporter + { + /// + /// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する + /// + public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc) + { + var m = data.GLTF.materials[i]; + if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out var mtoon)) + { + // Fallback to glTF, when MToon extension does not exist. + matDesc = default; + return false; + } + + // use material.name, because material name may renamed in GltfParser. + matDesc = new MaterialDescriptor( + m.name, + Shader.Find(MToon10Meta.URPUnityShaderName), + null, + Vrm10MToonTextureImporter.EnumerateAllTextures(data, m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.Item2.Item2), + BuiltInVrm10MToonMaterialImporter.TryGetAllFloats(m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.value), + BuiltInVrm10MToonMaterialImporter.TryGetAllColors(m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.value), + BuiltInVrm10MToonMaterialImporter.TryGetAllFloatArrays(m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.value), + new Action[] + { + material => + { + // Set hidden properties, keywords from float properties. + new MToonValidator(material).Validate(); + } + }); + + return true; + } + } +} diff --git a/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials/UrpVrm10MToonMaterialImporter.cs.meta b/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials/UrpVrm10MToonMaterialImporter.cs.meta new file mode 100644 index 000000000..0714adc64 --- /dev/null +++ b/Assets/VRM10/Runtime/IO/Material/URP/Import/Materials/UrpVrm10MToonMaterialImporter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 57d820ccc1ff7e2469f7fb5cc435bd5b +timeCreated: 1620630516 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/IO/Material/URP/Import/UrpVrm10MaterialDescriptorGenerator.cs b/Assets/VRM10/Runtime/IO/Material/URP/Import/UrpVrm10MaterialDescriptorGenerator.cs index 8cba77b28..d389d3117 100644 --- a/Assets/VRM10/Runtime/IO/Material/URP/Import/UrpVrm10MaterialDescriptorGenerator.cs +++ b/Assets/VRM10/Runtime/IO/Material/URP/Import/UrpVrm10MaterialDescriptorGenerator.cs @@ -10,8 +10,10 @@ namespace UniVRM10 { public MaterialDescriptor Get(GltfData data, int i) { + // mtoon + if (UrpVrm10MToonMaterialImporter.TryCreateParam(data, i, out var matDesc)) return matDesc; // unlit - if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out MaterialDescriptor matDesc)) return matDesc; + if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc; // pbr if (UrpGltfPbrMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc; diff --git a/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset.asset b/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset.asset index 7d9e94149..a9311a774 100644 --- a/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset.asset +++ b/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset.asset @@ -32,7 +32,7 @@ MonoBehaviour: m_MainLightShadowmapResolution: 2048 m_AdditionalLightsRenderingMode: 1 m_AdditionalLightsPerObjectLimit: 4 - m_AdditionalLightShadowsSupported: 0 + m_AdditionalLightShadowsSupported: 1 m_AdditionalLightsShadowmapResolution: 512 m_ShadowDistance: 50 m_ShadowCascadeCount: 4 diff --git a/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset_Renderer.asset b/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset_Renderer.asset index cd7074b5f..9c8da0435 100644 --- a/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset_Renderer.asset +++ b/Assets/VRM10_Samples/URPSample/Settings/UniversalRenderPipelineAsset_Renderer.asset @@ -12,8 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} m_Name: UniversalRenderPipelineAsset_Renderer m_EditorClassIdentifier: - m_RendererFeatures: [] - m_RendererFeatureMap: + m_RendererFeatures: + - {fileID: 6807519784255233043} + m_RendererFeatureMap: 131cfa0d2d2b795e postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2} shaders: @@ -43,3 +44,16 @@ MonoBehaviour: m_ShadowTransparentReceive: 1 m_RenderingMode: 0 m_AccurateGbufferNormals: 0 +--- !u!114 &6807519784255233043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5b6d00cd3f0249a2b4ee7dc86f9a8d63, type: 3} + m_Name: MToonOutlineRenderFeature + m_EditorClassIdentifier: + m_Active: 1 diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_attribute.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_attribute.hlsl index e406a2491..564cafca8 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_attribute.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_attribute.hlsl @@ -1,8 +1,12 @@ #ifndef VRMC_MATERIALS_MTOON_ATTRIBUTE_INCLUDED #define VRMC_MATERIALS_MTOON_ATTRIBUTE_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include #include +#endif struct Attributes { @@ -25,8 +29,21 @@ struct Varyings half4 tangentWS : TEXCOORD3; #endif float3 viewDirWS : TEXCOORD4; + +#ifdef MTOON_URP + half4 fogFactorAndVertexLight : TEXCOORD5; // x: fogFactor, yzw: vertex light + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord : TEXCOORD6; + #endif + + DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 7); + +#else UNITY_FOG_COORDS(5) UNITY_LIGHTING_COORDS(6,7) +#endif + float4 pos : SV_POSITION; // UnityCG macro specified name. Accurately "positionCS" UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO 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 909079822..50d915bb0 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 @@ -12,7 +12,11 @@ #endif #ifndef MTOON_FRONT_FACE_TYPE // from https://docs.unity3d.com/Manual/SL-ShaderSemantics.html - #define MTOON_FRONT_FACE_TYPE fixed + #ifdef MTOON_URP + #define MTOON_FRONT_FACE_TYPE float + #else + #define MTOON_FRONT_FACE_TYPE fixed + #endif #endif #ifndef MTOON_IS_FRONT_VFACE #define MTOON_IS_FRONT_VFACE(VAL, FRONT, BACK) ((VAL > 0.0) ? (FRONT) : (BACK)) @@ -28,7 +32,9 @@ inline bool MToon_IsPbrCorrectOn() // Compile-time constant inline bool MToon_IsForwardBasePass() { -#if defined(UNITY_PASS_FORWARDBASE) +#if defined(MTOON_URP) + return true; +#elif defined(UNITY_PASS_FORWARDBASE) return true; #elif defined(UNITY_PASS_FORWARDADD) return false; diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_fragment.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_fragment.hlsl index 84ca54245..74d03532d 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_fragment.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_fragment.hlsl @@ -1,7 +1,12 @@ #ifndef VRMC_MATERIALS_MTOON_FORWARD_FRAGMENT_INCLUDED #define VRMC_MATERIALS_MTOON_FORWARD_FRAGMENT_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" @@ -26,7 +31,11 @@ half4 MToonFragment(const FragmentInput fragmentInput) : SV_Target const float2 uv = GetMToonGeometry_Uv(input.uv); // Get LitColor with Alpha + #ifdef MTOON_URP + const half4 litColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv) * _Color; + #else const half4 litColor = UNITY_SAMPLE_TEX2D(_MainTex, uv) * _Color; + #endif // Alpha Test const half alpha = GetMToonGeometry_Alpha(litColor); @@ -46,8 +55,22 @@ half4 MToonFragment(const FragmentInput fragmentInput) : SV_Target mtoonInput.alpha = alpha; half4 col = GetMToonLighting(unityLighting, mtoonInput); + #if defined(MTOON_URP) && defined(_ADDITIONAL_LIGHTS) && !defined(MTOON_PASS_OUTLINE) + uint pixelLightCount = GetAdditionalLightsCount(); + for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex) + { + UnityLighting additionalUnityLighting = GetAdditionalUnityLighting(input, normalWS, lightIndex); + col.rgb += GetMToonURPAdditionalLighting(additionalUnityLighting, mtoonInput).rgb; + } + #endif + // Apply Fog + #ifdef MTOON_URP + float fogCoord = input.fogFactorAndVertexLight.x; + col.rgb = MixFog(col.rgb, fogCoord); + #else UNITY_APPLY_FOG(fragmentInput.varyings.fogCoord, col); + #endif return col; } diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_vertex.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_vertex.hlsl index e536543f3..62a60f3c0 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_vertex.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_forward_vertex.hlsl @@ -1,8 +1,14 @@ #ifndef VRMC_MATERIALS_MTOON_FORWARD_VERTEX_INCLUDED #define VRMC_MATERIALS_MTOON_FORWARD_VERTEX_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#else #include #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" @@ -23,26 +29,58 @@ Varyings MToonVertex(const Attributes v) // v is UnityCG macro specified name. { const VertexPositionInfo position = MToon_GetOutlineVertex(v.vertex.xyz, normalize(v.normalOS), output.uv); output.pos = position.positionCS; - output.positionWS = position.positionWS; + output.positionWS = position.positionWS.xyz; + + #ifdef MTOON_URP + output.normalWS = TransformObjectToWorldNormal(-v.normalOS); + #else output.normalWS = UnityObjectToWorldNormal(-v.normalOS); + #endif } else { const VertexPositionInfo position = MToon_GetVertex(v.vertex.xyz); output.pos = position.positionCS; - output.positionWS = position.positionWS; + output.positionWS = position.positionWS.xyz; + + #ifdef MTOON_URP + output.normalWS = TransformObjectToWorldNormal(v.normalOS); + #else output.normalWS = UnityObjectToWorldNormal(v.normalOS); + #endif } output.viewDirWS = MToon_GetWorldSpaceNormalizedViewDir(output.positionWS); #if defined(_NORMALMAP) const half tangentSign = v.tangentOS.w * unity_WorldTransformParams.w; + + #ifdef MTOON_URP + output.tangentWS = half4(TransformObjectToWorldDir(v.tangentOS), tangentSign); + #else output.tangentWS = half4(UnityObjectToWorldDir(v.tangentOS), tangentSign); + #endif + #endif +#ifdef MTOON_URP + VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz); + + OUTPUT_LIGHTMAP_UV(input.texcoord1, unity_LightmapST, output.lightmapUV); + OUTPUT_SH(output.normalWS.xyz, output.vertexSH); + + half3 vertexLight = VertexLighting(output.positionWS, output.normalWS); + half fogFactor = ComputeFogFactor(output.pos.z); + output.fogFactorAndVertexLight = half4(fogFactor, vertexLight); + + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + output.shadowCoord = GetShadowCoord(vertexInput); + #endif + +#else UNITY_TRANSFER_FOG(output, output.pos); UNITY_TRANSFER_LIGHTING(output, v.texcoord1.xy); +#endif return output; } diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_normal.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_normal.hlsl index 1eda41448..160c45206 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_normal.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_geometry_normal.hlsl @@ -1,7 +1,12 @@ #ifndef VRMC_MATERIALS_MTOON_GEOMETRY_NORMAL_INCLUDED #define VRMC_MATERIALS_MTOON_GEOMETRY_NORMAL_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" @@ -16,8 +21,14 @@ inline float3 GetMToonGeometry_Normal(const Varyings input, const MTOON_FRONT_FA const half3 normalWS = MTOON_IS_FRONT_VFACE(facing, input.normalWS, -input.normalWS); #if defined(_NORMALMAP) + // Get Normal in WorldSpace from Normalmap if available + #ifdef MTOON_URP + const half3 normalTS = normalize(UnpackNormalScale(SAMPLE_TEXTURE2D(_BumpMap, sampler_MainTex, mtoonUv), _BumpScale)); + #else const half3 normalTS = normalize(UnpackNormalWithScale(UNITY_SAMPLE_TEX2D(_BumpMap, mtoonUv), _BumpScale)); + #endif + return normalize(mul(normalTS, MToon_GetTangentToWorld(normalWS, input.tangentWS))); #else return GetMToonGeometry_NormalWithoutNormalMap(normalWS); 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 5a9e9ac46..21d79d3fc 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 @@ -1,7 +1,12 @@ #ifndef VRMC_MATERIALS_MTOON_GEOMETRY_UV_INCLUDED #define VRMC_MATERIALS_MTOON_GEOMETRY_UV_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" @@ -10,7 +15,11 @@ inline float GetMToonGeometry_Uv_Time(const float2 uvRaw) { if (MToon_IsParameterMapOn()) { + #ifdef MTOON_URP + return SAMPLE_TEXTURE2D(_UvAnimMaskTex, sampler_UvAnimMaskTex, uvRaw); + #else return UNITY_SAMPLE_TEX2D(_UvAnimMaskTex, uvRaw).b * _Time.y; + #endif } 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 6ee24dbde..b6853a52a 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 @@ -1,7 +1,13 @@ #ifndef VRMC_MATERIALS_MTOON_GEOMETRY_VERTEX_INCLUDED #define VRMC_MATERIALS_MTOON_GEOMETRY_VERTEX_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" @@ -16,7 +22,7 @@ inline half MToon_GetOutlineVertex_OutlineWidth(const float2 uv) { if (MToon_IsParameterMapOn()) { - return _OutlineWidth * UNITY_SAMPLE_TEX2D_LOD(_OutlineWidthTex, uv, 0); + return _OutlineWidth * UNITY_SAMPLE_TEX2D_LOD(_OutlineWidthTex, uv, 0).x; } else { @@ -49,12 +55,25 @@ inline VertexPositionInfo MToon_GetOutlineVertex(const float3 positionOS, const if (MToon_IsOutlineModeWorldCoordinates()) { const float3 positionWS = mul(unity_ObjectToWorld, float4(positionOS, 1)).xyz; + + #ifdef MTOON_URP + const half3 normalWS = TransformObjectToWorldNormal(normalOS); + #else const half3 normalWS = UnityObjectToWorldNormal(normalOS); + #endif + const half outlineWidth = MToon_GetOutlineVertex_OutlineWidth(uv); VertexPositionInfo output; output.positionWS = float4(positionWS + normalWS * outlineWidth, 1); + + #ifdef MTOON_URP + output.positionCS = TransformWorldToHClip(output.positionWS.xyz); + #else output.positionCS = UnityWorldToClipPos(output.positionWS); + #endif + + return output; } else if (MToon_IsOutlineModeScreenCoordinates()) @@ -65,9 +84,20 @@ inline VertexPositionInfo MToon_GetOutlineVertex(const float3 positionOS, const const float4 nearUpperRight = mul(unity_CameraInvProjection, float4(1, 1, UNITY_NEAR_CLIP_VALUE, _ProjectionParams.y)); const half aspect = abs(nearUpperRight.y / nearUpperRight.x); + #ifdef MTOON_URP + const float4 positionCS = TransformObjectToHClip(positionOS); + #else const float4 positionCS = UnityObjectToClipPos(positionOS); + #endif + const half3 normalVS = MToon_GetObjectToViewNormal(normalOS); + + #ifdef MTOON_URP + const half3 normalWS = TransformObjectToWorldNormal(normalOS.xyz); + const half3 normalCS = TransformWorldToHClipDir(normalWS.xyz); + #else const half3 normalCS = TransformViewToProjection(normalVS.xyz); + #endif half2 normalProjectedCS = normalize(normalCS.xy); const float clipSpaceHeight = 2.0f; @@ -85,7 +115,13 @@ inline VertexPositionInfo MToon_GetOutlineVertex(const float3 positionOS, const { VertexPositionInfo output; output.positionWS = mul(unity_ObjectToWorld, float4(positionOS * 0.001, 1)); + + #ifdef MTOON_URP + output.positionCS = TransformWorldToHClip(output.positionWS.xyz); + #else output.positionCS = UnityWorldToClipPos(output.positionWS); + #endif + return output; } } @@ -94,7 +130,14 @@ inline VertexPositionInfo MToon_GetVertex(const float3 positionOS) { VertexPositionInfo output; output.positionWS = mul(unity_ObjectToWorld, float4(positionOS, 1)); + + #ifdef MTOON_URP + output.positionCS = TransformWorldToHClip(output.positionWS.xyz); + #else output.positionCS = UnityWorldToClipPos(output.positionWS); + #endif + + return output; } diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_input.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_input.hlsl index 274f51d51..1dcaa64d4 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_input.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_input.hlsl @@ -1,9 +1,25 @@ #ifndef VRMC_MATERIALS_MTOON_INPUT_INCLUDED #define VRMC_MATERIALS_MTOON_INPUT_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif // Textures +#ifdef MTOON_URP +TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); +TEXTURE2D(_ShadeTex); SAMPLER(sampler_ShadeTex); +TEXTURE2D(_BumpMap); SAMPLER(sampler_BumpMap); +TEXTURE2D(_ShadingShiftTex); SAMPLER(sampler_ShadingShiftTex); +TEXTURE2D(_EmissionMap); SAMPLER(sampler_EmissionMap); +TEXTURE2D(_MatcapTex); SAMPLER(sampler_MatcapTex); +TEXTURE2D(_RimTex); SAMPLER(sampler_RimTex); +TEXTURE2D(_OutlineWidthTex); SAMPLER(sampler_OutlineWidthTex); +// NOTE: "tex2d() * _Time.y" returns mediump value if sampler is half precision in Android VR platform +TEXTURE2D_FLOAT(_UvAnimMaskTex); SAMPLER(sampler_UvAnimMaskTex); +#else UNITY_DECLARE_TEX2D(_MainTex); UNITY_DECLARE_TEX2D(_ShadeTex); UNITY_DECLARE_TEX2D(_BumpMap); @@ -14,6 +30,7 @@ UNITY_DECLARE_TEX2D(_RimTex); UNITY_DECLARE_TEX2D(_OutlineWidthTex); // NOTE: "tex2d() * _Time.y" returns mediump value if sampler is half precision in Android VR platform UNITY_DECLARE_TEX2D_FLOAT(_UvAnimMaskTex); +#endif CBUFFER_START(UnityPerMaterial) // Vector 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 39a3c5eb4..24e32dbfb 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 @@ -1,7 +1,12 @@ #ifndef VRMC_MATERIALS_MTOON_LIGHTING_MTOON_INCLUDED #define VRMC_MATERIALS_MTOON_LIGHTING_MTOON_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_utility.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" @@ -20,7 +25,11 @@ inline half GetMToonLighting_Reflectance_ShadingShift(const MToonInput input) { if (MToon_IsParameterMapOn()) { + #ifdef MTOON_URP + return SAMPLE_TEXTURE2D(_ShadingShiftTex, sampler_ShadingShiftTex, input.uv).r * _ShadingShiftTexScale + _ShadingShiftFactor; + #else return UNITY_SAMPLE_TEX2D(_ShadingShiftTex, input.uv).r * _ShadingShiftTexScale + _ShadingShiftFactor; + #endif } else { @@ -47,7 +56,7 @@ inline half GetMToonLighting_Shade(const UnityLighting lighting, const MToonInpu if (MToon_IsForwardBasePass()) { const half shadeInput = lerp(-1, 1, mtoon_linearstep(-1, 1, dotNL)); - return mtoon_linearstep(-1.0 + shadeToony, +1.0 - shadeToony, shadeInput + shadeShift) * lighting.directLightAttenuation; + return mtoon_linearstep(-1.0 + shadeToony, +1.0 - shadeToony, shadeInput + shadeShift) * lighting.directLightAttenuation.x; } else { @@ -60,7 +69,7 @@ inline half GetMToonLighting_Shadow(const UnityLighting lighting, const half dot { if (MToon_IsPbrCorrectOn()) { - return lighting.directLightAttenuation * step(0, dotNL); + return lighting.directLightAttenuation.x * step(0, dotNL); } if (MToon_IsForwardBasePass()) @@ -72,13 +81,17 @@ inline half GetMToonLighting_Shadow(const UnityLighting lighting, const half dot // heuristic term for weak lights. // 0.5: heuristic. // min(0, dotNL) + 1: darken if (dotNL < 0) by using half lambert. - return lighting.directLightAttenuation * 0.5 * (min(0, dotNL) + 1); + return lighting.directLightAttenuation.x * 0.5 * (min(0, dotNL) + 1); } } inline half3 GetMToonLighting_DirectLighting(const UnityLighting unityLight, const MToonInput input, const half shade, const half shadow) { + #ifdef MTOON_URP + const half3 shadeColor = SAMPLE_TEXTURE2D(_ShadeTex, sampler_ShadeTex, input.uv).rgb * _ShadeColor.rgb; + #else const half3 shadeColor = UNITY_SAMPLE_TEX2D(_ShadeTex, input.uv).rgb * _ShadeColor.rgb; + #endif const half3 albedo = lerp(shadeColor, input.litColor, shade); return albedo * unityLight.directLightColor * shadow; @@ -102,7 +115,11 @@ inline half3 GetMToonLighting_Emissive(const MToonInput input) { if (MToon_IsEmissiveMapOn()) { + #ifdef MTOON_URP + return SAMPLE_TEXTURE2D(_EmissionMap, sampler_EmissionMap, input.uv).rgb * _EmissionColor.rgb; + #else return UNITY_SAMPLE_TEX2D(_EmissionMap, input.uv).rgb * _EmissionColor.rgb; + #endif } else { @@ -124,7 +141,12 @@ inline half3 GetMToonLighting_Rim_Matcap(const MToonInput input) const half3 matcapRightAxisWS = normalize(cross(input.viewDirWS, worldUpWS)); const half3 matcapUpAxisWS = normalize(cross(matcapRightAxisWS, input.viewDirWS)); const half2 matcapUv = float2(dot(matcapRightAxisWS, input.normalWS), dot(matcapUpAxisWS, input.normalWS)) * 0.5 + 0.5; + + #ifdef MTOON_URP + return _MatcapColor.rgb * SAMPLE_TEXTURE2D(_MatcapTex, sampler_MatcapTex, matcapUv).rgb; + #else return _MatcapColor.rgb * UNITY_SAMPLE_TEX2D(_MatcapTex, matcapUv).rgb; + #endif } else { @@ -152,7 +174,11 @@ inline half3 GetMToonLighting_Rim(const UnityLighting unityLight, const MToonInp if (MToon_IsRimMapOn()) { + #ifdef MTOON_URP + return (matcapFactor + parametricRimFactor) * rimLightingFactor * SAMPLE_TEXTURE2D(_RimTex, sampler_RimTex, input.uv).rgb; + #else return (matcapFactor + parametricRimFactor) * rimLightingFactor * UNITY_SAMPLE_TEX2D(_RimTex, input.uv).rgb; + #endif } else { @@ -185,4 +211,48 @@ half4 GetMToonLighting(const UnityLighting unityLight, const MToonInput input) } } +#ifdef MTOON_URP + +inline half GetMToonURPAdditionalLighting_Shadow(const UnityLighting lighting, const half dotNL) +{ + if (MToon_IsPbrCorrectOn()) + { + return lighting.directLightAttenuation.x * step(0, dotNL); + } + + return lighting.directLightAttenuation.x * 0.5 * (min(0, dotNL) + 1); +} + +inline half GetMToonURPAdditionalLighting_Shade(const UnityLighting lighting, const MToonInput input, const half dotNL) +{ + const half shadeShift = GetMToonLighting_Reflectance_ShadingShift(input); + const half shadeToony = _ShadingToonyFactor; + + if (MToon_IsPbrCorrectOn()) + { + const half shadeInput = dotNL; + return mtoon_linearstep(-1.0 + shadeToony, +1.0 - shadeToony, shadeInput + shadeShift); + } + + const half shadeInput = dotNL; + return mtoon_linearstep(-1.0 + shadeToony, +1.0 - shadeToony, shadeInput + shadeShift); +} + +half4 GetMToonURPAdditionalLighting(const UnityLighting unityLight, const MToonInput input) +{ + const half dotNL = GetMToonLighting_DotNL(unityLight, input); + const half shade = GetMToonURPAdditionalLighting_Shade(unityLight, input, dotNL); + const half shadow = GetMToonURPAdditionalLighting_Shadow(unityLight, dotNL); + + const half3 direct = GetMToonLighting_DirectLighting(unityLight, input, shade, shadow); + const half3 lighting = direct; + + const half3 baseCol = lighting; + + return half4(baseCol, input.alpha); +} + +#endif + + #endif diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_unity.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_unity.hlsl index 5940d9bba..0151a8166 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_unity.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_lighting_unity.hlsl @@ -1,9 +1,15 @@ #ifndef VRMC_MATERIALS_MTOON_LIGHTING_UNITY_INCLUDED #define VRMC_MATERIALS_MTOON_LIGHTING_UNITY_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#else #include #include #include +#endif + #include "./vrmc_materials_mtoon_define.hlsl" #include "./vrmc_materials_mtoon_input.hlsl" #include "./vrmc_materials_mtoon_attribute.hlsl" @@ -19,16 +25,41 @@ struct UnityLighting UnityLighting GetUnityLighting(const Varyings input, const half3 normalWS) { +#ifdef MTOON_URP + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord = input.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + float4 shadowCoord = TransformWorldToShadowCoord(input.positionWS); + #else + float4 shadowCoord = float4(0, 0, 0, 0); + #endif + + half4 shadowMask = SAMPLE_SHADOWMASK(input.lightmapUV); + Light mainLight = GetMainLight(shadowCoord, input.positionWS, shadowMask); + + const half3 lightDir = mainLight.direction; + const half3 lightColor = mainLight.color.rgb; + + float atten = mainLight.shadowAttenuation; + +#else UNITY_LIGHT_ATTENUATION(atten, input, input.positionWS); const half3 lightDir = normalize(UnityWorldSpaceLightDir(input.positionWS)); const half3 lightColor = _LightColor0.rgb; +#endif + if (MToon_IsForwardBasePass()) { UnityLighting output; +#ifdef MTOON_URP + output.indirectLight = SampleSH(normalWS); + output.indirectLightEqualized = (SampleSH(half3(0, 1, 0)) + SampleSH(half3(0, -1, 0))) * 0.5; +#else output.indirectLight = ShadeSH9(half4(normalWS, 1)); output.indirectLightEqualized = (ShadeSH9(half4(0, 1, 0, 1)) + ShadeSH9(half4(0, -1, 0, 1))) * 0.5; +#endif output.directLightColor = lightColor; output.directLightDirection = lightDir; output.directLightAttenuation = atten; @@ -46,4 +77,29 @@ UnityLighting GetUnityLighting(const Varyings input, const half3 normalWS) } } +#ifdef MTOON_URP +UnityLighting GetAdditionalUnityLighting(const Varyings input, const half3 normalWS, int lightIndex) +{ + // TODO: Duplicate in GetUnityLighting + #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) + float4 shadowCoord = input.shadowCoord; + #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) + float4 shadowCoord = TransformWorldToShadowCoord(input.positionWS); + #else + float4 shadowCoord = float4(0, 0, 0, 0); + #endif + + half4 shadowMask = SAMPLE_SHADOWMASK(input.lightmapUV); + Light light = GetAdditionalLight(lightIndex, input.positionWS, shadowMask); + + UnityLighting output; + output.indirectLight = 0; + output.indirectLightEqualized = 0; + output.directLightColor = light.color; + output.directLightDirection = light.direction; + output.directLightAttenuation = light.shadowAttenuation * light.distanceAttenuation; + return output; +} +#endif + #endif diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_fragment.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_fragment.hlsl new file mode 100644 index 000000000..e020417a3 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_fragment.hlsl @@ -0,0 +1,34 @@ +#ifndef VRMC_MATERIALS_MTOON_SHADOWCASTER_FRAGMENT_INCLUDED +#define VRMC_MATERIALS_MTOON_SHADOWCASTER_FRAGMENT_INCLUDED + +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + +#include "./vrmc_materials_mtoon_define.hlsl" +#include "./vrmc_materials_mtoon_utility.hlsl" +#include "./vrmc_materials_mtoon_input.hlsl" +#include "./vrmc_materials_mtoon_attribute.hlsl" +#include "./vrmc_materials_mtoon_geometry_uv.hlsl" +#include "./vrmc_materials_mtoon_geometry_alpha.hlsl" +#include "./vrmc_materials_mtoon_geometry_normal.hlsl" +#include "./vrmc_materials_mtoon_lighting_unity.hlsl" +#include "./vrmc_materials_mtoon_lighting_mtoon.hlsl" + +half4 MToonShadowCasterFragment(const FragmentInput fragmentInput) : SV_Target +{ + const Varyings input = fragmentInput.varyings; + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + + // Get MToon UV (with UVAnimation) + const float2 uv = GetMToonGeometry_Uv(input.uv); + + // Get LitColor with Alpha + const half4 litColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv) * _Color; + GetMToonGeometry_Alpha(litColor); + + return 0; +} + +#endif + +#endif \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_fragment.hlsl.meta b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_fragment.hlsl.meta new file mode 100644 index 000000000..9b6e1469d --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_fragment.hlsl.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: de3bc67bd63189846842d2a03b2b13a9 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_vertex.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_vertex.hlsl new file mode 100644 index 000000000..94ad32a5f --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_vertex.hlsl @@ -0,0 +1,54 @@ +#ifndef VRMC_MATERIALS_MTOON_SHADOWCASTER_VERTEX_INCLUDED +#define VRMC_MATERIALS_MTOON_SHADOWCASTER_VERTEX_INCLUDED + +#ifdef MTOON_URP + +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" + +#include "./vrmc_materials_mtoon_define.hlsl" +#include "./vrmc_materials_mtoon_utility.hlsl" +#include "./vrmc_materials_mtoon_input.hlsl" +#include "./vrmc_materials_mtoon_attribute.hlsl" +#include "./vrmc_materials_mtoon_geometry_vertex.hlsl" + +float3 _LightDirection; + +VertexPositionInfo MToon_GetShadowCasterVertex(const float3 positionOS, const float3 normalWS) +{ + VertexPositionInfo output; + output.positionWS = mul(unity_ObjectToWorld, float4(positionOS, 1)); + float4 positionCS = TransformWorldToHClip(ApplyShadowBias(output.positionWS, normalWS, _LightDirection)); + + #if UNITY_REVERSED_Z + positionCS.z = min(positionCS.z, positionCS.w * UNITY_NEAR_CLIP_VALUE); + #else + positionCS.z = max(positionCS.z, positionCS.w * UNITY_NEAR_CLIP_VALUE); + #endif + + output.positionCS = positionCS; + + return output; +} + +Varyings MToonShadowCasterVertex(const Attributes v) +{ + Varyings output = (Varyings)0; + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + float3 normalWS = TransformObjectToWorldNormal(v.normalOS); + const VertexPositionInfo position = MToon_GetShadowCasterVertex(v.vertex.xyz, normalWS); + output.pos = position.positionCS; + output.positionWS = position.positionWS.xyz; + output.normalWS = TransformObjectToWorldNormal(normalWS); + output.viewDirWS = MToon_GetWorldSpaceNormalizedViewDir(output.positionWS); + + return output; +} + +#endif + +#endif \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_vertex.hlsl.meta b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_vertex.hlsl.meta new file mode 100644 index 000000000..fd4fe6a34 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_shadowcaster_vertex.hlsl.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 06e9bdc3bc909534399f25d6769c8396 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_urp.shader b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_urp.shader new file mode 100644 index 000000000..d10d28134 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_urp.shader @@ -0,0 +1,198 @@ +Shader "VRM10/Universal Render Pipeline/MToon10" +{ + Properties + { + // Rendering + _AlphaMode ("alphaMode", Int) = 0 + _TransparentWithZWrite ("mtoon.transparentWithZWrite", Int) = 0 + _Cutoff ("alphaCutoff", Range(0, 1)) = 0.5 // Unity specified name + _RenderQueueOffset ("mtoon.renderQueueOffsetNumber", Int) = 0 + _DoubleSided ("doubleSided", Int) = 0 + + // Lighting + _Color ("pbrMetallicRoughness.baseColorFactor", Color) = (1, 1, 1, 1) // Unity specified name + _MainTex ("pbrMetallicRoughness.baseColorTexture", 2D) = "white" {} // Unity specified name + _ShadeColor ("mtoon.shadeColorFactor", Color) = (1, 1, 1, 1) + _ShadeTex ("mtoon.shadeMultiplyTexture", 2D) = "white" {} + [Normal] _BumpMap ("normalTexture", 2D) = "bump" {} // Unity specified name + _BumpScale ("normalTexture.scale", Float) = 1.0 // Unity specified name + _ShadingShiftFactor ("mtoon.shadingShiftFactor", Range(-1, 1)) = -0.05 + _ShadingShiftTex ("mtoon.shadingShiftTexture", 2D) = "black" {} // channel R + _ShadingShiftTexScale ("mtoon.shadingShiftTexture.scale", Float) = 1 + _ShadingToonyFactor ("mtoon.shadingToonyFactor", Range(0, 1)) = 0.95 + + // GI + _GiEqualization ("mtoon.giEqualizationFactor", Range(0, 1)) = 0.9 + + // Emission + [HDR] _EmissionColor ("emissiveFactor", Color) = (0, 0, 0, 1) // Unity specified name + _EmissionMap ("emissiveTexture", 2D) = "white" {} // Unity specified name + + // Rim Lighting + _MatcapColor ("mtoon.matcapFactor", Color) = (0, 0, 0, 1) + _MatcapTex ("mtoon.matcapTexture", 2D) = "black" {} + _RimColor ("mtoon.parametricRimColorFactor", Color) = (0, 0, 0, 1) + _RimFresnelPower ("mtoon.parametricRimFresnelPowerFactor", Range(0, 100)) = 5.0 + _RimLift ("mtoon.parametricRimLiftFactor", Range(0, 1)) = 0 + _RimTex ("mtoon.rimMultiplyTexture", 2D) = "white" {} + _RimLightingMix ("mtoon.rimLightingMixFactor", Range(0, 1)) = 1 + + // Outline + _OutlineWidthMode ("mtoon.outlineWidthMode", Int) = 0 + [PowerSlider(2.2)] _OutlineWidth ("mtoon.outlineWidthFactor", Range(0, 0.05)) = 0 + _OutlineWidthTex ("mtoon.outlineWidthMultiplyTexture", 2D) = "white" {} // channel G + _OutlineColor ("mtoon.outlineColorFactor", Color) = (0, 0, 0, 1) + _OutlineLightingMix ("mtoon.outlineLightingMixFactor", Range(0, 1)) = 1 + + // UV Animation + _UvAnimMaskTex ("mtoon.uvAnimationMaskTexture", 2D) = "white" {} // channel B + _UvAnimScrollXSpeed ("mtoon.uvAnimationScrollXSpeedFactor", Float) = 0 + _UvAnimScrollYSpeed ("mtoon.uvAnimationScrollYSpeedFactor", Float) = 0 + _UvAnimRotationSpeed ("mtoon.uvAnimationRotationSpeedFactor", Float) = 0 + + // Unity ShaderPass Mode + _M_CullMode ("_CullMode", Float) = 2.0 + _M_SrcBlend ("_SrcBlend", Float) = 1.0 + _M_DstBlend ("_DstBlend", Float) = 0.0 + _M_ZWrite ("_ZWrite", Float) = 1.0 + _M_AlphaToMask ("_AlphaToMask", Float) = 0.0 + + // etc + _M_DebugMode ("_DebugMode", Float) = 0.0 + + // for Editor + _M_EditMode ("_EditMode", Float) = 0.0 + } + + // Shader Model 3.0 + SubShader + { + Tags + { + "RenderType" = "Opaque" + "RenderPipeline" = "UniversalPipeline" + "UniversalMaterialType" = "Lit" + "IgnoreProjector" = "True" + } + + // Built-in Forward Base Pass + Pass + { + Name "UniversalForward" + Tags { "LightMode" = "UniversalForward" } + + Cull [_M_CullMode] + Blend [_M_SrcBlend] [_M_DstBlend] + ZWrite [_M_ZWrite] + ZTest LEqual + BlendOp Add, Max + AlphaToMask [_M_AlphaToMask] + + HLSLPROGRAM + #pragma target 3.0 + + // Unity defined keywords + #pragma multi_compile_fwdbase nolightmap nodynlightmap nodirlightmap novertexlight + #pragma multi_compile_fog + #pragma multi_compile_instancing + + #pragma multi_compile __ _ALPHATEST_ON _ALPHABLEND_ON + #pragma multi_compile __ _NORMALMAP + #pragma multi_compile __ _MTOON_EMISSIVEMAP + #pragma multi_compile __ _MTOON_RIMMAP + #pragma multi_compile __ _MTOON_PARAMETERMAP + + // ------------------------------------- + // Universal Pipeline keywords + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE + #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS + #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS + #pragma multi_compile_fragment _ _SHADOWS_SOFT + #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING + #pragma multi_compile _ SHADOWS_SHADOWMASK + #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION + + #pragma vertex MToonVertex + #pragma fragment MToonFragment + + #define MTOON_URP + + #include "./vrmc_materials_mtoon_forward_vertex.hlsl" + #include "./vrmc_materials_mtoon_forward_fragment.hlsl" + ENDHLSL + } + + // Built-in Forward Base Pass + Pass + { + Name "MToonOutline" + Tags { "LightMode" = "MToonOutline" } + + Cull Front + Blend [_M_SrcBlend] [_M_DstBlend] + ZWrite [_M_ZWrite] + ZTest LEqual + Offset 1, 1 + BlendOp Add, Max + AlphaToMask [_M_AlphaToMask] + + HLSLPROGRAM + #pragma target 3.0 + + // Unity defined keywords + #pragma multi_compile_fwdbase nolightmap nodynlightmap nodirlightmap novertexlight + #pragma multi_compile_fog + #pragma multi_compile_instancing + + #pragma multi_compile __ _ALPHATEST_ON _ALPHABLEND_ON + #pragma multi_compile __ _NORMALMAP + #pragma multi_compile __ _MTOON_EMISSIVEMAP + #pragma multi_compile __ _MTOON_RIMMAP + #pragma multi_compile __ _MTOON_PARAMETERMAP + #pragma multi_compile __ _MTOON_OUTLINE_WORLD _MTOON_OUTLINE_SCREEN + + #pragma vertex MToonVertex + #pragma fragment MToonFragment + + #define MTOON_URP + #define MTOON_PASS_OUTLINE + + #include "./vrmc_materials_mtoon_forward_vertex.hlsl" + #include "./vrmc_materials_mtoon_forward_fragment.hlsl" + ENDHLSL + } + + // Shadow rendering pass + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + + Cull [_M_CullMode] + ZWrite On + ZTest LEqual + + HLSLPROGRAM + #pragma target 3.0 + + // Unity defined keywords + #pragma multi_compile_shadowcaster nolightmap nodynlightmap nodirlightmap novertexlight + #pragma multi_compile_instancing + + #pragma multi_compile __ _ALPHATEST_ON _ALPHABLEND_ON + + #pragma vertex MToonShadowCasterVertex + #pragma fragment MToonShadowCasterFragment + + #define MTOON_URP + + #include "./vrmc_materials_mtoon_shadowcaster_vertex.hlsl" + #include "./vrmc_materials_mtoon_shadowcaster_fragment.hlsl" + ENDHLSL + } + } + + FallBack "Hidden/Universal Render Pipeline/FallbackError" + CustomEditor "VRMShaders.VRM10.MToon10.Editor.MToonInspector" +} diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_urp.shader.meta b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_urp.shader.meta new file mode 100644 index 000000000..9d51e8d1a --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_urp.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0781c64b7f2a1604ea6aa7e252080372 +timeCreated: 1514111466 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_utility.hlsl b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_utility.hlsl index bd1d91262..fec4d535d 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_utility.hlsl +++ b/Assets/VRMShaders/VRM10/MToon10/Resources/VRM10/vrmc_materials_mtoon_utility.hlsl @@ -1,7 +1,11 @@ #ifndef VRMC_MATERIALS_MTOON_UTILITY_INCLUDED #define VRMC_MATERIALS_MTOON_UTILITY_INCLUDED +#ifdef MTOON_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#else #include +#endif // define static const float PI_2 = 6.28318530718; diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs new file mode 100644 index 000000000..5320b2fd6 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs @@ -0,0 +1,24 @@ +#if MTOON_URP +using UnityEngine.Rendering.Universal; + +namespace VRMShaders.VRM10.MToon10.Runtime +{ + public sealed class MToonOutlineRenderFeature : ScriptableRendererFeature + { + private MToonOutlineRenderPass _pass; + + public override void Create() + { + _pass = new MToonOutlineRenderPass + { + renderPassEvent = RenderPassEvent.AfterRenderingOpaques + }; + } + + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + renderer.EnqueuePass(_pass); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs.meta b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs.meta new file mode 100644 index 000000000..e0a69838c --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5b6d00cd3f0249a2b4ee7dc86f9a8d63 +timeCreated: 1682661280 \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs new file mode 100644 index 000000000..5fedcc594 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs @@ -0,0 +1,41 @@ +#if MTOON_URP +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +namespace VRMShaders.VRM10.MToon10.Runtime +{ + public sealed class MToonOutlineRenderPass : ScriptableRenderPass + { + private const string ProfilerTag = nameof(MToonOutlineRenderPass); + private readonly ProfilingSampler _profilingSampler = new ProfilingSampler(ProfilerTag); + + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + var cmd = CommandBufferPool.Get(); + using (new ProfilingScope(cmd, _profilingSampler)) + { + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + + var camera = renderingData.cameraData.camera; + var shaderTagId = new ShaderTagId("MToonOutline"); + var sortingSettings = new SortingSettings(camera); + var drawingSettings = new DrawingSettings(shaderTagId, sortingSettings) + { + perObjectData = PerObjectData.ReflectionProbes | PerObjectData.Lightmaps | + PerObjectData.LightProbe | PerObjectData.LightData | PerObjectData.OcclusionProbe | + PerObjectData.ShadowMask + }; + var filteringSettings = FilteringSettings.defaultValue; + var renderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); + context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref filteringSettings, + ref renderStateBlock); + } + + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + CommandBufferPool.Release(cmd); + } + } +} +#endif \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs.meta b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs.meta new file mode 100644 index 000000000..e26639ad2 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: df162971c1034acdbe28ff1ec94d8601 +timeCreated: 1682665616 \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/UnityShaderLab/Properties/MToon10Meta.cs b/Assets/VRMShaders/VRM10/MToon10/Runtime/UnityShaderLab/Properties/MToon10Meta.cs index 8141abb90..33e485a96 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Runtime/UnityShaderLab/Properties/MToon10Meta.cs +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/UnityShaderLab/Properties/MToon10Meta.cs @@ -3,5 +3,6 @@ public static class MToon10Meta { public static readonly string UnityShaderName = "VRM10/MToon10"; + public static readonly string URPUnityShaderName = "VRM10/Universal Render Pipeline/MToon10"; } } \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/VRMShaders.VRM10.MToon10.Runtime.asmdef b/Assets/VRMShaders/VRM10/MToon10/Runtime/VRMShaders.VRM10.MToon10.Runtime.asmdef index 25f494397..7b4b785b5 100644 --- a/Assets/VRMShaders/VRM10/MToon10/Runtime/VRMShaders.VRM10.MToon10.Runtime.asmdef +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/VRMShaders.VRM10.MToon10.Runtime.asmdef @@ -1,6 +1,10 @@ { "name": "VRMShaders.VRM10.MToon10.Runtime", - "references": [], + "rootNamespace": "", + "references": [ + "GUID:15fc0a57446b3144c949da3e2b9737a9", + "GUID:df380645f10b7bc4b97d4f5eb6303d95" + ], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, @@ -8,6 +12,12 @@ "precompiledReferences": [], "autoReferenced": false, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.render-pipelines.core", + "expression": "", + "define": "MTOON_URP" + } + ], "noEngineReferences": false } \ No newline at end of file