Advertisement
senis_kenis

Untitled

Apr 12th, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. #ifndef FUR_COMMON_HLSL
  2. #define FUR_COMMON_HLSL
  3.  
  4. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"
  5. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl"
  6. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl"
  7. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
  8.  
  9. float3 _LightDirection;
  10. float _ShadowExtraBias;
  11.  
  12. inline float3 GetViewDirectionOS(float3 posOS)
  13. {
  14. float3 cameraOS = TransformWorldToObject(GetCameraPositionWS());
  15. return normalize(posOS - cameraOS);
  16. }
  17.  
  18. inline float3 CustomApplyShadowBias(float3 positionWS, float3 normalWS)
  19. {
  20. positionWS += _LightDirection * (_ShadowBias.x + _ShadowExtraBias);
  21. float invNdotL = 1.0 - saturate(dot(_LightDirection, normalWS));
  22. float scale = invNdotL * _ShadowBias.y;
  23. positionWS += normalWS * scale.xxx;
  24.  
  25. return positionWS;
  26. }
  27.  
  28. inline float4 GetShadowPositionHClip(float3 positionWS, float3 normalWS)
  29. {
  30. positionWS = CustomApplyShadowBias(positionWS, normalWS);
  31. float4 positionCS = TransformWorldToHClip(positionWS);
  32. #if UNITY_REVERSED_Z
  33. positionCS.z = min(positionCS.z, positionCS.w * UNITY_NEAR_CLIP_VALUE);
  34. #else
  35. positionCS.z = max(positionCS.z, positionCS.w * UNITY_NEAR_CLIP_VALUE);
  36. #endif
  37. return positionCS;
  38. }
  39.  
  40. float _RimLightPower;
  41. float _RimLightIntensity;
  42.  
  43. void ApplyRimLight(inout float3 color, float3 posWS, float3 viewDirWS, float3 normalWS)
  44. {
  45. float viewDotNormal = abs(dot(viewDirWS, normalWS));
  46. float normalFactor = pow(abs(1.0 - viewDotNormal), _RimLightPower);
  47.  
  48. Light light = GetMainLight();
  49. float lightDirDotView = dot(light.direction, viewDirWS);
  50. float intensity = pow(max(-lightDirDotView, 0.0), _RimLightPower);
  51. intensity *= _RimLightIntensity * normalFactor;
  52. #ifdef _MAIN_LIGHT_SHADOWS
  53. float4 shadowCoord = TransformWorldToShadowCoord(posWS);
  54. intensity *= MainLightRealtimeShadow(shadowCoord);
  55. #endif
  56. color += intensity * light.color;
  57.  
  58. #ifdef _ADDITIONAL_LIGHTS
  59. int additionalLightsCount = GetAdditionalLightsCount();
  60. for (int i = 0; i < additionalLightsCount; ++i)
  61. {
  62. int index = GetPerObjectLightIndex(i);
  63. Light light = GetAdditionalPerObjectLight(index, posWS);
  64. float lightDirDotView = dot(light.direction, viewDirWS);
  65. float intensity = max(-lightDirDotView, 0.0);
  66. intensity *= _RimLightIntensity * normalFactor;
  67. intensity *= light.distanceAttenuation;
  68. #ifdef _MAIN_LIGHT_SHADOWS
  69. intensity *= AdditionalLightRealtimeShadow(index, posWS);
  70. #endif
  71. color += intensity * light.color;
  72. }
  73. #endif
  74. }
  75.  
  76. inline float rand(float2 seed)
  77. {
  78. return frac(sin(dot(seed.xy, float2(12.9898, 78.233))) * 43758.5453);
  79. }
  80.  
  81. inline float3 rand3(float2 seed)
  82. {
  83. return 2.0 * (float3(rand(seed * 1), rand(seed * 2), rand(seed * 3)) - 0.5);
  84. }
  85.  
  86. struct FurMoverData
  87. {
  88. float3 posWS;
  89. float3 dPosWS;
  90. float3 velocityWS;
  91. float time;
  92. };
  93.  
  94. RWStructuredBuffer<FurMoverData> _Buffer : register(u1);
  95.  
  96. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement