No Description
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.

Core.hlsl 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #ifndef UNIVERSAL_PIPELINE_CORE_INCLUDED
  2. #define UNIVERSAL_PIPELINE_CORE_INCLUDED
  3. // VT is not supported in URP (for now) this ensures any shaders using the VT
  4. // node work by falling to regular texture sampling.
  5. #define FORCE_VIRTUAL_TEXTURING_OFF 1
  6. #if defined(_FORWARD_PLUS)
  7. #define _ADDITIONAL_LIGHTS 1
  8. #undef _ADDITIONAL_LIGHTS_VERTEX
  9. #define USE_FORWARD_PLUS 1
  10. #else
  11. #define USE_FORWARD_PLUS 0
  12. #endif
  13. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
  14. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl"
  15. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Version.hlsl"
  16. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/GlobalSamplers.hlsl"
  17. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
  18. #if UNITY_REVERSED_Z
  19. // TODO: workaround. There's a bug where SHADER_API_GL_CORE gets erroneously defined on switch.
  20. #if (defined(SHADER_API_GLCORE) && !defined(SHADER_API_SWITCH)) || defined(SHADER_API_GLES3)
  21. //GL with reversed z => z clip range is [near, -far] -> remapping to [0, far]
  22. #define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) max((coord - _ProjectionParams.y)/(-_ProjectionParams.z-_ProjectionParams.y)*_ProjectionParams.z, 0)
  23. #else
  24. //D3d with reversed Z => z clip range is [near, 0] -> remapping to [0, far]
  25. //max is required to protect ourselves from near plane not being correct/meaningful in case of oblique matrices.
  26. #define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) max(((1.0-(coord)/_ProjectionParams.y)*_ProjectionParams.z),0)
  27. #endif
  28. #elif UNITY_UV_STARTS_AT_TOP
  29. //D3d without reversed z => z clip range is [0, far] -> nothing to do
  30. #define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) (coord)
  31. #else
  32. //Opengl => z clip range is [-near, far] -> remapping to [0, far]
  33. #define UNITY_Z_0_FAR_FROM_CLIPSPACE(coord) max(((coord + _ProjectionParams.y)/(_ProjectionParams.z+_ProjectionParams.y))*_ProjectionParams.z, 0)
  34. #endif
  35. // Stereo-related bits
  36. #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)
  37. #define SLICE_ARRAY_INDEX unity_StereoEyeIndex
  38. #define TEXTURE2D_X(textureName) TEXTURE2D_ARRAY(textureName)
  39. #define TYPED_TEXTURE2D_X(type, textureName) TYPED_TEXTURE2D_ARRAY(type, textureName)
  40. #define TEXTURE2D_X_PARAM(textureName, samplerName) TEXTURE2D_ARRAY_PARAM(textureName, samplerName)
  41. #define TEXTURE2D_X_ARGS(textureName, samplerName) TEXTURE2D_ARRAY_ARGS(textureName, samplerName)
  42. #define TEXTURE2D_X_HALF(textureName) TEXTURE2D_ARRAY_HALF(textureName)
  43. #define TEXTURE2D_X_FLOAT(textureName) TEXTURE2D_ARRAY_FLOAT(textureName)
  44. // We need to redeclare these macros for XR reasons to actually utilise the Texture2DArrays
  45. // TODO: add MSAA support, which is not being used anywhere in URP at the moment
  46. #undef FRAMEBUFFER_INPUT_X_HALF
  47. #undef FRAMEBUFFER_INPUT_X_FLOAT
  48. #undef FRAMEBUFFER_INPUT_X_INT
  49. #undef FRAMEBUFFER_INPUT_X_UINT
  50. #undef LOAD_FRAMEBUFFER_X_INPUT
  51. #if defined(SHADER_API_METAL) && defined(UNITY_NEEDS_RENDERPASS_FBFETCH_FALLBACK)
  52. #define RENDERPASS_DECLARE_FALLBACK_X(T, idx) \
  53. Texture2DArray<T> _UnityFBInput##idx; float4 _UnityFBInput##idx##_TexelSize; \
  54. inline T ReadFBInput_##idx(bool var, uint2 coord) { \
  55. [branch]if(var) { return hlslcc_fbinput_##idx; } \
  56. else { return _UnityFBInput##idx.Load(uint4(coord, SLICE_ARRAY_INDEX, 0)); } \
  57. }
  58. #define FRAMEBUFFER_INPUT_X_HALF(idx) cbuffer hlslcc_SubpassInput_f_##idx { half4 hlslcc_fbinput_##idx; bool hlslcc_fbfetch_##idx; }; \
  59. RENDERPASS_DECLARE_FALLBACK_X(half4, idx)
  60. #define FRAMEBUFFER_INPUT_X_FLOAT(idx) cbuffer hlslcc_SubpassInput_f_##idx { float4 hlslcc_fbinput_##idx; bool hlslcc_fbfetch_##idx; }; \
  61. RENDERPASS_DECLARE_FALLBACK_X(float4, idx)
  62. #define FRAMEBUFFER_INPUT_X_INT(idx) cbuffer hlslcc_SubpassInput_f_##idx { int4 hlslcc_fbinput_##idx; bool hlslcc_fbfetch_##idx; }; \
  63. RENDERPASS_DECLARE_FALLBACK_X(int4, idx)
  64. #define FRAMEBUFFER_INPUT_X_UINT(idx) cbuffer hlslcc_SubpassInput_f_##idx { uint4 hlslcc_fbinput_##idx; bool hlslcc_fbfetch_##idx; }; \
  65. RENDERPASS_DECLARE_FALLBACK_X(uint4, idx)
  66. #define LOAD_FRAMEBUFFER_X_INPUT(idx, v2fname) ReadFBInput_##idx(hlslcc_fbfetch_##idx, uint2(v2fname.xy))
  67. #elif !defined(PLATFORM_SUPPORTS_NATIVE_RENDERPASS)
  68. #define FRAMEBUFFER_INPUT_X_HALF(idx) TEXTURE2D_X_HALF(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize
  69. #define FRAMEBUFFER_INPUT_X_FLOAT(idx) TEXTURE2D_X_FLOAT(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize
  70. #define FRAMEBUFFER_INPUT_X_INT(idx) TEXTURE2D_X_INT(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize
  71. #define FRAMEBUFFER_INPUT_X_UINT(idx) TEXTURE2D_X_UINT(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize
  72. #define LOAD_FRAMEBUFFER_X_INPUT(idx, v2fname) _UnityFBInput##idx.Load(uint4(v2fname.xy, SLICE_ARRAY_INDEX, 0))
  73. #else
  74. #define FRAMEBUFFER_INPUT_X_HALF(idx) FRAMEBUFFER_INPUT_HALF(idx)
  75. #define FRAMEBUFFER_INPUT_X_FLOAT(idx) FRAMEBUFFER_INPUT_FLOAT(idx)
  76. #define FRAMEBUFFER_INPUT_X_INT(idx) FRAMEBUFFER_INPUT_INT(idx)
  77. #define FRAMEBUFFER_INPUT_X_UINT(idx) FRAMEBUFFER_INPUT_UINT(idx)
  78. #define LOAD_FRAMEBUFFER_X_INPUT(idx, v2fname) LOAD_FRAMEBUFFER_INPUT(idx, v2fname)
  79. #endif
  80. #define LOAD_TEXTURE2D_X(textureName, unCoord2) LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, SLICE_ARRAY_INDEX)
  81. #define LOAD_TEXTURE2D_X_LOD(textureName, unCoord2, lod) LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, SLICE_ARRAY_INDEX, lod)
  82. #define SAMPLE_TEXTURE2D_X(textureName, samplerName, coord2) SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, SLICE_ARRAY_INDEX)
  83. #define SAMPLE_TEXTURE2D_X_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, SLICE_ARRAY_INDEX, lod)
  84. #define GATHER_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, SLICE_ARRAY_INDEX)
  85. #define GATHER_RED_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_RED_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX))
  86. #define GATHER_GREEN_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_GREEN_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX))
  87. #define GATHER_BLUE_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_BLUE_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX))
  88. #define GATHER_ALPHA_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_ALPHA_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX))
  89. #else
  90. #define SLICE_ARRAY_INDEX 0
  91. #define TEXTURE2D_X(textureName) TEXTURE2D(textureName)
  92. #define TYPED_TEXTURE2D_X(type, textureName) TYPED_TEXTURE2D(type, textureName)
  93. #define TEXTURE2D_X_PARAM(textureName, samplerName) TEXTURE2D_PARAM(textureName, samplerName)
  94. #define TEXTURE2D_X_ARGS(textureName, samplerName) TEXTURE2D_ARGS(textureName, samplerName)
  95. #define TEXTURE2D_X_HALF(textureName) TEXTURE2D_HALF(textureName)
  96. #define TEXTURE2D_X_FLOAT(textureName) TEXTURE2D_FLOAT(textureName)
  97. #define FRAMEBUFFER_INPUT_X_HALF(idx) FRAMEBUFFER_INPUT_HALF(idx)
  98. #define FRAMEBUFFER_INPUT_X_FLOAT(idx) FRAMEBUFFER_INPUT_FLOAT(idx)
  99. #define FRAMEBUFFER_INPUT_X_INT(idx) FRAMEBUFFER_INPUT_INT(idx)
  100. #define FRAMEBUFFER_INPUT_X_UINT(idx) FRAMEBUFFER_INPUT_UINT(idx)
  101. #define LOAD_FRAMEBUFFER_X_INPUT(idx, v2fname) LOAD_FRAMEBUFFER_INPUT(idx, v2fname)
  102. #define LOAD_TEXTURE2D_X(textureName, unCoord2) LOAD_TEXTURE2D(textureName, unCoord2)
  103. #define LOAD_TEXTURE2D_X_LOD(textureName, unCoord2, lod) LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod)
  104. #define SAMPLE_TEXTURE2D_X(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2)
  105. #define SAMPLE_TEXTURE2D_X_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod)
  106. #define GATHER_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_TEXTURE2D(textureName, samplerName, coord2)
  107. #define GATHER_RED_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_RED_TEXTURE2D(textureName, samplerName, coord2)
  108. #define GATHER_GREEN_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2)
  109. #define GATHER_BLUE_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2)
  110. #define GATHER_ALPHA_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2)
  111. #endif
  112. ///
  113. /// Texture Sampling Macro Overrides for Scaling
  114. ///
  115. /// When mip bias is supported by the underlying platform, the following section redefines all 2d texturing operations to support a global mip bias feature.
  116. /// This feature is used to improve rendering quality when image scaling is active. It achieves this by adding a bias value to the standard mip lod calculation
  117. /// which allows us to select the mip level based on the final image resolution rather than the current rendering resolution.
  118. #ifdef PLATFORM_SAMPLE_TEXTURE2D_BIAS
  119. #ifdef SAMPLE_TEXTURE2D
  120. #undef SAMPLE_TEXTURE2D
  121. #define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) \
  122. PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, _GlobalMipBias.x)
  123. #endif
  124. #ifdef SAMPLE_TEXTURE2D_BIAS
  125. #undef SAMPLE_TEXTURE2D_BIAS
  126. #define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) \
  127. PLATFORM_SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, (bias + _GlobalMipBias.x))
  128. #endif
  129. #endif
  130. #ifdef PLATFORM_SAMPLE_TEXTURE2D_GRAD
  131. #ifdef SAMPLE_TEXTURE2D_GRAD
  132. #undef SAMPLE_TEXTURE2D_GRAD
  133. #define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) \
  134. PLATFORM_SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, (dpdx * _GlobalMipBias.y), (dpdy * _GlobalMipBias.y))
  135. #endif
  136. #endif
  137. #ifdef PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS
  138. #ifdef SAMPLE_TEXTURE2D_ARRAY
  139. #undef SAMPLE_TEXTURE2D_ARRAY
  140. #define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) \
  141. PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, _GlobalMipBias.x)
  142. #endif
  143. #ifdef SAMPLE_TEXTURE2D_ARRAY_BIAS
  144. #undef SAMPLE_TEXTURE2D_ARRAY_BIAS
  145. #define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) \
  146. PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, (bias + _GlobalMipBias.x))
  147. #endif
  148. #endif
  149. #ifdef PLATFORM_SAMPLE_TEXTURECUBE_BIAS
  150. #ifdef SAMPLE_TEXTURECUBE
  151. #undef SAMPLE_TEXTURECUBE
  152. #define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) \
  153. PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, _GlobalMipBias.x)
  154. #endif
  155. #ifdef SAMPLE_TEXTURECUBE_BIAS
  156. #undef SAMPLE_TEXTURECUBE_BIAS
  157. #define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) \
  158. PLATFORM_SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, (bias + _GlobalMipBias.x))
  159. #endif
  160. #endif
  161. #ifdef PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS
  162. #ifdef SAMPLE_TEXTURECUBE_ARRAY
  163. #undef SAMPLE_TEXTURECUBE_ARRAY
  164. #define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)\
  165. PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, _GlobalMipBias.x)
  166. #endif
  167. #ifdef SAMPLE_TEXTURECUBE_ARRAY_BIAS
  168. #undef SAMPLE_TEXTURECUBE_ARRAY_BIAS
  169. #define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias)\
  170. PLATFORM_SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, (bias + _GlobalMipBias.x))
  171. #endif
  172. #endif
  173. #define VT_GLOBAL_MIP_BIAS_MULTIPLIER (_GlobalMipBias.y)
  174. // Structs
  175. struct VertexPositionInputs
  176. {
  177. float3 positionWS; // World space position
  178. float3 positionVS; // View space position
  179. float4 positionCS; // Homogeneous clip space position
  180. float4 positionNDC;// Homogeneous normalized device coordinates
  181. };
  182. struct VertexNormalInputs
  183. {
  184. real3 tangentWS;
  185. real3 bitangentWS;
  186. float3 normalWS;
  187. };
  188. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl"
  189. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Deprecated.hlsl"
  190. #endif