Spine-SkeletonLit-ForwardPass-URP.hlsl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #ifndef SKELETONLIT_FORWARD_PASS_URP_INCLUDED
  2. #define SKELETONLIT_FORWARD_PASS_URP_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl"
  4. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  5. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  6. #include "SpineCoreShaders/Spine-Common.cginc"
  7. #if (defined(_MAIN_LIGHT_SHADOWS) || defined(MAIN_LIGHT_CALCULATE_SHADOWS)) && !defined(_RECEIVE_SHADOWS_OFF)
  8. #define SKELETONLIT_RECEIVE_SHADOWS
  9. #endif
  10. struct appdata {
  11. float3 pos : POSITION;
  12. float3 normal : NORMAL;
  13. half4 color : COLOR;
  14. float2 uv0 : TEXCOORD0;
  15. UNITY_VERTEX_INPUT_INSTANCE_ID
  16. };
  17. struct VertexOutput {
  18. half4 color : COLOR0;
  19. float2 uv0 : TEXCOORD0;
  20. float4 pos : SV_POSITION;
  21. half4 mainColor:TEXCOORD3;
  22. #if defined(SKELETONLIT_RECEIVE_SHADOWS)
  23. float4 shadowCoord : TEXCOORD1;
  24. half3 shadowedColor : TEXCOORD2;
  25. #endif
  26. UNITY_VERTEX_OUTPUT_STEREO
  27. };
  28. half3 LightweightLightVertexSimplified(float3 positionWS, half3 normalWS, out half3 shadowedColor) {
  29. Light mainLight = GetMainLight();
  30. half3 attenuatedLightColor = mainLight.color * (mainLight.distanceAttenuation * mainLight.shadowAttenuation);
  31. half3 mainLightColor = LightingLambert(attenuatedLightColor, mainLight.direction, normalWS);
  32. half3 additionalLightColor = half3(0, 0, 0);
  33. // Note: we don't add any lighting in the fragment shader, thus we include both variants below
  34. #if defined(_ADDITIONAL_LIGHTS) || defined(_ADDITIONAL_LIGHTS_VERTEX)
  35. for (int i = 0; i < GetAdditionalLightsCount(); ++i)
  36. {
  37. Light light = GetAdditionalLight(i, positionWS);
  38. half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);
  39. additionalLightColor += LightingLambert(attenuatedLightColor, light.direction, normalWS);
  40. }
  41. #endif
  42. shadowedColor = additionalLightColor;
  43. return mainLightColor + additionalLightColor;
  44. }
  45. VertexOutput vert(appdata v) {
  46. VertexOutput o;
  47. UNITY_SETUP_INSTANCE_ID(v);
  48. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  49. half4 color = PMAGammaToTargetSpace(v.color);
  50. float3 positionWS = TransformObjectToWorld(v.pos);
  51. half3 fixedNormal = half3(0, 0, -1);
  52. half3 normalWS = normalize(mul((float3x3)unity_ObjectToWorld, fixedNormal));
  53. o.uv0 = v.uv0;
  54. o.pos = TransformWorldToHClip(positionWS);
  55. #ifdef _DOUBLE_SIDED_LIGHTING
  56. // unfortunately we have to compute the sign here in the vertex shader
  57. // instead of using VFACE in fragment shader stage.
  58. half3 viewDirWS = UNITY_MATRIX_V[2].xyz;
  59. half faceSign = sign(dot(viewDirWS, normalWS));
  60. normalWS *= faceSign;
  61. #endif
  62. half3 shadowedColor;
  63. #if !defined(_LIGHT_AFFECTS_ADDITIVE)
  64. if (color.a == 0) {
  65. o.color = color;
  66. #if defined(SKELETONLIT_RECEIVE_SHADOWS)
  67. o.shadowedColor = color;
  68. o.shadowCoord = float4(0, 0, 0, 0);
  69. #endif
  70. return o;
  71. }
  72. #endif // !defined(_LIGHT_AFFECTS_ADDITIVE)
  73. color.rgb *= LightweightLightVertexSimplified(positionWS, normalWS, shadowedColor);
  74. #if defined(SKELETONLIT_RECEIVE_SHADOWS)
  75. o.shadowedColor = shadowedColor;
  76. #endif
  77. // Note: ambient light is also handled via SH.
  78. half3 vertexSH;
  79. OUTPUT_SH(normalWS.xyz, vertexSH);
  80. color.rgb += SAMPLE_GI(input.lightmapUV, vertexSH, normalWS);
  81. o.color = color;
  82. #if defined(SKELETONLIT_RECEIVE_SHADOWS)
  83. VertexPositionInputs vertexInput;
  84. vertexInput.positionWS = positionWS;
  85. vertexInput.positionCS = o.pos;
  86. o.shadowCoord = GetShadowCoord(vertexInput);
  87. #endif
  88. return o;
  89. }
  90. half4 frag(VertexOutput i) : SV_Target{
  91. half4 tex = tex2D(_MainTex, i.uv0);
  92. #if defined(_STRAIGHT_ALPHA_INPUT)
  93. tex.rgb *= tex.a;
  94. #endif
  95. if (i.color.a == 0)
  96. return tex * i.color;
  97. #if defined(SKELETONLIT_RECEIVE_SHADOWS)
  98. half shadowAttenuation = MainLightRealtimeShadow(i.shadowCoord);
  99. i.color.rgb = lerp(i.shadowedColor, i.color.rgb, shadowAttenuation);
  100. #endif
  101. return tex * i.color;
  102. }
  103. #endif