Spine-Sprite-ForwardPass-URP.hlsl 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #ifndef VERTEX_LIT_FORWARD_PASS_URP_INCLUDED
  2. #define VERTEX_LIT_FORWARD_PASS_URP_INCLUDED
  3. #include "Include/Spine-Sprite-Common-URP.hlsl"
  4. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  5. #include "SpineCoreShaders/SpriteLighting.cginc"
  6. #include "SpineCoreShaders/Spine-Common.cginc"
  7. #if defined(_RIM_LIGHTING) || defined(_ADDITIONAL_LIGHTS) || defined(MAIN_LIGHT_CALCULATE_SHADOWS)
  8. #define NEEDS_POSITION_WS
  9. #endif
  10. ////////////////////////////////////////
  11. // Vertex output struct
  12. //
  13. struct VertexOutputLWRP
  14. {
  15. float4 pos : SV_POSITION;
  16. fixed4 vertexColor : COLOR;
  17. float3 texcoord : TEXCOORD0;
  18. half4 fogFactorAndVertexLight : TEXCOORD1;
  19. half3 viewDirectionWS : TEXCOORD2;
  20. DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 3);
  21. #if defined(_NORMALMAP)
  22. half4 normalWorld : TEXCOORD4;
  23. half4 tangentWorld : TEXCOORD5;
  24. half4 binormalWorld : TEXCOORD6;
  25. #else
  26. half3 normalWorld : TEXCOORD4;
  27. #endif
  28. #if (defined(_MAIN_LIGHT_SHADOWS) || defined(MAIN_LIGHT_CALCULATE_SHADOWS)) && !defined(_RECEIVE_SHADOWS_OFF)
  29. float4 shadowCoord : TEXCOORD7;
  30. #endif
  31. #if defined(NEEDS_POSITION_WS)
  32. float4 positionWS : TEXCOORD8;
  33. #endif
  34. UNITY_VERTEX_OUTPUT_STEREO
  35. };
  36. ///////////////////////////////////////////////////////////////////////////////
  37. // Vertex and Fragment functions //
  38. ///////////////////////////////////////////////////////////////////////////////
  39. half3 LightweightLightVertexSimplified(float3 positionWS, half3 normalWS) {
  40. #ifdef _MAIN_LIGHT_VERTEX
  41. Light mainLight = GetMainLight();
  42. half3 attenuatedLightColor = mainLight.color * (mainLight.distanceAttenuation * mainLight.shadowAttenuation);
  43. half3 diffuseLightColor = LightingLambert(attenuatedLightColor, mainLight.direction, normalWS);
  44. #else
  45. half3 diffuseLightColor = half3(0, 0, 0);
  46. #endif
  47. #ifdef _ADDITIONAL_LIGHTS_VERTEX
  48. int pixelLightCount = GetAdditionalLightsCount();
  49. for (int i = 0; i < pixelLightCount; ++i)
  50. {
  51. Light light = GetAdditionalLight(i, positionWS);
  52. half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);
  53. diffuseLightColor += LightingLambert(attenuatedLightColor, light.direction, normalWS);
  54. }
  55. #endif // _ADDITIONAL_LIGHTS_VERTEX
  56. return diffuseLightColor;
  57. }
  58. #ifdef _DIFFUSE_RAMP
  59. half3 LightingLambertRamped(half3 lightColor, float attenuation, half3 lightDir, half3 normal)
  60. {
  61. half angleDot = max(0, dot(lightDir, normal));
  62. return calculateRampedDiffuse(lightColor, attenuation, angleDot);
  63. }
  64. #endif
  65. #if defined(SPECULAR)
  66. half4 LightweightFragmentPBRSimplified(InputData inputData, half4 texAlbedoAlpha, half metallic, half3 specular,
  67. half smoothness, half3 emission, half4 vertexColor)
  68. {
  69. half4 albedo = texAlbedoAlpha * vertexColor;
  70. BRDFData brdfData;
  71. half ignoredAlpha = 1; // ignore alpha, otherwise
  72. InitializeBRDFData(albedo.rgb, metallic, specular, smoothness, ignoredAlpha, brdfData);
  73. brdfData.specular *= albedo.a;
  74. #ifndef _MAIN_LIGHT_VERTEX
  75. #if (defined(_MAIN_LIGHT_SHADOWS) || defined(MAIN_LIGHT_CALCULATE_SHADOWS)) && !defined(_RECEIVE_SHADOWS_OFF)
  76. Light mainLight = GetMainLight(inputData.shadowCoord);
  77. #else
  78. Light mainLight = GetMainLight();
  79. #endif
  80. half3 finalColor = inputData.bakedGI;
  81. finalColor += LightingPhysicallyBased(brdfData, mainLight, inputData.normalWS, inputData.viewDirectionWS);
  82. #else // _MAIN_LIGHT_VERTEX
  83. half3 finalColor = inputData.bakedGI;
  84. #endif // _MAIN_LIGHT_VERTEX
  85. #ifdef _ADDITIONAL_LIGHTS
  86. int pixelLightCount = GetAdditionalLightsCount();
  87. for (int i = 0; i < pixelLightCount; ++i)
  88. {
  89. Light light = GetAdditionalLight(i, inputData.positionWS);
  90. finalColor += LightingPhysicallyBased(brdfData, light, inputData.normalWS, inputData.viewDirectionWS);
  91. }
  92. #endif
  93. #ifdef _ADDITIONAL_LIGHTS_VERTEX
  94. finalColor += inputData.vertexLighting * brdfData.diffuse;
  95. #endif
  96. finalColor += emission;
  97. return prepareLitPixelForOutput(half4(finalColor, albedo.a), texAlbedoAlpha.a, vertexColor.a);
  98. }
  99. #else // !SPECULAR
  100. half4 LightweightFragmentBlinnPhongSimplified(InputData inputData, half4 texDiffuseAlpha, half3 emission, half4 vertexColor)
  101. {
  102. half4 diffuse = texDiffuseAlpha * vertexColor;
  103. #ifndef _MAIN_LIGHT_VERTEX
  104. #if (defined(_MAIN_LIGHT_SHADOWS) || defined(MAIN_LIGHT_CALCULATE_SHADOWS)) && !defined(_RECEIVE_SHADOWS_OFF)
  105. Light mainLight = GetMainLight(inputData.shadowCoord);
  106. #else
  107. Light mainLight = GetMainLight();
  108. #endif
  109. half3 diffuseLighting = inputData.bakedGI;
  110. half3 attenuation = mainLight.distanceAttenuation* mainLight.shadowAttenuation;
  111. half3 attenuatedLightColor = mainLight.color * attenuation;
  112. #ifndef _DIFFUSE_RAMP
  113. diffuseLighting += LightingLambert(attenuatedLightColor, mainLight.direction, inputData.normalWS);
  114. #else
  115. diffuseLighting += LightingLambertRamped(mainLight.color, attenuation, mainLight.direction, inputData.normalWS);
  116. #endif
  117. #else // _MAIN_LIGHT_VERTEX
  118. half3 diffuseLighting = inputData.bakedGI;
  119. #endif // _MAIN_LIGHT_VERTEX
  120. #ifdef _ADDITIONAL_LIGHTS
  121. int pixelLightCount = GetAdditionalLightsCount();
  122. for (int i = 0; i < pixelLightCount; ++i)
  123. {
  124. Light light = GetAdditionalLight(i, inputData.positionWS);
  125. half3 attenuation = (light.distanceAttenuation * light.shadowAttenuation);
  126. half3 attenuatedLightColor = light.color * attenuation;
  127. #ifndef _DIFFUSE_RAMP
  128. diffuseLighting += LightingLambert(attenuatedLightColor, light.direction, inputData.normalWS);
  129. #else
  130. diffuseLighting += LightingLambertRamped(light.color, attenuation, light.direction, inputData.normalWS);
  131. #endif
  132. }
  133. #endif
  134. #ifdef _ADDITIONAL_LIGHTS_VERTEX
  135. diffuseLighting += inputData.vertexLighting;
  136. #endif
  137. diffuseLighting += emission;
  138. //half3 finalColor = diffuseLighting * diffuse + emission;
  139. half3 finalColor = diffuseLighting * diffuse.rgb;
  140. return prepareLitPixelForOutput(half4(finalColor, diffuse.a), texDiffuseAlpha.a, vertexColor.a);
  141. }
  142. #endif // SPECULAR
  143. VertexOutputLWRP ForwardPassVertexSprite(VertexInput input)
  144. {
  145. VertexOutputLWRP output = (VertexOutputLWRP)0;
  146. UNITY_SETUP_INSTANCE_ID(input);
  147. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  148. output.pos = calculateLocalPos(input.vertex);
  149. output.vertexColor = calculateVertexColor(input.color);
  150. output.texcoord = float3(calculateTextureCoord(input.texcoord), 0);
  151. float3 positionWS = TransformObjectToWorld(input.vertex.xyz);
  152. float backFaceSign = 1;
  153. #if defined(FIXED_NORMALS_BACKFACE_RENDERING)
  154. backFaceSign = calculateBackfacingSign(positionWS.xyz);
  155. #endif
  156. output.viewDirectionWS = GetCameraPositionWS() - positionWS;
  157. #if defined(NEEDS_POSITION_WS)
  158. output.positionWS = float4(positionWS, 1);
  159. #endif
  160. half3 normalWS = calculateSpriteWorldNormal(input, -backFaceSign);
  161. output.normalWorld.xyz = normalWS;
  162. #if defined(_NORMALMAP)
  163. output.tangentWorld.xyz = calculateWorldTangent(input.tangent);
  164. output.binormalWorld.xyz = calculateSpriteWorldBinormal(input, output.normalWorld.xyz, output.tangentWorld.xyz, backFaceSign);
  165. #endif
  166. output.fogFactorAndVertexLight.yzw = LightweightLightVertexSimplified(positionWS, normalWS);
  167. #if (defined(_MAIN_LIGHT_SHADOWS) || defined(MAIN_LIGHT_CALCULATE_SHADOWS)) && !defined(_RECEIVE_SHADOWS_OFF)
  168. VertexPositionInputs vertexInput;
  169. vertexInput.positionWS = positionWS;
  170. vertexInput.positionCS = output.pos;
  171. output.shadowCoord = GetShadowCoord(vertexInput);
  172. #endif
  173. #if defined(_FOG)
  174. half fogFactor = ComputeFogFactor(output.pos.z);
  175. output.fogFactorAndVertexLight.x = fogFactor;
  176. #endif
  177. OUTPUT_SH(normalWS.xyz, output.vertexSH);
  178. return output;
  179. }
  180. half4 ForwardPassFragmentSprite(VertexOutputLWRP input) : SV_Target
  181. {
  182. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  183. fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
  184. RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.vertexColor) // shall be called before ALPHA_CLIP
  185. ALPHA_CLIP(texureColor, input.vertexColor)
  186. // fill out InputData struct
  187. InputData inputData;
  188. #if !defined(_RECEIVE_SHADOWS_OFF)
  189. #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
  190. inputData.shadowCoord = input.shadowCoord;
  191. #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
  192. inputData.shadowCoord = TransformWorldToShadowCoord(input.positionWS);
  193. #elif defined(_MAIN_LIGHT_SHADOWS)
  194. inputData.shadowCoord = input.shadowCoord;
  195. #else
  196. inputData.shadowCoord = float4(0, 0, 0, 0);
  197. #endif
  198. #endif
  199. inputData.viewDirectionWS = input.viewDirectionWS;
  200. inputData.vertexLighting = input.fogFactorAndVertexLight.yzw;
  201. #if defined(PER_PIXEL_LIGHTING) && defined(_NORMALMAP)
  202. half3 normalWS = calculateNormalFromBumpMap(input.texcoord.xy, input.tangentWorld.xyz, input.binormalWorld.xyz, input.normalWorld.xyz);
  203. #else
  204. half3 normalWS = input.normalWorld.xyz;
  205. #endif
  206. inputData.normalWS = normalWS;
  207. inputData.bakedGI = SAMPLE_GI(input.lightmapUV, input.vertexSH, inputData.normalWS);
  208. #if defined(_RIM_LIGHTING) || defined(_ADDITIONAL_LIGHTS)
  209. inputData.positionWS = input.positionWS.rgb;
  210. #endif
  211. #if defined(SPECULAR)
  212. half2 metallicGloss = getMetallicGloss(input.texcoord.xy);
  213. half metallic = metallicGloss.x;
  214. half smoothness = metallicGloss.y; // this is 1 minus the square root of real roughness m.
  215. half3 specular = half3(0, 0, 0);
  216. half4 emission = half4(0, 0, 0, 1);
  217. APPLY_EMISSION_SPECULAR(emission, input.texcoord.xy)
  218. half4 pixel = LightweightFragmentPBRSimplified(inputData, texureColor, metallic, specular, smoothness, emission.rgb, input.vertexColor);
  219. #else
  220. half3 emission = half3(0, 0, 0);
  221. APPLY_EMISSION(emission, input.texcoord.xy)
  222. half4 pixel = LightweightFragmentBlinnPhongSimplified(inputData, texureColor, emission, input.vertexColor);
  223. #endif
  224. #if defined(_RIM_LIGHTING)
  225. pixel.rgb = applyRimLighting(input.positionWS.xyz, normalWS, pixel);
  226. #endif
  227. COLORISE(pixel)
  228. APPLY_FOG_LWRP(pixel, input.fogFactorAndVertexLight.x)
  229. return pixel;
  230. }
  231. #endif