121 lines
3.6 KiB
HLSL
121 lines
3.6 KiB
HLSL
#ifndef UNITY_POSTFX_SMAA_BRIDGE
|
|
#define UNITY_POSTFX_SMAA_BRIDGE
|
|
|
|
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
|
|
|
|
TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
|
|
TEXTURE2D_SAMPLER2D(_BlendTex, sampler_BlendTex);
|
|
TEXTURE2D_SAMPLER2D(_AreaTex, sampler_AreaTex);
|
|
TEXTURE2D_SAMPLER2D(_SearchTex, sampler_SearchTex);
|
|
float4 _MainTex_TexelSize;
|
|
|
|
#define SMAA_RT_METRICS _MainTex_TexelSize
|
|
#define SMAA_AREATEX_SELECT(s) s.rg
|
|
#define SMAA_SEARCHTEX_SELECT(s) s.a
|
|
#define LinearSampler sampler_MainTex
|
|
#define PointSampler sampler_MainTex
|
|
|
|
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/Builtins/SubpixelMorphologicalAntialiasing.hlsl"
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// Edge Detection
|
|
|
|
struct VaryingsEdge
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 texcoord : TEXCOORD0;
|
|
float4 offsets[3] : TEXCOORD1;
|
|
};
|
|
|
|
VaryingsEdge VertEdge(AttributesDefault v)
|
|
{
|
|
VaryingsEdge o;
|
|
o.vertex = float4(v.vertex.xy, 0.0, 1.0);
|
|
o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
|
|
#endif
|
|
|
|
o.offsets[0] = mad(SMAA_RT_METRICS.xyxy, float4(-1.0, 0.0, 0.0, -1.0), o.texcoord.xyxy);
|
|
o.offsets[1] = mad(SMAA_RT_METRICS.xyxy, float4( 1.0, 0.0, 0.0, 1.0), o.texcoord.xyxy);
|
|
o.offsets[2] = mad(SMAA_RT_METRICS.xyxy, float4(-2.0, 0.0, 0.0, -2.0), o.texcoord.xyxy);
|
|
|
|
return o;
|
|
}
|
|
|
|
float4 FragEdge(VaryingsEdge i) : SV_Target
|
|
{
|
|
return float4(SMAAColorEdgeDetectionPS(i.texcoord, i.offsets, _MainTex), 0.0, 0.0);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// Blend Weights Calculation
|
|
|
|
struct VaryingsBlend
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 texcoord : TEXCOORD0;
|
|
float2 pixcoord : TEXCOORD1;
|
|
float4 offsets[3] : TEXCOORD2;
|
|
};
|
|
|
|
VaryingsBlend VertBlend(AttributesDefault v)
|
|
{
|
|
VaryingsBlend o;
|
|
o.vertex = float4(v.vertex.xy, 0.0, 1.0);
|
|
o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
|
|
#endif
|
|
|
|
o.pixcoord = o.texcoord * SMAA_RT_METRICS.zw;
|
|
|
|
// We will use these offsets for the searches later on (see @PSEUDO_GATHER4):
|
|
o.offsets[0] = mad(SMAA_RT_METRICS.xyxy, float4(-0.250, -0.125, 1.250, -0.125), o.texcoord.xyxy);
|
|
o.offsets[1] = mad(SMAA_RT_METRICS.xyxy, float4(-0.125, -0.250, -0.125, 1.250), o.texcoord.xyxy);
|
|
|
|
// And these for the searches, they indicate the ends of the loops:
|
|
o.offsets[2] = mad(SMAA_RT_METRICS.xxyy, float4(-2.0, 2.0, -2.0, 2.0) * float(SMAA_MAX_SEARCH_STEPS),
|
|
float4(o.offsets[0].xz, o.offsets[1].yw));
|
|
|
|
return o;
|
|
}
|
|
|
|
float4 FragBlend(VaryingsBlend i) : SV_Target
|
|
{
|
|
return SMAABlendingWeightCalculationPS(i.texcoord, i.pixcoord, i.offsets, _MainTex, _AreaTex, _SearchTex, 0);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// Neighborhood Blending
|
|
|
|
struct VaryingsNeighbor
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 texcoord : TEXCOORD0;
|
|
float4 offset : TEXCOORD1;
|
|
};
|
|
|
|
VaryingsNeighbor VertNeighbor(AttributesDefault v)
|
|
{
|
|
VaryingsNeighbor o;
|
|
o.vertex = float4(v.vertex.xy, 0.0, 1.0);
|
|
o.texcoord = TransformTriangleVertexToUV(v.vertex.xy);
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
|
|
#endif
|
|
|
|
o.offset = mad(SMAA_RT_METRICS.xyxy, float4(1.0, 0.0, 0.0, 1.0), o.texcoord.xyxy);
|
|
return o;
|
|
}
|
|
|
|
float4 FragNeighbor(VaryingsNeighbor i) : SV_Target
|
|
{
|
|
return SMAANeighborhoodBlendingPS(i.texcoord, i.offset, _MainTex, _BlendTex);
|
|
}
|
|
|
|
#endif
|