Spine-Sprite-ForwardPass-LW.hlsl 9.0 KB

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