From 5c828ea79d97fdb9c659e4b02a265f5714d193a9 Mon Sep 17 00:00:00 2001 From: chris_dibbern Date: Sun, 10 Apr 2022 16:15:10 -0500 Subject: [PATCH 1/5] Fixing Lit Geom SinglePassInstanced and shadows --- Assets/Fur/Shaders/Geometry/Lit.hlsl | 84 +++-- Assets/Fur/Shaders/Geometry/Lit.shader | 295 +++++++++--------- .../Fur/Shaders/Geometry/LitTessellation.hlsl | 5 +- Assets/Fur/Shaders/Geometry/Shadow.hlsl | 69 +++- 4 files changed, 268 insertions(+), 185 deletions(-) diff --git a/Assets/Fur/Shaders/Geometry/Lit.hlsl b/Assets/Fur/Shaders/Geometry/Lit.hlsl index 1183b58..634cb18 100644 --- a/Assets/Fur/Shaders/Geometry/Lit.hlsl +++ b/Assets/Fur/Shaders/Geometry/Lit.hlsl @@ -6,6 +6,7 @@ #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +#include "HLSLSupport.cginc" struct _Attributes { @@ -14,6 +15,7 @@ struct _Attributes float2 texcoord : TEXCOORD0; float2 lightmapUV : TEXCOORD1; uint id : SV_VertexID; + UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Attributes @@ -23,6 +25,8 @@ struct Attributes float2 texcoord : TEXCOORD0; float2 lightmapUV : TEXCOORD1; uint id : TEXCOORD2; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -34,19 +38,31 @@ struct Varyings DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 4); float4 fogFactorAndVertexLight : TEXCOORD5; // x: fogFactor, yzw: vertex light float factor : TEXCOORD6; + UNITY_VERTEX_OUTPUT_STEREO }; Attributes vert(_Attributes input) { + Attributes output; + UNITY_INITIALIZE_OUTPUT(Attributes, output); + //UNITY_SETUP_INSTANCE_ID(input); //Insert + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); //Insert + UNITY_TRANSFER_INSTANCE_ID(input, output); FurMoverData data = _Buffer[input.id]; + //UNITY_INITIALIZE_OUTPUT(Attributes, output); //Insert + output.positionOS = input.positionOS; + output.normalOS = input.normalOS; + output.texcoord = input.texcoord; + output.lightmapUV = input.lightmapUV; + output.id = input.id; float time = _Time.y; if (abs(time - data.time) > 1e-3) { - float3 targetPosWS = TransformObjectToWorld(input.positionOS.xyz); + float3 targetPosWS = TransformObjectToWorld(output.positionOS.xyz); float3 dPosWS = targetPosWS - data.posWS; float3 forceWS = _Spring * dPosWS - data.velocityWS * _Damper + float3(0.0, _Gravity, 0.0); - float3 normalWS = TransformObjectToWorldNormal(input.normalOS, true); + float3 normalWS = TransformObjectToWorldNormal(output.normalOS, true); float dt = 1.0 / 60; data.velocityWS += forceWS * dt; data.posWS += data.velocityWS * dt; @@ -54,10 +70,10 @@ Attributes vert(_Attributes input) float move = length(data.dPosWS); data.dPosWS = min(move, 1.0) / max(move, 0.01) * data.dPosWS; data.time = time; - _Buffer[input.id] = data; + _Buffer[output.id] = data; } - return (Attributes)input; + return output; } void AppendVertex( @@ -66,9 +82,13 @@ void AppendVertex( float3 normalOS, float2 uv, float2 lightmapUV, - float factor) + float factor, + Attributes input0) { - Varyings output = (Varyings)0; + Varyings output; + //UNITY_INITIALIZE_OUTPUT(Varyings, output); + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input0, output); VertexPositionInputs vertexInput = GetVertexPositionInputs(posOS); output.positionCS = vertexInput.positionCS; @@ -90,6 +110,16 @@ void AppendVertex( [maxvertexcount(45)] void geom(triangle Attributes input[3], inout TriangleStream stream) { + UNITY_SETUP_INSTANCE_ID(input[0]); + //UNITY_SETUP_INSTANCE_ID(input[1]); + //UNITY_SETUP_INSTANCE_ID(input[2]); + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input[0]) + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input[1]) + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input[2]) + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[0]); + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[1]); + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[2]); + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); uint id0 = input[0].id; uint id1 = input[1].id; uint id2 = input[2].id; @@ -175,14 +205,14 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) float2 nextLightmapUv1 = prevUv1 + lightmapUvInterp1 * delta; float2 nextLightmapUv2 = prevUv2 + lightmapUvInterp2 * delta; - AppendVertex(stream, nextPos0OS, nextNormal0OS, nextUv0, nextLightmapUv0, nextFactor); - AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor); - AppendVertex(stream, nextPos1OS, nextNormal1OS, nextUv1, nextLightmapUv1, nextFactor); - AppendVertex(stream, prevPos1OS, prevNormal1OS, prevUv1, prevLightmapUv1, prevFactor); - AppendVertex(stream, nextPos2OS, nextNormal2OS, nextUv2, nextLightmapUv2, nextFactor); - AppendVertex(stream, prevPos2OS, prevNormal2OS, prevUv2, prevLightmapUv2, prevFactor); - AppendVertex(stream, nextPos0OS, nextNormal0OS, nextUv0, nextLightmapUv0, nextFactor); - AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor); + AppendVertex(stream, nextPos0OS, nextNormal0OS, nextUv0, nextLightmapUv0, nextFactor, input[0]); + AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor, input[0]); + AppendVertex(stream, nextPos1OS, nextNormal1OS, nextUv1, nextLightmapUv1, nextFactor, input[0]); + AppendVertex(stream, prevPos1OS, prevNormal1OS, prevUv1, prevLightmapUv1, prevFactor, input[0]); + AppendVertex(stream, nextPos2OS, nextNormal2OS, nextUv2, nextLightmapUv2, nextFactor, input[0]); + AppendVertex(stream, prevPos2OS, prevNormal2OS, prevUv2, prevLightmapUv2, prevFactor, input[0]); + AppendVertex(stream, nextPos0OS, nextNormal0OS, nextUv0, nextLightmapUv0, nextFactor, input[0]); + AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor, input[0]); prevFactor = nextFactor; @@ -209,16 +239,18 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) float3 topNormalOS = SafeNormalize(topMovedPosOS - prevCenterPosOS); topNormalOS = SafeNormalize(lerp(faceNormalOS, topNormalOS, _NormalFactor)); - AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor); - AppendVertex(stream, prevPos1OS, prevNormal1OS, prevUv1, prevLightmapUv1, prevFactor); - AppendVertex(stream, topMovedPosOS, topNormalOS, topUv, topLightmapUv, 1.0); - AppendVertex(stream, prevPos2OS, prevNormal2OS, prevUv2, prevLightmapUv2, prevFactor); - AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor); + AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor, input[0]); + AppendVertex(stream, prevPos1OS, prevNormal1OS, prevUv1, prevLightmapUv1, prevFactor, input[0]); + AppendVertex(stream, topMovedPosOS, topNormalOS, topUv, topLightmapUv, 1.0, input[0]); + AppendVertex(stream, prevPos2OS, prevNormal2OS, prevUv2, prevLightmapUv2, prevFactor, input[0]); + AppendVertex(stream, prevPos0OS, prevNormal0OS, prevUv0, prevLightmapUv0, prevFactor, input[0]); stream.RestartStrip(); } float4 frag(Varyings input) : SV_Target { + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + //UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input, output); SurfaceData surfaceData = (SurfaceData)0; InitializeStandardLitSurfaceData(input.uv, surfaceData); surfaceData.occlusion = lerp(sqrt(abs(1.0 - _Occlusion)), 1.0, input.factor); @@ -238,12 +270,20 @@ float4 frag(Varyings input) : SV_Target inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, inputData.normalWS); #if 1 - float4 color = UniversalFragmentPBR(inputData, surfaceData); + /*float4 color = UniversalFragmentPBR(inputData, surfaceData); ApplyRimLight(color.rgb, inputData.positionWS, inputData.viewDirectionWS, inputData.normalWS); color.rgb += _AmbientColor.rgb; - color.rgb = MixFog(color.rgb, inputData.fogCoord); + color.rgb = clamp(MixFog(color.rgb, inputData.fogCoord), 0, 1);*/ + + Light mainLight = GetMainLight(TransformWorldToShadowCoord(input.positionWS)); + float shadow = mainLight.distanceAttenuation * mainLight.shadowAttenuation; + float4 color = UniversalFragmentPBR(inputData, surfaceData); + + color.rgb *= shadow; + //ApplyRimLight(color.rgb, input.positionWS, viewDirWS, normalWS); + color.rgb = clamp(color.rgb + _AmbientColor, 0, 1); #else - float4 color = float4(inputData.normalWS, 1.0); + float4 color = clamp(float4(inputData.normalWS, 1.0), 0, 1); #endif return color; diff --git a/Assets/Fur/Shaders/Geometry/Lit.shader b/Assets/Fur/Shaders/Geometry/Lit.shader index 45eca32..ff7fff4 100644 --- a/Assets/Fur/Shaders/Geometry/Lit.shader +++ b/Assets/Fur/Shaders/Geometry/Lit.shader @@ -1,145 +1,150 @@ -Shader "Fur/Geometry/Lit" -{ - -Properties -{ - [Header(Basic)][Space] - [MainColor] _BaseColor("Color", Color) = (1.0, 1.0, 1.0, 1) - _AmbientColor("AmbientColor", Color) = (0.0, 0.0, 0.0, 1) - _BaseMap("Base Map", 2D) = "white" {} - [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.5 - _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5 - - [Header(Fur)][Space] - _FurLength("Fur Length", Range(0.0, 2.0)) = 0.3 - [IntRange] _FurJoint("Fur Joint", Range(0, 6)) = 3 - _Occlusion("Occlusion", Range(0.0, 1.0)) = 0.3 - _RandomDirection("Random Direction", Range(0.0, 1.0)) = 0.3 - _NormalFactor("Normal Factor", Range(0.0, 1.0)) = 0.0 - - [Header(Move)][Space] - _BaseMove("Base Move", Vector) = (0.0, -0.0, 0.0, 3.0) - _WindFreq("Wind Freq", Vector) = (0.5, 0.7, 0.9, 1.0) - _WindMove("Wind Move", Vector) = (0.2, 0.3, 0.2, 1.0) - - [Header(Tesselation)][Space] - _TessMinDist("Tesselation Min Distance", Range(0.1, 10)) = 1.0 - _TessMaxDist("Tesselation Max Distance", Range(0.1, 100)) = 10.0 - _TessFactor("Tessellation Factor", Range(1, 10)) = 4 - - [Header(Lighting)][Space] - _RimLightPower("Rim Light Power", Range(1.0, 20.0)) = 6.0 - _RimLightIntensity("Rim Light Intensity", Range(0.0, 1.0)) = 0.5 - _ShadowExtraBias("Shadow Extra Bias", Range(-1.0, 1.0)) = 0.0 - - [Header(Move)][Space] - _MoveScale("MoveScale", Range(0.0, 5.0)) = 1.0 - _Spring("Spring", Range(0.0, 20.0)) = 5.0 - _Damper("Damper", Range(0.0, 10.0)) = 1.0 - _Gravity("Gravity", Range(-10.0, 10.0)) = -2.0 -} - -SubShader -{ - Tags - { - "RenderType" = "Opaque" - "RenderPipeline" = "UniversalPipeline" - "UniversalMaterialType" = "Lit" - "IgnoreProjector" = "True" - } - - ZWrite On - Cull Back - - Pass - { - Name "ForwardLit" - Tags { "LightMode" = "UniversalForward" } - - ZWrite On - Cull Back - - HLSLPROGRAM - // URP - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE - #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS - #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS - #pragma multi_compile _ _SHADOWS_SOFT - #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE - - // Unity - #pragma multi_compile _ DIRLIGHTMAP_COMBINED - #pragma multi_compile _ LIGHTMAP_ON - #pragma multi_compile_fog - - #pragma target 5.0 - #pragma exclude_renderers gles gles3 glcore - #pragma multi_compile _ DRAW_ORIG_POLYGON - #pragma vertex vert - #pragma require tessellation tessHW - #pragma hull hull - #pragma domain domain - #pragma require geometry - #pragma geometry geom - #pragma fragment frag - #include "./Lit.hlsl" - #include "./LitTessellation.hlsl" - ENDHLSL - } - - Pass - { - Name "DepthOnly" - Tags { "LightMode" = "DepthOnly" } - - ZWrite On - ColorMask 0 - - HLSLPROGRAM - #pragma exclude_renderers gles gles3 glcore - #pragma multi_compile_fog - #pragma multi_compile _ DRAW_ORIG_POLYGON - #pragma multi_compile _ APPEND_MORE_FINS - #pragma vertex vert - #pragma require tessellation tessHW - #pragma hull hull - #pragma domain domain - #pragma require geometry - #pragma geometry geom - #pragma fragment frag - #include "./Shadow.hlsl" - #include "./UnlitTessellation.hlsl" - ENDHLSL - } - - Pass - { - Name "ShadowCaster" - Tags {"LightMode" = "ShadowCaster" } - - ZWrite On - ZTest LEqual - ColorMask 0 - - HLSLPROGRAM - #pragma exclude_renderers gles gles3 glcore - #pragma multi_compile_fog - #pragma multi_compile _ DRAW_ORIG_POLYGON - #pragma multi_compile _ APPEND_MORE_FINS - #pragma vertex vert - #pragma require tessellation tessHW - #pragma hull hull - #pragma domain domain - #pragma require geometry - #pragma geometry geom - #pragma fragment frag - #define SHADOW_CASTER_PASS - #include "./Shadow.hlsl" - #include "./UnlitTessellation.hlsl" - ENDHLSL - } -} - -} +Shader "Fur/Geometry/Lit" +{ + +Properties +{ + [Header(Basic)][Space] + [MainColor] _BaseColor("Color", Color) = (1.0, 1.0, 1.0, 1) + _AmbientColor("AmbientColor", Color) = (0.0, 0.0, 0.0, 1) + _BaseMap("Base Map", 2D) = "white" {} + [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.5 + _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5 + + [Header(Fur)][Space] + _FurLength("Fur Length", Range(0.0, 2.0)) = 0.3 + [IntRange] _FurJoint("Fur Joint", Range(0, 6)) = 3 + _Occlusion("Occlusion", Range(0.0, 1.0)) = 0.3 + _RandomDirection("Random Direction", Range(0.0, 1.0)) = 0.3 + _NormalFactor("Normal Factor", Range(0.0, 1.0)) = 0.0 + + [Header(Move)][Space] + _BaseMove("Base Move", Vector) = (0.0, -0.0, 0.0, 3.0) + _WindFreq("Wind Freq", Vector) = (0.5, 0.7, 0.9, 1.0) + _WindMove("Wind Move", Vector) = (0.2, 0.3, 0.2, 1.0) + + [Header(Tesselation)][Space] + _TessMinDist("Tesselation Min Distance", Range(0.1, 10)) = 1.0 + _TessMaxDist("Tesselation Max Distance", Range(0.1, 100)) = 10.0 + _TessFactor("Tessellation Factor", Range(1, 10)) = 4 + + [Header(Lighting)][Space] + _RimLightPower("Rim Light Power", Range(1.0, 20.0)) = 6.0 + _RimLightIntensity("Rim Light Intensity", Range(0.0, 1.0)) = 0.5 + _ShadowExtraBias("Shadow Extra Bias", Range(-1.0, 1.0)) = 0.0 + + [Header(Move)][Space] + _MoveScale("MoveScale", Range(0.0, 5.0)) = 1.0 + _Spring("Spring", Range(0.0, 20.0)) = 5.0 + _Damper("Damper", Range(0.0, 10.0)) = 1.0 + _Gravity("Gravity", Range(-10.0, 10.0)) = -2.0 +} + +SubShader +{ + Tags + { + "RenderType" = "Opaque" + "RenderPipeline" = "UniversalPipeline" + "UniversalMaterialType" = "Lit" + "IgnoreProjector" = "True" + } + + ZWrite On + Cull Back + + Pass + { + Name "ForwardLit" + Tags { "LightMode" = "UniversalForward" } + + ZWrite On + Cull Back + + HLSLPROGRAM + // URP + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE + #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS + #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS + #pragma multi_compile _ _SHADOWS_SOFT + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + + // Unity + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile_fog + + #pragma target 5.0 + #pragma exclude_renderers gles gles3 glcore + #pragma multi_compile _ DRAW_ORIG_POLYGON + #pragma vertex vert + #pragma require tessellation tessHW + #pragma hull hull + #pragma domain domain + #pragma require geometry + #pragma geometry geom + #pragma fragment frag + #include "./Lit.hlsl" + #include "./LitTessellation.hlsl" + ENDHLSL + } + + Pass + { + Name "DepthOnly" + Tags { "LightMode" = "DepthOnly" } + + ZWrite On + ColorMask 0 + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON + #pragma multi_compile_fog + #pragma multi_compile _ DRAW_ORIG_POLYGON + #pragma multi_compile _ APPEND_MORE_FINS + #pragma vertex vert + #pragma require tessellation tessHW + #pragma hull hull + #pragma domain domain + #pragma require geometry + #pragma geometry geom + #pragma fragment frag + #include "./Shadow.hlsl" + #include "./UnlitTessellation.hlsl" + ENDHLSL + } + + Pass + { + Name "ShadowCaster" + Tags {"LightMode" = "ShadowCaster" } + + ZWrite On + ZTest LEqual + ColorMask 0 + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma multi_compile_fog + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON + #pragma multi_compile _ DRAW_ORIG_POLYGON + #pragma multi_compile _ APPEND_MORE_FINS + #pragma vertex vert + #pragma require tessellation tessHW + #pragma hull hull + #pragma domain domain + #pragma require geometry + #pragma geometry geom + #pragma fragment frag + #define SHADOW_CASTER_PASS + #include "./Shadow.hlsl" + #include "./UnlitTessellation.hlsl" + ENDHLSL + } +} +} diff --git a/Assets/Fur/Shaders/Geometry/LitTessellation.hlsl b/Assets/Fur/Shaders/Geometry/LitTessellation.hlsl index 02b413e..d8da3e1 100644 --- a/Assets/Fur/Shaders/Geometry/LitTessellation.hlsl +++ b/Assets/Fur/Shaders/Geometry/LitTessellation.hlsl @@ -26,6 +26,7 @@ struct HsConstantOutput [outputcontrolpoints(3)] Attributes hull(InputPatch input, uint id : SV_OutputControlPointID) { + UNITY_SETUP_INSTANCE_ID(input[id]); return input[id]; } @@ -76,7 +77,9 @@ Attributes domain( const OutputPatch i, float3 bary : SV_DomainLocation) { - Attributes o = (Attributes)0; + Attributes o; + UNITY_INITIALIZE_OUTPUT(Attributes, o); + UNITY_TRANSFER_INSTANCE_ID(i[0], o); float fU = bary.x; float fV = bary.y; diff --git a/Assets/Fur/Shaders/Geometry/Shadow.hlsl b/Assets/Fur/Shaders/Geometry/Shadow.hlsl index cab7fa5..02557da 100644 --- a/Assets/Fur/Shaders/Geometry/Shadow.hlsl +++ b/Assets/Fur/Shaders/Geometry/Shadow.hlsl @@ -4,12 +4,22 @@ #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +#include "HLSLSupport.cginc" -struct Attributes +struct _Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct Attributes { + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -18,16 +28,29 @@ struct Varyings float2 uv : TEXCOORD0; float fogCoord : TEXCOORD1; float factor : TEXCOORD2; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +Attributes vert(_Attributes input) { - return input; + Attributes output; + UNITY_INITIALIZE_OUTPUT(Attributes, output); + //UNITY_SETUP_INSTANCE_ID(input); //Insert + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); //Insert + UNITY_TRANSFER_INSTANCE_ID(input, output); + output.positionOS = input.positionOS; + output.normalOS = input.normalOS; + output.uv = input.uv; + return output; } -void AppendVertex(inout TriangleStream stream, float3 posOS, float3 normalWS, float2 uv, float factor) +void AppendVertex(inout TriangleStream stream, float3 posOS, float3 normalWS, float2 uv, float factor, Attributes input0) { Varyings output; + //UNITY_INITIALIZE_OUTPUT(Varyings, output); + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input0, output); #ifdef SHADOW_CASTER_PASS float3 posWS = TransformObjectToWorld(posOS); output.vertex = GetShadowPositionHClip(posWS, normalWS); @@ -43,6 +66,16 @@ void AppendVertex(inout TriangleStream stream, float3 posOS, float3 no [maxvertexcount(53)] void geom(triangle Attributes input[3], inout TriangleStream stream) { + //UNITY_SETUP_INSTANCE_ID(input[0]); + //UNITY_SETUP_INSTANCE_ID(input[1]); + //UNITY_SETUP_INSTANCE_ID(input[2]); + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input[0]) + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input[1]) + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input[2]) + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[0]); + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[1]); + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[2]); + //UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); float3 startPos0OS = input[0].positionOS.xyz; float3 startPos1OS = input[1].positionOS.xyz; float3 startPos2OS = input[2].positionOS.xyz; @@ -95,14 +128,14 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) float2 nextUv1 = prevUv1 + uvInterp1 * delta; float2 nextUv2 = prevUv2 + uvInterp2 * delta; - AppendVertex(stream, nextPos0OS, faceNormalWS, nextUv0, nextFactor); - AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor); - AppendVertex(stream, nextPos1OS, faceNormalWS, nextUv1, nextFactor); - AppendVertex(stream, prevPos1OS, faceNormalWS, prevUv1, prevFactor); - AppendVertex(stream, nextPos2OS, faceNormalWS, nextUv2, nextFactor); - AppendVertex(stream, prevPos2OS, faceNormalWS, prevUv2, prevFactor); - AppendVertex(stream, nextPos0OS, faceNormalWS, nextUv0, nextFactor); - AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor); + AppendVertex(stream, nextPos0OS, faceNormalWS, nextUv0, nextFactor, input[0]); + AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor, input[0]); + AppendVertex(stream, nextPos1OS, faceNormalWS, nextUv1, nextFactor, input[0]); + AppendVertex(stream, prevPos1OS, faceNormalWS, prevUv1, prevFactor, input[0]); + AppendVertex(stream, nextPos2OS, faceNormalWS, nextUv2, nextFactor, input[0]); + AppendVertex(stream, prevPos2OS, faceNormalWS, prevUv2, prevFactor, input[0]); + AppendVertex(stream, nextPos0OS, faceNormalWS, nextUv0, nextFactor, input[0]); + AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor, input[0]); prevFactor = nextFactor; @@ -117,11 +150,11 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) stream.RestartStrip(); } - AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor); - AppendVertex(stream, prevPos1OS, faceNormalWS, prevUv1, prevFactor); - AppendVertex(stream, topMovedPosOS, faceNormalWS, topUv, 1.0); - AppendVertex(stream, prevPos2OS, faceNormalWS, prevUv2, prevFactor); - AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor); + AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor, input[0]); + AppendVertex(stream, prevPos1OS, faceNormalWS, prevUv1, prevFactor, input[0]); + AppendVertex(stream, topMovedPosOS, faceNormalWS, topUv, 1.0, input[0]); + AppendVertex(stream, prevPos2OS, faceNormalWS, prevUv2, prevFactor, input[0]); + AppendVertex(stream, prevPos0OS, faceNormalWS, prevUv0, prevFactor, input[0]); stream.RestartStrip(); } @@ -130,6 +163,8 @@ void frag( out float4 outColor : SV_Target, out float outDepth : SV_Depth) { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + //UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input, output); outColor = outDepth = input.vertex.z / input.vertex.w; } From e63af59abfda694da767d5879eb544125ec849b2 Mon Sep 17 00:00:00 2001 From: chris_dibbern Date: Sun, 10 Apr 2022 17:08:33 -0500 Subject: [PATCH 2/5] Oops. Re-doing shadows correctly. --- Assets/Fur/Shaders/Geometry/Lit.hlsl | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Assets/Fur/Shaders/Geometry/Lit.hlsl b/Assets/Fur/Shaders/Geometry/Lit.hlsl index 634cb18..f75a094 100644 --- a/Assets/Fur/Shaders/Geometry/Lit.hlsl +++ b/Assets/Fur/Shaders/Geometry/Lit.hlsl @@ -260,7 +260,7 @@ float4 frag(Varyings input) : SV_Target inputData.positionWS = input.positionWS; inputData.normalWS = SafeNormalize(input.normalWS); inputData.viewDirectionWS = SafeNormalize(GetCameraPositionWS() - input.positionWS); -#if defined(_MAIN_LIGHT_SHADOWS) && !defined(_RECEIVE_SHADOWS_OFF) +#if (defined(_MAIN_LIGHT_SHADOWS) || defined(_MAIN_LIGHT_SHADOWS_CASCADE) || defined(_MAIN_LIGHT_SHADOWS_SCREEN)) && !defined(_RECEIVE_SHADOWS_OFF) inputData.shadowCoord = TransformWorldToShadowCoord(input.positionWS); #else inputData.shadowCoord = float4(0, 0, 0, 0); @@ -270,18 +270,10 @@ float4 frag(Varyings input) : SV_Target inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, inputData.normalWS); #if 1 - /*float4 color = UniversalFragmentPBR(inputData, surfaceData); + float4 color = UniversalFragmentPBR(inputData, surfaceData); ApplyRimLight(color.rgb, inputData.positionWS, inputData.viewDirectionWS, inputData.normalWS); color.rgb += _AmbientColor.rgb; - color.rgb = clamp(MixFog(color.rgb, inputData.fogCoord), 0, 1);*/ - - Light mainLight = GetMainLight(TransformWorldToShadowCoord(input.positionWS)); - float shadow = mainLight.distanceAttenuation * mainLight.shadowAttenuation; - float4 color = UniversalFragmentPBR(inputData, surfaceData); - - color.rgb *= shadow; - //ApplyRimLight(color.rgb, input.positionWS, viewDirWS, normalWS); - color.rgb = clamp(color.rgb + _AmbientColor, 0, 1); + color.rgb = clamp(MixFog(color.rgb, inputData.fogCoord), 0, 1); #else float4 color = clamp(float4(inputData.normalWS, 1.0), 0, 1); #endif From 32b112560d44a0bb879bbe9dedd49f42918a1287 Mon Sep 17 00:00:00 2001 From: chris_dibbern Date: Mon, 11 Apr 2022 13:13:02 -0500 Subject: [PATCH 3/5] Updating remaining shaders for single pass instanced --- Assets/Fur/Shaders/Fin/Lit.hlsl | 51 +++- Assets/Fur/Shaders/Fin/Lit.shader | 9 +- Assets/Fur/Shaders/Fin/LitTessellation.hlsl | 5 +- Assets/Fur/Shaders/Fin/Shadow.hlsl | 37 ++- Assets/Fur/Shaders/Fin/Unlit.hlsl | 49 +++- Assets/Fur/Shaders/Fin/UnlitTessellation.hlsl | 6 +- Assets/Fur/Shaders/Geometry/Lit.shader | 3 +- Assets/Fur/Shaders/Geometry/Unlit.hlsl | 55 +++-- .../Shaders/Geometry/UnlitTessellation.hlsl | 6 +- Assets/Fur/Shaders/Shell/Lit.hlsl | 38 ++- Assets/Fur/Shaders/Shell/Lit.shader | 231 +++++++++--------- Assets/Fur/Shaders/Shell/Unlit.hlsl | 35 ++- 12 files changed, 342 insertions(+), 183 deletions(-) diff --git a/Assets/Fur/Shaders/Fin/Lit.hlsl b/Assets/Fur/Shaders/Fin/Lit.hlsl index 4576012..12cc0cf 100644 --- a/Assets/Fur/Shaders/Fin/Lit.hlsl +++ b/Assets/Fur/Shaders/Fin/Lit.hlsl @@ -1,18 +1,30 @@ #ifndef FUR_FIN_LIT_HLSL #define FUR_FIN_LIT_HLSL +#include "HLSLSupport.cginc" #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl" -#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +//#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +struct _Attributes +{ + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float2 texcoord : TEXCOORD0; + float2 lightmapUV : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; float2 texcoord : TEXCOORD0; float2 lightmapUV : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -25,11 +37,20 @@ struct Varyings float4 fogFactorAndVertexLight : TEXCOORD4; // x: fogFactor, yzw: vertex light float2 finUv : TEXCOORD5; float3 finTangentWS : TEXCOORD6; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +Attributes vert(_Attributes input) { - return input; + Attributes o; + UNITY_INITIALIZE_OUTPUT(Attributes, o); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, o); + o.positionOS = input.positionOS; + o.normalOS = input.normalOS; + o.lightmapUV = input.lightmapUV; + o.texcoord = input.texcoord; + return o; } void AppendFinVertex( @@ -39,9 +60,10 @@ void AppendFinVertex( float3 posOS, float3 normalOS, float2 finUv, - float3 finSideDirWS) + float3 finSideDirWS, + Attributes input0) { - Varyings output = (Varyings)0; + Varyings output; VertexPositionInputs vertexInput = GetVertexPositionInputs(posOS); output.positionCS = vertexInput.positionCS; @@ -58,6 +80,7 @@ void AppendFinVertex( OUTPUT_LIGHTMAP_UV(lightmapUV, unity_LightmapST, output.lightmapUV); OUTPUT_SH(output.normalWS, output.vertexSH); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); stream.Append(output); } @@ -116,15 +139,15 @@ void AppendFinVertices( { float3 finNormalOS = normalize(lerp(normalOS0, faceNormalOS, _FaceNormalFactor)); - AppendFinVertex(stream, uv0, lightmapUV0, posBeginOS, finNormalOS, float2(uvX1, finFactor), finSideDirWS); - AppendFinVertex(stream, uv12, lightmapUV12, posEndOS, finNormalOS, float2(uvX2, finFactor), finSideDirWS); + AppendFinVertex(stream, uv0, lightmapUV0, posBeginOS, finNormalOS, float2(uvX1, finFactor), finSideDirWS, input0); + AppendFinVertex(stream, uv12, lightmapUV12, posEndOS, finNormalOS, float2(uvX2, finFactor), finSideDirWS, input0); } else { faceNormalOS *= -1.0; float3 finNormalOS = normalize(lerp(normalOS0, faceNormalOS, _FaceNormalFactor)); - AppendFinVertex(stream, uv12, lightmapUV12, posEndOS, finNormalOS, float2(uvX2, finFactor), finSideDirWS); - AppendFinVertex(stream, uv0, lightmapUV0, posBeginOS, finNormalOS, float2(uvX1, finFactor), finSideDirWS); + AppendFinVertex(stream, uv12, lightmapUV12, posEndOS, finNormalOS, float2(uvX2, finFactor), finSideDirWS, input0); + AppendFinVertex(stream, uv0, lightmapUV0, posBeginOS, finNormalOS, float2(uvX1, finFactor), finSideDirWS, input0); } } @@ -135,10 +158,12 @@ void AppendFinVertices( [maxvertexcount(39)] void geom(triangle Attributes input[3], inout TriangleStream stream) { + UNITY_SETUP_INSTANCE_ID(input[0]); #ifdef DRAW_ORIG_POLYGON for (int i = 0; i < 3; ++i) { - Varyings output = (Varyings)0; + Varyings output; + UNITY_INITIALIZE_OUTPUT(Varyings, output); VertexPositionInputs vertexInput = GetVertexPositionInputs(input[i].positionOS.xyz); output.positionCS = vertexInput.positionCS; @@ -154,6 +179,7 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) OUTPUT_LIGHTMAP_UV(input[i].lightmapUV, unity_LightmapST, output.lightmapUV); OUTPUT_SH(output.normalWS, output.vertexSH); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); stream.Append(output); } stream.RestartStrip(); @@ -172,6 +198,7 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) float4 frag(Varyings input) : SV_Target { + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input); float4 furColor = SAMPLE_TEXTURE2D(_FurMap, sampler_FurMap, input.finUv); if (input.finUv.x >= 0.0 && furColor.a < _AlphaCutout) discard; @@ -193,7 +220,7 @@ float4 frag(Varyings input) : SV_Target inputData.positionWS = input.positionWS; inputData.normalWS = normalWS; inputData.viewDirectionWS = viewDirWS; -#if defined(_MAIN_LIGHT_SHADOWS) && !defined(_RECEIVE_SHADOWS_OFF) +#if (defined(_MAIN_LIGHT_SHADOWS) || defined(_MAIN_LIGHT_SHADOWS_CASCADE) || defined(_MAIN_LIGHT_SHADOWS_SCREEN)) && !defined(_RECEIVE_SHADOWS_OFF) inputData.shadowCoord = TransformWorldToShadowCoord(input.positionWS); #else inputData.shadowCoord = float4(0, 0, 0, 0); @@ -205,7 +232,7 @@ float4 frag(Varyings input) : SV_Target float4 color = UniversalFragmentPBR(inputData, surfaceData); ApplyRimLight(color.rgb, input.positionWS, viewDirWS, input.normalWS); color.rgb += _AmbientColor.rgb; - color.rgb = MixFog(color.rgb, inputData.fogCoord); + color.rgb = clamp(MixFog(color.rgb, inputData.fogCoord), 0, 1); return color; } diff --git a/Assets/Fur/Shaders/Fin/Lit.shader b/Assets/Fur/Shaders/Fin/Lit.shader index d141c86..146fe58 100644 --- a/Assets/Fur/Shaders/Fin/Lit.shader +++ b/Assets/Fur/Shaders/Fin/Lit.shader @@ -60,14 +60,15 @@ SubShader HLSLPROGRAM // URP - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile _ _SHADOWS_SOFT #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE // Unity + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON #pragma multi_compile _ DIRLIGHTMAP_COMBINED #pragma multi_compile _ LIGHTMAP_ON #pragma multi_compile_fog @@ -96,6 +97,8 @@ SubShader Cull Off HLSLPROGRAM + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON #pragma exclude_renderers gles gles3 glcore #pragma multi_compile_fog #pragma multi_compile _ DRAW_ORIG_POLYGON @@ -123,6 +126,8 @@ SubShader Cull Off HLSLPROGRAM + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON #pragma exclude_renderers gles gles3 glcore #pragma multi_compile_fog #pragma multi_compile _ DRAW_ORIG_POLYGON diff --git a/Assets/Fur/Shaders/Fin/LitTessellation.hlsl b/Assets/Fur/Shaders/Fin/LitTessellation.hlsl index 9d46743..d260ee7 100644 --- a/Assets/Fur/Shaders/Fin/LitTessellation.hlsl +++ b/Assets/Fur/Shaders/Fin/LitTessellation.hlsl @@ -26,6 +26,7 @@ struct HsConstantOutput [outputcontrolpoints(3)] Attributes hull(InputPatch input, uint id : SV_OutputControlPointID) { + UNITY_SETUP_INSTANCE_ID(input[id]); return input[id]; } @@ -76,7 +77,9 @@ Attributes domain( const OutputPatch i, float3 bary : SV_DomainLocation) { - Attributes o = (Attributes)0; + Attributes o; + UNITY_INITIALIZE_OUTPUT(Attributes, o); + UNITY_TRANSFER_INSTANCE_ID(i[0], o); float fU = bary.x; float fV = bary.y; diff --git a/Assets/Fur/Shaders/Fin/Shadow.hlsl b/Assets/Fur/Shaders/Fin/Shadow.hlsl index b32d3bf..e69c022 100644 --- a/Assets/Fur/Shaders/Fin/Shadow.hlsl +++ b/Assets/Fur/Shaders/Fin/Shadow.hlsl @@ -4,12 +4,23 @@ #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +#include "HLSLSupport.cginc" + +struct _Attributes +{ + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -18,11 +29,20 @@ struct Varyings float2 uv : TEXCOORD0; float fogCoord : TEXCOORD1; float2 finUv : TEXCOORD2; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +Attributes vert(_Attributes input) { - return input; + Attributes output; + UNITY_INITIALIZE_OUTPUT(Attributes, output); + //UNITY_SETUP_INSTANCE_ID(input); //Insert + //UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); //Insert + UNITY_TRANSFER_INSTANCE_ID(input, output); + output.positionOS = input.positionOS; + output.normalOS = input.normalOS; + output.uv = input.uv; + return output; } void AppendFinVertex( @@ -30,9 +50,12 @@ void AppendFinVertex( float2 uv, float3 posOS, float3 normalWS, - float2 finUv) + float2 finUv, + Attributes input0) { Varyings output; + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input0, output); #ifdef SHADOW_CASTER_PASS float3 posWS = TransformObjectToWorld(posOS); @@ -65,8 +88,8 @@ void AppendFinVertices( float uvXScale = length(uv0 - uv12) * _Density; float3 normalWS = TransformObjectToWorldNormal(normalOS); - AppendFinVertex(stream, uv0, posOS0, normalWS, float2(uvOffset, 0.0)); - AppendFinVertex(stream, uv12, posOS3, normalWS, float2(uvOffset + uvXScale, 0.0)); + AppendFinVertex(stream, uv0, posOS0, normalWS, float2(uvOffset, 0.0), input0); + AppendFinVertex(stream, uv12, posOS3, normalWS, float2(uvOffset + uvXScale, 0.0), input0); float3 posWS = TransformObjectToWorld(posOS0); float finStep = _FinLength / _FinJointNum; @@ -82,8 +105,8 @@ void AppendFinVertices( float3 moveOS = TransformWorldToObjectDir(moveWS, false); posOS0 += moveOS; posOS3 += moveOS; - AppendFinVertex(stream, uv0, posOS0, normalWS, float2(uvOffset, finFactor)); - AppendFinVertex(stream, uv12, posOS3, normalWS, float2(uvOffset + uvXScale, finFactor)); + AppendFinVertex(stream, uv0, posOS0, normalWS, float2(uvOffset, finFactor), input0); + AppendFinVertex(stream, uv12, posOS3, normalWS, float2(uvOffset + uvXScale, finFactor), input0); } stream.RestartStrip(); } diff --git a/Assets/Fur/Shaders/Fin/Unlit.hlsl b/Assets/Fur/Shaders/Fin/Unlit.hlsl index f272cf0..290d203 100644 --- a/Assets/Fur/Shaders/Fin/Unlit.hlsl +++ b/Assets/Fur/Shaders/Fin/Unlit.hlsl @@ -4,12 +4,23 @@ #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +#include "HLSLSupport.cginc" + +struct _Attributes +{ + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -18,21 +29,29 @@ struct Varyings float2 uv : TEXCOORD0; float fogCoord : TEXCOORD1; float2 finUv : TEXCOORD2; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +Attributes vert(_Attributes input) { - return input; + Attributes output; + UNITY_INITIALIZE_OUTPUT(Attributes, output); + UNITY_TRANSFER_INSTANCE_ID(input, output); + output.positionOS = input.positionOS; + output.normalOS = input.normalOS; + output.uv = input.uv; + return output; } void AppendFinVertex( inout TriangleStream stream, float2 uv, float3 posOS, - float2 finUv) + float2 finUv, + Attributes input0) { Varyings output; - + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input0, output); output.vertex = TransformObjectToHClip(posOS); output.uv = uv; output.fogCoord = ComputeFogFactor(output.vertex.z); @@ -46,7 +65,8 @@ void AppendFinVertices( Attributes input0, Attributes input1, Attributes input2, - float3 normalOS) + float3 normalOS, + Attributes inputvr) { float3 posOS0 = input0.positionOS.xyz; float3 lineOS01 = input1.positionOS.xyz - posOS0; @@ -58,8 +78,8 @@ void AppendFinVertices( float uvOffset = length(uv0); float uvXScale = length(uv0 - uv12) * _Density; - AppendFinVertex(stream, uv0, posOS0, float2(uvOffset, 0.0)); - AppendFinVertex(stream, uv12, posOS3, float2(uvOffset + uvXScale, 0.0)); + AppendFinVertex(stream, uv0, posOS0, float2(uvOffset, 0.0), inputvr); + AppendFinVertex(stream, uv12, posOS3, float2(uvOffset + uvXScale, 0.0), inputvr); float3 normalWS = TransformObjectToWorldNormal(normalOS); float3 posWS = TransformObjectToWorld(posOS0); @@ -76,8 +96,8 @@ void AppendFinVertices( float3 moveOS = TransformWorldToObjectDir(moveWS, false); posOS0 += moveOS; posOS3 += moveOS; - AppendFinVertex(stream, uv0, posOS0, float2(uvOffset, finFactor)); - AppendFinVertex(stream, uv12, posOS3, float2(uvOffset + uvXScale, finFactor)); + AppendFinVertex(stream, uv0, posOS0, float2(uvOffset, finFactor), inputvr); + AppendFinVertex(stream, uv12, posOS3, float2(uvOffset + uvXScale, finFactor), inputvr); } stream.RestartStrip(); } @@ -85,10 +105,13 @@ void AppendFinVertices( [maxvertexcount(75)] void geom(triangle Attributes input[3], inout TriangleStream stream) { + UNITY_SETUP_INSTANCE_ID(input[0]); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[0]); #ifdef DRAW_ORIG_POLYGON for (int i = 0; i < 3; ++i) { Varyings output; + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input[0], output); output.vertex = TransformObjectToHClip(input[i].positionOS.xyz); output.uv = TRANSFORM_TEX(input[i].uv, _BaseMap); output.fogCoord = ComputeFogFactor(output.vertex.z); @@ -110,10 +133,10 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) normalOS += rand3(input[0].uv) * _RandomDirection; normalOS = normalize(normalOS); - AppendFinVertices(stream, input[0], input[1], input[2], normalOS); + AppendFinVertices(stream, input[0], input[1], input[2], normalOS, input[0]); #ifdef APPEND_MORE_FINS - AppendFinVertices(stream, input[2], input[0], input[1], normalOS); - AppendFinVertices(stream, input[1], input[2], input[0], normalOS); + AppendFinVertices(stream, input[2], input[0], input[1], normalOS, input[0]); + AppendFinVertices(stream, input[1], input[2], input[0], normalOS, input[0]); #endif } @@ -126,7 +149,7 @@ float4 frag(Varyings input) : SV_Target color *= _BaseColor; color *= furColor; color.rgb *= lerp(1.0 - _Occlusion, 1.0, max(input.finUv.y, 0.0)); - color.rgb = MixFog(color.rgb, input.fogCoord); + color.rgb = clamp(MixFog(color.rgb, input.fogCoord), 0, 1); return color; } diff --git a/Assets/Fur/Shaders/Fin/UnlitTessellation.hlsl b/Assets/Fur/Shaders/Fin/UnlitTessellation.hlsl index 56594b3..5dfb089 100644 --- a/Assets/Fur/Shaders/Fin/UnlitTessellation.hlsl +++ b/Assets/Fur/Shaders/Fin/UnlitTessellation.hlsl @@ -1,6 +1,7 @@ #ifndef FUR_FIN_UNLIT_TESSELLATION_HLSL #define FUR_FIN_UNLIT_TESSELLATION_HLSL +#include "HLSLSupport.cginc" #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" @@ -28,6 +29,7 @@ struct HsConstantOutput [outputcontrolpoints(3)] Attributes hull(InputPatch input, uint id : SV_OutputControlPointID) { + UNITY_SETUP_INSTANCE_ID(input[id]); return input[id]; } @@ -78,7 +80,9 @@ Attributes domain( const OutputPatch i, float3 bary : SV_DomainLocation) { - Attributes o = (Attributes)0; + Attributes o; + UNITY_INITIALIZE_OUTPUT(Attributes, o); + UNITY_TRANSFER_INSTANCE_ID(i[0], o); float fU = bary.x; float fV = bary.y; diff --git a/Assets/Fur/Shaders/Geometry/Lit.shader b/Assets/Fur/Shaders/Geometry/Lit.shader index ff7fff4..f8df219 100644 --- a/Assets/Fur/Shaders/Geometry/Lit.shader +++ b/Assets/Fur/Shaders/Geometry/Lit.shader @@ -62,8 +62,7 @@ SubShader HLSLPROGRAM // URP - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile _ _SHADOWS_SOFT diff --git a/Assets/Fur/Shaders/Geometry/Unlit.hlsl b/Assets/Fur/Shaders/Geometry/Unlit.hlsl index 7b43fa4..ecca5b6 100644 --- a/Assets/Fur/Shaders/Geometry/Unlit.hlsl +++ b/Assets/Fur/Shaders/Geometry/Unlit.hlsl @@ -4,12 +4,23 @@ #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +#include "HLSLSupport.cginc" + +struct _Attributes +{ + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; struct Attributes { float4 positionOS : POSITION; float3 normalOS : NORMAL; float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -18,16 +29,24 @@ struct Varyings float2 uv : TEXCOORD0; float fogCoord : TEXCOORD1; float factor : TEXCOORD2; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +Attributes vert(_Attributes input) { - return input; + Attributes output; + UNITY_INITIALIZE_OUTPUT(Attributes, output); + UNITY_TRANSFER_INSTANCE_ID(input, output); + output.positionOS = input.positionOS; + output.normalOS = input.normalOS; + output.uv = input.uv; + return output; } -void AppendVertex(inout TriangleStream stream, float3 posOS, float2 uv, float factor) +void AppendVertex(inout TriangleStream stream, float3 posOS, float2 uv, float factor, Attributes input0) { Varyings output; + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input0, output); output.vertex = TransformObjectToHClip(posOS); output.uv = TRANSFORM_TEX(uv, _BaseMap); output.fogCoord = ComputeFogFactor(output.vertex.z); @@ -38,6 +57,8 @@ void AppendVertex(inout TriangleStream stream, float3 posOS, float2 uv [maxvertexcount(53)] void geom(triangle Attributes input[3], inout TriangleStream stream) { + UNITY_SETUP_INSTANCE_ID(input[0]); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[0]); float3 startPos0OS = input[0].positionOS.xyz; float3 startPos1OS = input[1].positionOS.xyz; float3 startPos2OS = input[2].positionOS.xyz; @@ -90,14 +111,14 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) float2 nextUv1 = prevUv1 + uvInterp1 * delta; float2 nextUv2 = prevUv2 + uvInterp2 * delta; - AppendVertex(stream, nextPos0OS, nextUv0, nextFactor); - AppendVertex(stream, prevPos0OS, prevUv0, prevFactor); - AppendVertex(stream, nextPos1OS, nextUv1, nextFactor); - AppendVertex(stream, prevPos1OS, prevUv1, prevFactor); - AppendVertex(stream, nextPos2OS, nextUv2, nextFactor); - AppendVertex(stream, prevPos2OS, prevUv2, prevFactor); - AppendVertex(stream, nextPos0OS, nextUv0, nextFactor); - AppendVertex(stream, prevPos0OS, prevUv0, prevFactor); + AppendVertex(stream, nextPos0OS, nextUv0, nextFactor, input[0]); + AppendVertex(stream, prevPos0OS, prevUv0, prevFactor, input[0]); + AppendVertex(stream, nextPos1OS, nextUv1, nextFactor, input[0]); + AppendVertex(stream, prevPos1OS, prevUv1, prevFactor, input[0]); + AppendVertex(stream, nextPos2OS, nextUv2, nextFactor, input[0]); + AppendVertex(stream, prevPos2OS, prevUv2, prevFactor, input[0]); + AppendVertex(stream, nextPos0OS, nextUv0, nextFactor, input[0]); + AppendVertex(stream, prevPos0OS, prevUv0, prevFactor, input[0]); prevFactor = nextFactor; @@ -112,11 +133,11 @@ void geom(triangle Attributes input[3], inout TriangleStream stream) stream.RestartStrip(); } - AppendVertex(stream, prevPos0OS, prevUv0, prevFactor); - AppendVertex(stream, prevPos1OS, prevUv1, prevFactor); - AppendVertex(stream, topMovedPosOS, topUv, 1.0); - AppendVertex(stream, prevPos2OS, prevUv2, prevFactor); - AppendVertex(stream, prevPos0OS, prevUv0, prevFactor); + AppendVertex(stream, prevPos0OS, prevUv0, prevFactor, input[0]); + AppendVertex(stream, prevPos1OS, prevUv1, prevFactor, input[0]); + AppendVertex(stream, topMovedPosOS, topUv, 1.0, input[0]); + AppendVertex(stream, prevPos2OS, prevUv2, prevFactor, input[0]); + AppendVertex(stream, prevPos0OS, prevUv0, prevFactor, input[0]); stream.RestartStrip(); } @@ -125,7 +146,7 @@ float4 frag(Varyings input) : SV_Target float4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv); color *= _BaseColor; color *= lerp(1.0 - _Occlusion, 1.0, input.factor); - color.rgb = MixFog(color.rgb, input.fogCoord); + color.rgb = clamp(MixFog(color.rgb, input.fogCoord), 0, 1); return color; } diff --git a/Assets/Fur/Shaders/Geometry/UnlitTessellation.hlsl b/Assets/Fur/Shaders/Geometry/UnlitTessellation.hlsl index 46a661c..7cd877e 100644 --- a/Assets/Fur/Shaders/Geometry/UnlitTessellation.hlsl +++ b/Assets/Fur/Shaders/Geometry/UnlitTessellation.hlsl @@ -2,6 +2,7 @@ #define FUR_FIN_UNLIT_TESSELLATION_HLSL #include "./Param.hlsl" +#include "HLSLSupport.cginc" struct HsConstantOutput { @@ -26,6 +27,7 @@ struct HsConstantOutput [outputcontrolpoints(3)] Attributes hull(InputPatch input, uint id : SV_OutputControlPointID) { + UNITY_SETUP_INSTANCE_ID(input[id]); return input[id]; } @@ -76,7 +78,9 @@ Attributes domain( const OutputPatch i, float3 bary : SV_DomainLocation) { - Attributes o = (Attributes)0; + Attributes o; + UNITY_INITIALIZE_OUTPUT(Attributes, o); + UNITY_TRANSFER_INSTANCE_ID(i[0], o); float fU = bary.x; float fV = bary.y; diff --git a/Assets/Fur/Shaders/Shell/Lit.hlsl b/Assets/Fur/Shaders/Shell/Lit.hlsl index 5a988c0..84a759f 100644 --- a/Assets/Fur/Shaders/Shell/Lit.hlsl +++ b/Assets/Fur/Shaders/Shell/Lit.hlsl @@ -1,6 +1,7 @@ #ifndef FUR_SHELL_LIT_HLSL #define FUR_SHELL_LIT_HLSL +#include "HLSLSupport.cginc" #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl" #include "./Param.hlsl" @@ -16,6 +17,17 @@ struct Attributes UNITY_VERTEX_INPUT_INSTANCE_ID }; +struct v2f +{ + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float2 texcoord : TEXCOORD0; + float2 lightmapUV : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO +}; + struct Varyings { float4 positionCS : SV_POSITION; @@ -26,16 +38,26 @@ struct Varyings DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 5); float4 fogFactorAndVertexLight : TEXCOORD6; // x: fogFactor, yzw: vertex light float layer : TEXCOORD7; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +v2f vert(Attributes input) { - return input; + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f, o); + UNITY_TRANSFER_INSTANCE_ID(input, o); + o.positionOS = input.positionOS; + o.normalOS = input.normalOS; + o.tangentOS = input.tangentOS; + o.lightmapUV = input.lightmapUV; + o.texcoord = input.texcoord; + return o; } -void AppendShellVertex(inout TriangleStream stream, Attributes input, int index) +void AppendShellVertex(inout TriangleStream stream, v2f input, int index) { Varyings output = (Varyings)0; + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS); @@ -66,8 +88,9 @@ void AppendShellVertex(inout TriangleStream stream, Attributes input, } [maxvertexcount(42)] -void geom(triangle Attributes input[3], inout TriangleStream stream) +void geom(triangle v2f input[3], inout TriangleStream stream) { + UNITY_SETUP_INSTANCE_ID(input[0]); [loop] for (float i = 0; i < _ShellAmount; ++i) { [unroll] for (float j = 0; j < 3; ++j) @@ -108,7 +131,7 @@ float4 frag(Varyings input) : SV_Target inputData.positionWS = input.positionWS; inputData.normalWS = normalWS; inputData.viewDirectionWS = viewDirWS; -#if defined(_MAIN_LIGHT_SHADOWS) && !defined(_RECEIVE_SHADOWS_OFF) +#if (defined(_MAIN_LIGHT_SHADOWS) || defined(_MAIN_LIGHT_SHADOWS_CASCADE) || defined(_MAIN_LIGHT_SHADOWS_SCREEN)) && !defined(_RECEIVE_SHADOWS_OFF) inputData.shadowCoord = TransformWorldToShadowCoord(input.positionWS); #else inputData.shadowCoord = float4(0, 0, 0, 0); @@ -117,11 +140,14 @@ float4 frag(Varyings input) : SV_Target inputData.vertexLighting = input.fogFactorAndVertexLight.yzw; inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, normalWS); + Light mainLight = GetMainLight(TransformWorldToShadowCoord(input.positionWS)); + float shadow = mainLight.distanceAttenuation * mainLight.shadowAttenuation; float4 color = UniversalFragmentPBR(inputData, surfaceData); + color.rgb *= shadow; ApplyRimLight(color.rgb, input.positionWS, viewDirWS, normalWS); color.rgb += _AmbientColor; - color.rgb = MixFog(color.rgb, inputData.fogCoord); + color.rgb = clamp(MixFog(color.rgb, inputData.fogCoord), 0, 1); return color; } diff --git a/Assets/Fur/Shaders/Shell/Lit.shader b/Assets/Fur/Shaders/Shell/Lit.shader index 5411b5b..219d783 100644 --- a/Assets/Fur/Shaders/Shell/Lit.shader +++ b/Assets/Fur/Shaders/Shell/Lit.shader @@ -1,115 +1,116 @@ -Shader "Fur/Shell/Lit" -{ - -Properties -{ - [Header(Basic)][Space] - [MainColor] _BaseColor("Color", Color) = (0.5, 0.5, 0.5, 1) - _AmbientColor("Ambient Color", Color) = (0.0, 0.0, 0.0, 1) - _BaseMap("Albedo", 2D) = "white" {} - [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.5 - _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5 - - [Header(Fur)][Space] - _FurMap("Fur", 2D) = "white" {} - [Normal] _NormalMap("Normal", 2D) = "bump" {} - _NormalScale("Normal Scale", Range(0.0, 2.0)) = 1.0 - [IntRange] _ShellAmount("Shell Amount", Range(1, 14)) = 14 - _ShellStep("Shell Step", Range(0.0, 0.01)) = 0.001 - _AlphaCutout("Alpha Cutout", Range(0.0, 1.0)) = 0.2 - _FurScale("Fur Scale", Range(0.0, 10.0)) = 1.0 - _Occlusion("Occlusion", Range(0.0, 1.0)) = 0.5 - _BaseMove("Base Move", Vector) = (0.0, -0.0, 0.0, 3.0) - _WindFreq("Wind Freq", Vector) = (0.5, 0.7, 0.9, 1.0) - _WindMove("Wind Move", Vector) = (0.2, 0.3, 0.2, 1.0) - - [Header(Lighting)][Space] - _RimLightPower("Rim Light Power", Range(1.0, 20.0)) = 6.0 - _RimLightIntensity("Rim Light Intensity", Range(0.0, 1.0)) = 0.5 - _ShadowExtraBias("Shadow Extra Bias", Range(-1.0, 1.0)) = 0.0 -} - -SubShader -{ - Tags - { - "RenderType" = "Opaque" - "RenderPipeline" = "UniversalPipeline" - "UniversalMaterialType" = "Lit" - "IgnoreProjector" = "True" - } - - LOD 100 - - ZWrite On - Cull Back - - Pass - { - Name "ForwardLit" - Tags { "LightMode" = "UniversalForward" } - - HLSLPROGRAM - // URP のキーワード - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS - #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE - #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS - #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS - #pragma multi_compile _ _SHADOWS_SOFT - #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE - - // Unity のキーワード - #pragma multi_compile _ DIRLIGHTMAP_COMBINED - #pragma multi_compile _ LIGHTMAP_ON - #pragma multi_compile_fog - - #pragma prefer_hlslcc gles - #pragma exclude_renderers d3d11_9x - #pragma target 2.0 - #pragma vertex vert - #pragma require geometry - #pragma geometry geom - #pragma fragment frag - #include "./Lit.hlsl" - ENDHLSL - } - - Pass - { - Name "DepthOnly" - Tags { "LightMode" = "DepthOnly" } - - ZWrite On - ColorMask 0 - - HLSLPROGRAM - #pragma exclude_renderers gles gles3 glcore - #pragma vertex vert - #pragma require geometry - #pragma geometry geom - #pragma fragment frag - #include "./Depth.hlsl" - ENDHLSL - } - - Pass - { - Name "ShadowCaster" - Tags { "LightMode" = "ShadowCaster" } - - ZWrite On - ZTest LEqual - ColorMask 0 - - HLSLPROGRAM - #pragma exclude_renderers gles gles3 glcore - #pragma vertex vert - #pragma require geometry - #pragma geometry geom - #pragma fragment frag - #include "./Shadow.hlsl" - ENDHLSL - } -} - -} +Shader "Fur/Shell/Lit" +{ + +Properties +{ + [Header(Basic)][Space] + [MainColor] _BaseColor("Color", Color) = (0.5, 0.5, 0.5, 1) + _AmbientColor("Ambient Color", Color) = (0.0, 0.0, 0.0, 1) + _BaseMap("Albedo", 2D) = "white" {} + [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.5 + _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5 + + [Header(Fur)][Space] + _FurMap("Fur", 2D) = "white" {} + [Normal] _NormalMap("Normal", 2D) = "bump" {} + _NormalScale("Normal Scale", Range(0.0, 2.0)) = 1.0 + [IntRange] _ShellAmount("Shell Amount", Range(1, 14)) = 14 + _ShellStep("Shell Step", Range(0.0, 0.01)) = 0.001 + _AlphaCutout("Alpha Cutout", Range(0.0, 1.0)) = 0.2 + _FurScale("Fur Scale", Range(0.0, 10.0)) = 1.0 + _Occlusion("Occlusion", Range(0.0, 1.0)) = 0.5 + _BaseMove("Base Move", Vector) = (0.0, -0.0, 0.0, 3.0) + _WindFreq("Wind Freq", Vector) = (0.5, 0.7, 0.9, 1.0) + _WindMove("Wind Move", Vector) = (0.2, 0.3, 0.2, 1.0) + + [Header(Lighting)][Space] + _RimLightPower("Rim Light Power", Range(1.0, 20.0)) = 6.0 + _RimLightIntensity("Rim Light Intensity", Range(0.0, 1.0)) = 0.5 + _ShadowExtraBias("Shadow Extra Bias", Range(-1.0, 1.0)) = 0.0 +} + +SubShader +{ + Tags + { + "RenderType" = "Opaque" + "RenderPipeline" = "UniversalPipeline" + "UniversalMaterialType" = "Lit" + "IgnoreProjector" = "True" + } + + LOD 100 + + ZWrite On + Cull Back + + Pass + { + Name "ForwardLit" + Tags { "LightMode" = "UniversalForward" } + + HLSLPROGRAM + // URP のキーワード + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN + #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS + #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS + #pragma multi_compile _ _SHADOWS_SOFT + #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE + + // Unity のキーワード + #pragma multi_compile_instancing + #pragma multi_compile _ DOTS_INSTANCING_ON + #pragma multi_compile _ DIRLIGHTMAP_COMBINED + #pragma multi_compile _ LIGHTMAP_ON + #pragma multi_compile_fog + + #pragma prefer_hlslcc gles + #pragma exclude_renderers d3d11_9x + #pragma target 2.0 + #pragma vertex vert + #pragma require geometry + #pragma geometry geom + #pragma fragment frag + #include "./Lit.hlsl" + ENDHLSL + } + + Pass + { + Name "DepthOnly" + Tags { "LightMode" = "DepthOnly" } + + ZWrite On + ColorMask 0 + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma vertex vert + #pragma require geometry + #pragma geometry geom + #pragma fragment frag + #include "./Depth.hlsl" + ENDHLSL + } + + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + + ZWrite On + ZTest LEqual + ColorMask 0 + + HLSLPROGRAM + #pragma exclude_renderers gles gles3 glcore + #pragma vertex vert + #pragma require geometry + #pragma geometry geom + #pragma fragment frag + #include "./Shadow.hlsl" + ENDHLSL + } +} + +} diff --git a/Assets/Fur/Shaders/Shell/Unlit.hlsl b/Assets/Fur/Shaders/Shell/Unlit.hlsl index b6cd108..146099b 100644 --- a/Assets/Fur/Shaders/Shell/Unlit.hlsl +++ b/Assets/Fur/Shaders/Shell/Unlit.hlsl @@ -4,6 +4,16 @@ #include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl" #include "./Param.hlsl" #include "../Common/Common.hlsl" +#include "HLSLSupport.cginc" + +struct _Attributes +{ + float4 positionOS : POSITION; + float3 normalOS : NORMAL; + float4 tangentOS : TANGENT; + float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; struct Attributes { @@ -11,6 +21,8 @@ struct Attributes float3 normalOS : NORMAL; float4 tangentOS : TANGENT; float2 uv : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO }; struct Varyings @@ -19,16 +31,25 @@ struct Varyings float2 uv : TEXCOORD0; float fogCoord : TEXCOORD1; float layer : TEXCOORD2; + UNITY_VERTEX_OUTPUT_STEREO }; -Attributes vert(Attributes input) +Attributes vert(_Attributes input) { - return input; + Attributes output; + UNITY_INITIALIZE_OUTPUT(Attributes, output); + UNITY_TRANSFER_INSTANCE_ID(input, output); + output.positionOS = input.positionOS; + output.normalOS = input.normalOS; + output.uv = input.uv; + output.tangentOS = input.tangentOS; + return output; } -void AppendShellVertex(inout TriangleStream stream, Attributes input, int index) +void AppendShellVertex(inout TriangleStream stream, Attributes input, int index, Attributes input0) { Varyings output = (Varyings)0; + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(input0, output); VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz); VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS); @@ -58,14 +79,16 @@ void AppendShellVertex(inout TriangleStream stream, Attributes input, stream.Append(output); } -[maxvertexcount(128)] +[maxvertexcount(53)] void geom(triangle Attributes input[3], inout TriangleStream stream) { + UNITY_SETUP_INSTANCE_ID(input[0]); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(input[0]); [loop] for (float i = 0; i < _ShellAmount; ++i) { [unroll] for (float j = 0; j < 3; ++j) { - AppendShellVertex(stream, input[j], i); + AppendShellVertex(stream, input[j], i, input[0]); } stream.RestartStrip(); } @@ -80,7 +103,7 @@ float4 frag(Varyings input) : SV_Target float4 baseColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv); float occlusion = lerp(1.0 - _Occlusion, 1.0, input.layer); float3 color = baseColor.xyz * occlusion; - color = MixFog(color, input.fogCoord); + color = clamp(MixFog(color, input.fogCoord), 0, 1); return float4(color, alpha); } From c38fe8de918ff5f5db76e7d910b640b7f0772ba3 Mon Sep 17 00:00:00 2001 From: chris_dibbern Date: Tue, 26 Apr 2022 18:27:02 -0500 Subject: [PATCH 4/5] Removing erroneous shadow code from Shell/Lit.hlsl --- Assets/Fur/Shaders/Shell/Lit.hlsl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Assets/Fur/Shaders/Shell/Lit.hlsl b/Assets/Fur/Shaders/Shell/Lit.hlsl index 84a759f..f4fca88 100644 --- a/Assets/Fur/Shaders/Shell/Lit.hlsl +++ b/Assets/Fur/Shaders/Shell/Lit.hlsl @@ -140,11 +140,7 @@ float4 frag(Varyings input) : SV_Target inputData.vertexLighting = input.fogFactorAndVertexLight.yzw; inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, normalWS); - Light mainLight = GetMainLight(TransformWorldToShadowCoord(input.positionWS)); - float shadow = mainLight.distanceAttenuation * mainLight.shadowAttenuation; float4 color = UniversalFragmentPBR(inputData, surfaceData); - - color.rgb *= shadow; ApplyRimLight(color.rgb, input.positionWS, viewDirWS, normalWS); color.rgb += _AmbientColor; color.rgb = clamp(MixFog(color.rgb, inputData.fogCoord), 0, 1); From b113ef27627a4f1069d1b4a444b584ff3f5ed236 Mon Sep 17 00:00:00 2001 From: chris_dibbern Date: Wed, 27 Apr 2022 19:19:32 -0500 Subject: [PATCH 5/5] Making light config version-dependent --- Assets/Fur/Shaders/Fin/Lit.shader | 5 +++++ Assets/Fur/Shaders/Geometry/Lit.shader | 5 +++++ Assets/Fur/Shaders/Shell/Lit.shader | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/Assets/Fur/Shaders/Fin/Lit.shader b/Assets/Fur/Shaders/Fin/Lit.shader index 146fe58..f994995 100644 --- a/Assets/Fur/Shaders/Fin/Lit.shader +++ b/Assets/Fur/Shaders/Fin/Lit.shader @@ -60,7 +60,12 @@ SubShader HLSLPROGRAM // URP +#if (UNITY_VERSION >= 202111) #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN +#else + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE +#endif #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile _ _SHADOWS_SOFT diff --git a/Assets/Fur/Shaders/Geometry/Lit.shader b/Assets/Fur/Shaders/Geometry/Lit.shader index f8df219..7fd67cd 100644 --- a/Assets/Fur/Shaders/Geometry/Lit.shader +++ b/Assets/Fur/Shaders/Geometry/Lit.shader @@ -62,7 +62,12 @@ SubShader HLSLPROGRAM // URP +#if (UNITY_VERSION >= 202111) #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN +#else + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE +#endif #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile _ _SHADOWS_SOFT diff --git a/Assets/Fur/Shaders/Shell/Lit.shader b/Assets/Fur/Shaders/Shell/Lit.shader index 219d783..2f1b4ed 100644 --- a/Assets/Fur/Shaders/Shell/Lit.shader +++ b/Assets/Fur/Shaders/Shell/Lit.shader @@ -51,7 +51,12 @@ SubShader HLSLPROGRAM // URP のキーワード +#if (UNITY_VERSION >= 202111) #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN +#else + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS + #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE +#endif #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS #pragma multi_compile _ _SHADOWS_SOFT