暫無描述
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.

LightCookieInput.hlsl 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #ifndef UNIVERSAL_LIGHT_COOKIE_INPUT_INCLUDED
  2. #define UNIVERSAL_LIGHT_COOKIE_INPUT_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/GlobalSamplers.hlsl"
  4. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LightCookie/LightCookieTypes.hlsl"
  5. // Textures
  6. TEXTURE2D(_MainLightCookieTexture);
  7. TEXTURE2D(_AdditionalLightsCookieAtlasTexture);
  8. // Samplers
  9. SAMPLER(sampler_MainLightCookieTexture);
  10. // Buffers
  11. // GLES3 causes a performance regression in some devices when using CBUFFER.
  12. #ifndef SHADER_API_GLES3
  13. CBUFFER_START(LightCookies)
  14. #endif
  15. float4x4 _MainLightWorldToLight;
  16. float _AdditionalLightsCookieEnableBits[(MAX_VISIBLE_LIGHTS + 31) / 32];
  17. float _MainLightCookieTextureFormat;
  18. float _AdditionalLightsCookieAtlasTextureFormat;
  19. #if !USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA
  20. float4x4 _AdditionalLightsWorldToLights[MAX_VISIBLE_LIGHTS];
  21. float4 _AdditionalLightsCookieAtlasUVRects[MAX_VISIBLE_LIGHTS]; // (xy: uv size, zw: uv offset)
  22. float _AdditionalLightsLightTypes[MAX_VISIBLE_LIGHTS];
  23. #endif
  24. #ifndef SHADER_API_GLES3
  25. CBUFFER_END
  26. #endif
  27. #if USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA
  28. StructuredBuffer<float4x4> _AdditionalLightsWorldToLightBuffer;
  29. StructuredBuffer<float4> _AdditionalLightsCookieAtlasUVRectBuffer; // UV rect into light cookie atlas (xy: uv offset, zw: uv size)
  30. StructuredBuffer<float> _AdditionalLightsLightTypeBuffer;
  31. #endif
  32. // Data Getters
  33. float4x4 GetLightCookieWorldToLightMatrix(int lightIndex)
  34. {
  35. #if USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA
  36. return _AdditionalLightsWorldToLightBuffer[lightIndex];
  37. #else
  38. return _AdditionalLightsWorldToLights[lightIndex];
  39. #endif
  40. }
  41. float4 GetLightCookieAtlasUVRect(int lightIndex)
  42. {
  43. #if USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA
  44. return _AdditionalLightsCookieAtlasUVRectBuffer[lightIndex];
  45. #else
  46. return _AdditionalLightsCookieAtlasUVRects[lightIndex];
  47. #endif
  48. }
  49. int GetLightCookieLightType(int lightIndex)
  50. {
  51. #if USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA
  52. return _AdditionalLightsLightTypeBuffer[lightIndex];
  53. #else
  54. return _AdditionalLightsLightTypes[lightIndex];
  55. #endif
  56. }
  57. bool IsMainLightCookieTextureRGBFormat()
  58. {
  59. return _MainLightCookieTextureFormat == URP_LIGHT_COOKIE_FORMAT_RGB;
  60. }
  61. bool IsMainLightCookieTextureAlphaFormat()
  62. {
  63. return _MainLightCookieTextureFormat == URP_LIGHT_COOKIE_FORMAT_ALPHA;
  64. }
  65. bool IsAdditionalLightsCookieAtlasTextureRGBFormat()
  66. {
  67. return _AdditionalLightsCookieAtlasTextureFormat == URP_LIGHT_COOKIE_FORMAT_RGB;
  68. }
  69. bool IsAdditionalLightsCookieAtlasTextureAlphaFormat()
  70. {
  71. return _AdditionalLightsCookieAtlasTextureFormat == URP_LIGHT_COOKIE_FORMAT_ALPHA;
  72. }
  73. // Sampling
  74. real4 SampleMainLightCookieTexture(float2 uv)
  75. {
  76. return SAMPLE_TEXTURE2D(_MainLightCookieTexture, sampler_MainLightCookieTexture, uv);
  77. }
  78. real4 SampleAdditionalLightsCookieAtlasTexture(float2 uv)
  79. {
  80. // No mipmap support
  81. return SAMPLE_TEXTURE2D_LOD(_AdditionalLightsCookieAtlasTexture, sampler_LinearClamp, uv, 0);
  82. }
  83. // Helpers
  84. bool IsMainLightCookieEnabled()
  85. {
  86. return _MainLightCookieTextureFormat != URP_LIGHT_COOKIE_FORMAT_NONE;
  87. }
  88. bool IsLightCookieEnabled(int lightBufferIndex)
  89. {
  90. #if 0
  91. float4 uvRect = GetLightCookieAtlasUVRect(lightBufferIndex);
  92. return any(uvRect != 0);
  93. #else
  94. // 2^5 == 32, bit mask for a float/uint.
  95. uint elemIndex = ((uint)lightBufferIndex) >> 5;
  96. uint bitOffset = (uint)lightBufferIndex & ((1 << 5) - 1);
  97. #if USE_STRUCTURED_BUFFER_FOR_LIGHT_DATA
  98. uint elem = asuint(_AdditionalLightsCookieEnableBitsBuffer[elemIndex]);
  99. #else
  100. uint elem = asuint(_AdditionalLightsCookieEnableBits[elemIndex]);
  101. #endif
  102. return (elem & (1u << bitOffset)) != 0u;
  103. #endif
  104. }
  105. #endif //UNIVERSAL_LIGHT_COOKIE_INPUT_INCLUDED