SubpixelMorphologicalAntialiasingBridge.hlsl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifndef UNITY_POSTFX_SMAA_BRIDGE
  2. #define UNITY_POSTFX_SMAA_BRIDGE
  3. #include "../StdLib.hlsl"
  4. TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
  5. TEXTURE2D_SAMPLER2D(_BlendTex, sampler_BlendTex);
  6. TEXTURE2D_SAMPLER2D(_AreaTex, sampler_AreaTex);
  7. TEXTURE2D_SAMPLER2D(_SearchTex, sampler_SearchTex);
  8. float4 _MainTex_TexelSize;
  9. #define SMAA_RT_METRICS _MainTex_TexelSize
  10. #define SMAA_AREATEX_SELECT(s) s.rg
  11. #define SMAA_SEARCHTEX_SELECT(s) s.a
  12. #define LinearSampler sampler_MainTex
  13. #define PointSampler sampler_MainTex
  14. #include "SubpixelMorphologicalAntialiasing.hlsl"
  15. // ----------------------------------------------------------------------------------------
  16. // Edge Detection
  17. struct VaryingsEdge
  18. {
  19. float4 vertex : SV_POSITION;
  20. float2 texcoord : TEXCOORD0;
  21. float4 offsets[3] : TEXCOORD1;
  22. };
  23. VaryingsEdge VertEdge(AttributesDefault v)
  24. {
  25. VaryingsEdge o;
  26. o.vertex = float4(v.vertex.xy, 0.0, 1.0);
  27. o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
  28. #if UNITY_UV_STARTS_AT_TOP
  29. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  30. #endif
  31. o.offsets[0] = mad(SMAA_RT_METRICS.xyxy, float4(-1.0, 0.0, 0.0, -1.0), o.texcoord.xyxy);
  32. o.offsets[1] = mad(SMAA_RT_METRICS.xyxy, float4( 1.0, 0.0, 0.0, 1.0), o.texcoord.xyxy);
  33. o.offsets[2] = mad(SMAA_RT_METRICS.xyxy, float4(-2.0, 0.0, 0.0, -2.0), o.texcoord.xyxy);
  34. return o;
  35. }
  36. float4 FragEdge(VaryingsEdge i) : SV_Target
  37. {
  38. return float4(SMAAColorEdgeDetectionPS(i.texcoord, i.offsets, _MainTex), 0.0, 0.0);
  39. }
  40. // ----------------------------------------------------------------------------------------
  41. // Blend Weights Calculation
  42. struct VaryingsBlend
  43. {
  44. float4 vertex : SV_POSITION;
  45. float2 texcoord : TEXCOORD0;
  46. float2 pixcoord : TEXCOORD1;
  47. float4 offsets[3] : TEXCOORD2;
  48. };
  49. VaryingsBlend VertBlend(AttributesDefault v)
  50. {
  51. VaryingsBlend o;
  52. o.vertex = float4(v.vertex.xy, 0.0, 1.0);
  53. o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
  54. #if UNITY_UV_STARTS_AT_TOP
  55. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  56. #endif
  57. o.pixcoord = o.texcoord * SMAA_RT_METRICS.zw;
  58. // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):
  59. o.offsets[0] = mad(SMAA_RT_METRICS.xyxy, float4(-0.250, -0.125, 1.250, -0.125), o.texcoord.xyxy);
  60. o.offsets[1] = mad(SMAA_RT_METRICS.xyxy, float4(-0.125, -0.250, -0.125, 1.250), o.texcoord.xyxy);
  61. // And these for the searches, they indicate the ends of the loops:
  62. o.offsets[2] = mad(SMAA_RT_METRICS.xxyy, float4(-2.0, 2.0, -2.0, 2.0) * float(SMAA_MAX_SEARCH_STEPS),
  63. float4(o.offsets[0].xz, o.offsets[1].yw));
  64. return o;
  65. }
  66. float4 FragBlend(VaryingsBlend i) : SV_Target
  67. {
  68. return SMAABlendingWeightCalculationPS(i.texcoord, i.pixcoord, i.offsets, _MainTex, _AreaTex, _SearchTex, 0);
  69. }
  70. // ----------------------------------------------------------------------------------------
  71. // Neighborhood Blending
  72. struct VaryingsNeighbor
  73. {
  74. float4 vertex : SV_POSITION;
  75. float2 texcoord : TEXCOORD0;
  76. float4 offset : TEXCOORD1;
  77. };
  78. VaryingsNeighbor VertNeighbor(AttributesDefault v)
  79. {
  80. VaryingsNeighbor o;
  81. o.vertex = float4(v.vertex.xy, 0.0, 1.0);
  82. o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
  83. #if UNITY_UV_STARTS_AT_TOP
  84. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  85. #endif
  86. o.offset = mad(SMAA_RT_METRICS.xyxy, float4(1.0, 0.0, 0.0, 1.0), o.texcoord.xyxy);
  87. return o;
  88. }
  89. float4 FragNeighbor(VaryingsNeighbor i) : SV_Target
  90. {
  91. return SMAANeighborhoodBlendingPS(i.texcoord, i.offset, _MainTex, _BlendTex);
  92. }
  93. #endif