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.

Blit.hlsl 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #ifndef UNITY_CORE_BLIT_INCLUDED
  2. #define UNITY_CORE_BLIT_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
  4. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/DynamicScaling.hlsl"
  5. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
  6. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
  7. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/GlobalSamplers.hlsl"
  8. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl"
  9. #ifdef USE_FULL_PRECISION_BLIT_TEXTURE
  10. TEXTURE2D_X_FLOAT(_BlitTexture);
  11. #else
  12. TEXTURE2D_X(_BlitTexture);
  13. #endif
  14. TEXTURECUBE(_BlitCubeTexture);
  15. uniform float4 _BlitScaleBias;
  16. uniform float4 _BlitScaleBiasRt;
  17. uniform float4 _BlitTexture_TexelSize;
  18. uniform float _BlitMipLevel;
  19. uniform float2 _BlitTextureSize;
  20. uniform uint _BlitPaddingSize;
  21. uniform int _BlitTexArraySlice;
  22. uniform float4 _BlitDecodeInstructions;
  23. struct Attributes
  24. {
  25. uint vertexID : SV_VertexID;
  26. UNITY_VERTEX_INPUT_INSTANCE_ID
  27. };
  28. struct Varyings
  29. {
  30. float4 positionCS : SV_POSITION;
  31. float2 texcoord : TEXCOORD0;
  32. UNITY_VERTEX_OUTPUT_STEREO
  33. };
  34. Varyings Vert(Attributes input)
  35. {
  36. Varyings output;
  37. UNITY_SETUP_INSTANCE_ID(input);
  38. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  39. float4 pos = GetFullScreenTriangleVertexPosition(input.vertexID);
  40. float2 uv = GetFullScreenTriangleTexCoord(input.vertexID);
  41. output.positionCS = pos;
  42. output.texcoord = DYNAMIC_SCALING_APPLY_SCALEBIAS(uv);
  43. return output;
  44. }
  45. Varyings VertQuad(Attributes input)
  46. {
  47. Varyings output;
  48. UNITY_SETUP_INSTANCE_ID(input);
  49. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  50. float4 pos = GetQuadVertexPosition(input.vertexID);
  51. float2 uv = GetQuadTexCoord(input.vertexID);
  52. output.positionCS = pos * float4(_BlitScaleBiasRt.x, _BlitScaleBiasRt.y, 1, 1) + float4(_BlitScaleBiasRt.z, _BlitScaleBiasRt.w, 0, 0);
  53. output.positionCS.xy = output.positionCS.xy * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f); //convert to -1..1
  54. output.texcoord = DYNAMIC_SCALING_APPLY_SCALEBIAS(uv);
  55. return output;
  56. }
  57. Varyings VertQuadPadding(Attributes input)
  58. {
  59. Varyings output;
  60. UNITY_SETUP_INSTANCE_ID(input);
  61. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
  62. float2 scalePadding = ((_BlitTextureSize + float(_BlitPaddingSize)) / _BlitTextureSize);
  63. float2 offsetPadding = (float(_BlitPaddingSize) / 2.0) / (_BlitTextureSize + _BlitPaddingSize);
  64. float4 pos = GetQuadVertexPosition(input.vertexID);
  65. float2 uv = GetQuadTexCoord(input.vertexID);
  66. output.positionCS = pos * float4(_BlitScaleBiasRt.x, _BlitScaleBiasRt.y, 1, 1) + float4(_BlitScaleBiasRt.z, _BlitScaleBiasRt.w, 0, 0);
  67. output.positionCS.xy = output.positionCS.xy * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f); //convert to -1..1
  68. output.texcoord = uv;
  69. output.texcoord = (output.texcoord - offsetPadding) * scalePadding;
  70. output.texcoord = DYNAMIC_SCALING_APPLY_SCALEBIAS(output.texcoord);
  71. return output;
  72. }
  73. float4 FragBlit(Varyings input, SamplerState s)
  74. {
  75. #if defined(USE_TEXTURE2D_X_AS_ARRAY) && defined(BLIT_SINGLE_SLICE)
  76. return SAMPLE_TEXTURE2D_ARRAY_LOD(_BlitTexture, s, input.texcoord.xy, _BlitTexArraySlice, _BlitMipLevel);
  77. #endif
  78. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  79. return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, s, input.texcoord.xy, _BlitMipLevel);
  80. }
  81. float4 FragNearest(Varyings input) : SV_Target
  82. {
  83. return FragBlit(input, sampler_PointClamp);
  84. }
  85. float4 FragBilinear(Varyings input) : SV_Target
  86. {
  87. return FragBlit(input, sampler_LinearClamp);
  88. }
  89. float4 FragBilinearRepeat(Varyings input) : SV_Target
  90. {
  91. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  92. float2 uv = input.texcoord.xy;
  93. return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_LinearRepeat, uv, _BlitMipLevel);
  94. }
  95. float4 FragNearestRepeat(Varyings input) : SV_Target
  96. {
  97. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  98. float2 uv = input.texcoord.xy;
  99. return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_PointRepeat, uv, _BlitMipLevel);
  100. }
  101. float4 FragOctahedralBilinearRepeat(Varyings input) : SV_Target
  102. {
  103. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  104. float2 uv = RepeatOctahedralUV(input.texcoord.x, input.texcoord.y);
  105. return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_LinearRepeat, uv, _BlitMipLevel);
  106. }
  107. float4 FragOctahedralProject(Varyings input) : SV_Target
  108. {
  109. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  110. float2 UV = saturate(input.texcoord);
  111. float3 dir = UnpackNormalOctQuadEncode(2.0f*UV - 1.0f);
  112. return float4(SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_LinearRepeat, dir, _BlitMipLevel).rgb, 1);
  113. }
  114. float4 FragOctahedralProjectNearestRepeat(Varyings input) : SV_Target
  115. {
  116. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  117. float2 uv = RepeatOctahedralUV(input.texcoord.x, input.texcoord.y);
  118. float3 dir = UnpackNormalOctQuadEncode(2.0f * uv - 1.0f);
  119. #ifdef BLIT_DECODE_HDR
  120. return float4(DecodeHDREnvironment(SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_PointRepeat, dir, _BlitMipLevel), _BlitDecodeInstructions), 1);
  121. #else
  122. return float4(SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_PointRepeat, dir, _BlitMipLevel).rgb, 1);
  123. #endif
  124. }
  125. float4 FragOctahedralProjectBilinearRepeat(Varyings input) : SV_Target
  126. {
  127. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  128. float2 uv = RepeatOctahedralUV(input.texcoord.x, input.texcoord.y);
  129. float3 dir = UnpackNormalOctQuadEncode(2.0f * uv - 1.0f);
  130. #ifdef BLIT_DECODE_HDR
  131. return float4(DecodeHDREnvironment(SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_LinearRepeat, dir, _BlitMipLevel), _BlitDecodeInstructions), 1);
  132. #else
  133. return float4(SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_LinearRepeat, dir, _BlitMipLevel).rgb, 1);
  134. #endif
  135. }
  136. // 8-bit single channel sampling/format conversions
  137. float4 FragOctahedralProjectLuminance(Varyings input) : SV_Target
  138. {
  139. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  140. float2 UV = saturate(input.texcoord);
  141. float3 dir = UnpackNormalOctQuadEncode(2.0f*UV - 1.0f);
  142. // sRGB/Rec.709
  143. return Luminance(SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_LinearRepeat, dir, _BlitMipLevel)).xxxx;
  144. }
  145. float4 FragOctahedralProjectRedToRGBA(Varyings input) : SV_Target
  146. {
  147. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  148. float2 UV = saturate(input.texcoord);
  149. float3 dir = UnpackNormalOctQuadEncode(2.0f*UV - 1.0f);
  150. return SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_LinearRepeat, dir, _BlitMipLevel).rrrr;
  151. }
  152. float4 FragOctahedralProjectAlphaToRGBA(Varyings input) : SV_Target
  153. {
  154. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  155. float2 UV = saturate(input.texcoord);
  156. float3 dir = UnpackNormalOctQuadEncode(2.0f*UV - 1.0f);
  157. return SAMPLE_TEXTURECUBE_LOD(_BlitCubeTexture, sampler_LinearRepeat, dir, _BlitMipLevel).aaaa;
  158. }
  159. float4 FragBilinearLuminance(Varyings input) : SV_Target
  160. {
  161. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  162. float2 uv = input.texcoord.xy;
  163. // sRGB/Rec.709
  164. return Luminance(SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_LinearRepeat, uv, _BlitMipLevel)).xxxx;
  165. }
  166. float4 FragBilinearRedToRGBA(Varyings input) : SV_Target
  167. {
  168. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  169. float2 uv = input.texcoord.xy;
  170. return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_LinearRepeat, uv, _BlitMipLevel).rrrr;
  171. }
  172. float4 FragBilinearAlphaToRGBA(Varyings input) : SV_Target
  173. {
  174. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
  175. float2 uv = input.texcoord.xy;
  176. return SAMPLE_TEXTURE2D_X_LOD(_BlitTexture, sampler_LinearRepeat, uv, _BlitMipLevel).aaaa;
  177. }
  178. #endif //UNITY_CORE_BLIT_INCLUDED