暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VFXLit.hlsl 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. // Upgrade NOTE: replaced 'defined at' with 'defined (at)'
  2. #ifndef SHADERPASS
  3. #error SHADERPASS must be defined (at) this point
  4. #endif
  5. #if VFX_MATERIAL_TYPE_SIX_WAY_SMOKE
  6. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SixWayLighting.hlsl"
  7. #include "Packages/com.unity.visualeffectgraph/Shaders/SixWay/VFXSixWayCommon.hlsl"
  8. #else
  9. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  10. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl"
  11. #endif
  12. float3 VFXGetPositionRWS(VFX_VARYING_PS_INPUTS i)
  13. {
  14. float3 posWS = (float3)0;
  15. #ifdef VFX_VARYING_POSWS
  16. posWS = i.VFX_VARYING_POSWS;
  17. #endif
  18. return VFXGetPositionRWS(posWS);
  19. }
  20. InputData VFXGetInputData(const VFX_VARYING_PS_INPUTS i, const PositionInputs posInputs, float3 normalWS, bool frontFace)
  21. {
  22. InputData inputData = (InputData)0;
  23. inputData.positionWS = posInputs.positionWS.xyz;
  24. inputData.normalWS = normalWS;
  25. inputData.viewDirectionWS = GetWorldSpaceNormalizeViewDir(inputData.positionWS);
  26. #if defined(VFX_MATERIAL_TYPE_SIX_WAY_SMOKE) && defined(VFX_VARYING_TANGENT)
  27. float signNormal = frontFace ? 1.0 : -1.0f;
  28. float3 bitangent = cross(i.VFX_VARYING_NORMAL.xyz, i.VFX_VARYING_TANGENT.xyz);
  29. inputData.tangentToWorld = half3x3(i.VFX_VARYING_TANGENT.xyz, bitangent.xyz, signNormal * i.VFX_VARYING_NORMAL.xyz);
  30. #endif
  31. //When there is only one cascaded, this shadowCoord can be computed at vertex stage
  32. //#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
  33. // inputData.shadowCoord = inputData.shadowCoord;
  34. #if defined(MAIN_LIGHT_CALCULATE_SHADOWS)
  35. inputData.shadowCoord = TransformWorldToShadowCoord(inputData.positionWS);
  36. #else
  37. inputData.shadowCoord = float4(0, 0, 0, 0);
  38. #endif
  39. //This ComputeFogFactor can be moved to vertex and use interpolator instead
  40. float fogFactor = ComputeFogFactor(i.VFX_VARYING_POSCS.z);
  41. inputData.fogCoord = InitializeInputDataFog(float4(inputData.positionWS, 1.0), fogFactor);
  42. //SampleSH could partially be done on vertex using SampleSHVertex & SampleSHPixel
  43. //For now, use directly the simpler per pixel fallback
  44. #if defined(PROBE_VOLUMES_L1) || defined(PROBE_VOLUMES_L2)
  45. float4 unusedShadowmask;
  46. inputData.bakedGI = SAMPLE_GI(0, // No vertex support
  47. GetAbsolutePositionWS(inputData.positionWS),
  48. inputData.normalWS,
  49. inputData.viewDirectionWS,
  50. i.VFX_VARYING_POSCS.xy,
  51. unusedShadowmask,
  52. unusedShadowmask);
  53. #else
  54. inputData.bakedGI = SampleSH(normalWS);
  55. #endif
  56. inputData.normalizedScreenSpaceUV = GetNormalizedScreenSpaceUV(i.VFX_VARYING_POSCS);
  57. //No static light map in VFX
  58. //inputData.shadowMask = SAMPLE_SHADOWMASK(input.staticLightmapUV);
  59. return inputData;
  60. }
  61. #ifndef VFX_SHADERGRAPH
  62. float4 GetSurfaceColor(VFX_VARYING_PS_INPUTS i, const VFXUVData uvData)
  63. {
  64. float4 baseColorMapSample = (float4)1.0f;
  65. float4 color = float4(1,1,1,1);
  66. #if URP_USE_BASE_COLOR
  67. color *= VFXGetParticleColor(i);
  68. #elif URP_USE_ADDITIONAL_BASE_COLOR
  69. #if defined(VFX_VARYING_COLOR)
  70. color.xyz *= i.VFX_VARYING_COLOR;
  71. #endif
  72. #if defined(VFX_VARYING_ALPHA)
  73. color.a *= i.VFX_VARYING_ALPHA;
  74. #endif
  75. #endif
  76. #if URP_USE_BASE_COLOR_MAP
  77. baseColorMapSample = SampleTexture(VFX_SAMPLER(baseColorMap),uvData);
  78. #if URP_USE_BASE_COLOR_MAP_COLOR
  79. color.xyz *= baseColorMapSample.xyz;
  80. #endif
  81. #if URP_USE_BASE_COLOR_MAP_ALPHA
  82. color.a *= baseColorMapSample.a;
  83. #endif
  84. #endif
  85. color = VFXApplySoftParticleFade(i, color);
  86. return color;
  87. }
  88. float3 GetSurfaceEmissive(VFX_VARYING_PS_INPUTS i, const VFXUVData uvData)
  89. {
  90. float3 emission = float3(1, 1, 1);
  91. #if URP_USE_EMISSIVE_MAP
  92. float emissiveScale = 1.0f;
  93. #ifdef VFX_VARYING_EMISSIVESCALE
  94. emissiveScale = i.VFX_VARYING_EMISSIVESCALE;
  95. #endif
  96. emission *= SampleTexture(VFX_SAMPLER(emissiveMap), uvData).rgb * emissiveScale;
  97. #endif
  98. #if defined(VFX_VARYING_EMISSIVE) && (URP_USE_EMISSIVE_COLOR || URP_USE_ADDITIONAL_EMISSIVE_COLOR)
  99. emission *= i.VFX_VARYING_EMISSIVE;
  100. #endif
  101. #ifdef VFX_VARYING_EXPOSUREWEIGHT
  102. emission *= lerp(GetInverseCurrentExposureMultiplier(), 1.0f, i.VFX_VARYING_EXPOSUREWEIGHT);
  103. #endif
  104. return emission;
  105. }
  106. #if VFX_MATERIAL_TYPE_SIX_WAY_SMOKE
  107. SixWaySurfaceData VFXGetSurfaceData(const VFX_VARYING_PS_INPUTS i, float3 normalWS, const VFXUVData uvData)
  108. {
  109. SixWaySurfaceData surfaceData = (SixWaySurfaceData)0;
  110. float4 color = GetSurfaceColor(i, uvData);
  111. surfaceData.absorptionRange = 1.0f;
  112. #ifdef VFX_VARYING_ABSORPTIONRANGE
  113. surfaceData.absorptionRange = i.VFX_VARYING_ABSORPTIONRANGE;
  114. #endif
  115. float4 lightmapPositive = SampleTexture(VFX_SAMPLER(positiveAxesLightmap),uvData);
  116. float4 lightmapNegative = SampleTexture(VFX_SAMPLER(negativeAxesLightmap),uvData);
  117. surfaceData.rightTopBack = lightmapPositive.rgb;
  118. surfaceData.leftBottomFront = lightmapNegative.rgb;
  119. #if VFX_STRIPS_SWAP_UV
  120. SixWaySwapUV(surfaceData.rightTopBack, surfaceData.leftBottomFront);
  121. #endif
  122. float mapAlpha = lightmapPositive.a;
  123. color.a *= mapAlpha;
  124. #if VFX_SIX_WAY_REMAP
  125. #if VFX_BLENDMODE_PREMULTIPLY
  126. surfaceData.rightTopBack /= (mapAlpha + VFX_EPSILON);
  127. surfaceData.leftBottomFront /= (mapAlpha + VFX_EPSILON);
  128. #endif
  129. #if defined(VFX_VARYING_LIGHTMAP_REMAP_RANGES)
  130. float4 remapRanges = i.VFX_VARYING_LIGHTMAP_REMAP_RANGES;
  131. RemapLightMapsRangesFrom(surfaceData.rightTopBack, surfaceData.leftBottomFront, mapAlpha, remapRanges);
  132. #endif
  133. #if defined(VFX_VARYING_LIGHTMAP_REMAP_CONTROLS)
  134. float2 lightmapControls = i.VFX_VARYING_LIGHTMAP_REMAP_CONTROLS;
  135. RemapLightMaps(surfaceData.rightTopBack, surfaceData.leftBottomFront, lightmapControls);
  136. #elif defined(VFX_VARYING_LIGHTMAP_REMAP_CURVE)
  137. float4 remapCurve = i.VFX_VARYING_LIGHTMAP_REMAP_CURVE;
  138. RemapLightMaps(surfaceData.rightTopBack, surfaceData.leftBottomFront, remapCurve);
  139. #endif
  140. #if defined(VFX_VARYING_LIGHTMAP_REMAP_RANGES)
  141. RemapLightMapsRangesTo(surfaceData.rightTopBack, surfaceData.leftBottomFront, mapAlpha, remapRanges);
  142. #endif
  143. #if VFX_BLENDMODE_PREMULTIPLY
  144. surfaceData.rightTopBack *= (mapAlpha + VFX_EPSILON);
  145. surfaceData.leftBottomFront *= (mapAlpha + VFX_EPSILON);
  146. #endif
  147. #endif
  148. float invEnergy = INV_PI;
  149. surfaceData.rightTopBack *= invEnergy;
  150. surfaceData.leftBottomFront *= invEnergy;
  151. #if defined(VFX_VARYING_ALPHA_REMAP)
  152. color.a = SampleCurve(i.VFX_VARYING_ALPHA_REMAP, color.a);
  153. #endif
  154. VFXClipFragmentColor(color.a,i);
  155. #if defined(VFX_VARYING_BAKE_DIFFUSE_LIGHTING)
  156. surfaceData.diffuseGIData0 = i.VFX_VARYING_BAKE_DIFFUSE_LIGHTING[0];
  157. surfaceData.diffuseGIData1 = i.VFX_VARYING_BAKE_DIFFUSE_LIGHTING[1];
  158. surfaceData.diffuseGIData2 = i.VFX_VARYING_BAKE_DIFFUSE_LIGHTING[2];
  159. #endif
  160. #if URP_USE_EMISSIVE
  161. #if defined(VFX_VARYING_EMISSIVE_GRADIENT)
  162. float emissiveChannel = SampleTexture(VFX_SAMPLER(negativeAxesLightmap),uvData).a;
  163. #if defined(VFX_VARYING_EMISSIVE_CHANNEL_SCALE)
  164. emissiveChannel *= i.VFX_VARYING_EMISSIVE_CHANNEL_SCALE;
  165. #endif
  166. surfaceData.emission = SampleGradient(i.VFX_VARYING_EMISSIVE_GRADIENT, emissiveChannel).rgb;
  167. #if defined(VFX_VARYING_EMISSIVE_MULTIPLIER)
  168. surfaceData.emission *= i.VFX_VARYING_EMISSIVE_MULTIPLIER;
  169. #endif
  170. #ifdef VFX_VARYING_EXPOSUREWEIGHT
  171. surfaceData.emission *= lerp(GetInverseCurrentExposureMultiplier(),1.0f,i.VFX_VARYING_EXPOSUREWEIGHT);
  172. #endif
  173. #else
  174. surfaceData.emission = GetSurfaceEmissive(i, uvData);
  175. #endif
  176. surfaceData.emission *= saturate(color.a);
  177. #endif
  178. surfaceData.baseColor.rgb = color.rgb;
  179. surfaceData.alpha = saturate(color.a);
  180. surfaceData.occlusion = 1.0f;
  181. return surfaceData;
  182. }
  183. #else
  184. SurfaceData VFXGetSurfaceData(const VFX_VARYING_PS_INPUTS i, float3 normalWS, const VFXUVData uvData)
  185. {
  186. SurfaceData surfaceData = (SurfaceData)0;
  187. float4 color = GetSurfaceColor(i, uvData);
  188. VFXClipFragmentColor(color.a,i);
  189. surfaceData.albedo = saturate(color.rgb);
  190. #if IS_OPAQUE_PARTICLE
  191. surfaceData.alpha = 1.0f;
  192. #else
  193. surfaceData.alpha = saturate(color.a);
  194. #endif
  195. float4 metallicMapSample = (float4)1.0f;
  196. float4 specularMapSample = (float4)1.0f;
  197. #if URP_WORKFLOW_MODE_METALLIC
  198. surfaceData.metallic = 1.0f;
  199. #ifdef VFX_VARYING_METALLIC
  200. surfaceData.metallic *= i.VFX_VARYING_METALLIC;
  201. #endif
  202. #if URP_USE_METALLIC_MAP
  203. metallicMapSample = SampleTexture(VFX_SAMPLER(metallicMap), uvData);
  204. surfaceData.metallic *= metallicMapSample.r;
  205. #endif
  206. #elif URP_WORKFLOW_MODE_SPECULAR
  207. surfaceData.specular = (float3)1.0f;
  208. #ifdef VFX_VARYING_SPECULAR
  209. surfaceData.specular *= saturate(i.VFX_VARYING_SPECULAR);
  210. #endif
  211. #if URP_USE_SPECULAR_MAP
  212. specularMapSample = SampleTexture(VFX_SAMPLER(specularMap), uvData);
  213. surfaceData.specular *= specularMapSample.rgb;
  214. #endif
  215. #endif
  216. surfaceData.normalTS = float3(1.0f, 0.0f, 0.0f); //NormalWS is directly modified in VFX
  217. surfaceData.smoothness = 1.0f;
  218. #ifdef VFX_VARYING_SMOOTHNESS
  219. surfaceData.smoothness *= i.VFX_VARYING_SMOOTHNESS;
  220. #endif
  221. #if URP_USE_SMOOTHNESS_IN_ALBEDO
  222. surfaceData.smoothness *= SampleTexture(VFX_SAMPLER(baseColorMap),uvData).a;
  223. #elif URP_USE_SMOOTHNESS_IN_METALLIC
  224. surfaceData.smoothness *= metallicMapSample.a;
  225. #elif URP_USE_SMOOTHNESS_IN_SPECULAR
  226. surfaceData.smoothness *= specularMapSample.a;
  227. #endif
  228. surfaceData.occlusion = 1.0f;
  229. #if URP_USE_OCCLUSION_MAP
  230. float4 mask = SampleTexture(VFX_SAMPLER(occlusionMap),uvData);
  231. surfaceData.occlusion *= mask.g;
  232. #endif
  233. #if URP_USE_EMISSIVE
  234. surfaceData.emission = GetSurfaceEmissive(i, uvData);
  235. #endif
  236. return surfaceData;
  237. }
  238. #endif
  239. #endif