137 lines
4.0 KiB
HLSL
137 lines
4.0 KiB
HLSL
|
#ifndef UNIVERSAL_POSTPROCESSING_SMAA_BRIDGE
|
||
|
#define UNIVERSAL_POSTPROCESSING_SMAA_BRIDGE
|
||
|
|
||
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
||
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||
|
#include "Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/Common.hlsl"
|
||
|
|
||
|
#define SMAA_HLSL_4_1
|
||
|
|
||
|
#if _SMAA_PRESET_LOW
|
||
|
#define SMAA_PRESET_LOW
|
||
|
#elif _SMAA_PRESET_MEDIUM
|
||
|
#define SMAA_PRESET_MEDIUM
|
||
|
#else
|
||
|
#define SMAA_PRESET_HIGH
|
||
|
#endif
|
||
|
|
||
|
TEXTURE2D_X(_ColorTexture);
|
||
|
TEXTURE2D_X(_BlendTexture);
|
||
|
TEXTURE2D(_AreaTexture);
|
||
|
TEXTURE2D(_SearchTexture);
|
||
|
|
||
|
float4 _Metrics;
|
||
|
|
||
|
#define SMAA_RT_METRICS _Metrics
|
||
|
#define SMAA_AREATEX_SELECT(s) s.rg
|
||
|
#define SMAA_SEARCHTEX_SELECT(s) s.a
|
||
|
#define LinearSampler sampler_LinearClamp
|
||
|
#define PointSampler sampler_PointClamp
|
||
|
|
||
|
#if UNITY_COLORSPACE_GAMMA
|
||
|
#define GAMMA_FOR_EDGE_DETECTION (1)
|
||
|
#else
|
||
|
#define GAMMA_FOR_EDGE_DETECTION (1/2.2)
|
||
|
#endif
|
||
|
|
||
|
#include "Packages/com.unity.render-pipelines.universal/Shaders/PostProcessing/SubpixelMorphologicalAntialiasing.hlsl"
|
||
|
|
||
|
// ----------------------------------------------------------------------------------------
|
||
|
// Edge Detection
|
||
|
|
||
|
struct VaryingsEdge
|
||
|
{
|
||
|
float4 positionCS : SV_POSITION;
|
||
|
float2 uv : TEXCOORD0;
|
||
|
float4 offsets[3] : TEXCOORD1;
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
VaryingsEdge VertEdge(Attributes input)
|
||
|
{
|
||
|
VaryingsEdge output;
|
||
|
UNITY_SETUP_INSTANCE_ID(input);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
||
|
#if _USE_DRAW_PROCEDURAL
|
||
|
GetProceduralQuad(input.vertexID, output.positionCS, output.uv);
|
||
|
#else
|
||
|
output.positionCS = TransformFullscreenMesh(input.positionOS.xyz);
|
||
|
output.uv = UnityStereoTransformScreenSpaceTex(input.uv);
|
||
|
#endif
|
||
|
SMAAEdgeDetectionVS(output.uv, output.offsets);
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
float4 FragEdge(VaryingsEdge input) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
||
|
return float4(SMAAColorEdgeDetectionPS(input.uv, input.offsets, _ColorTexture), 0.0, 0.0);
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------------------------
|
||
|
// Blend Weights Calculation
|
||
|
|
||
|
struct VaryingsBlend
|
||
|
{
|
||
|
float4 positionCS : SV_POSITION;
|
||
|
float2 uv : TEXCOORD0;
|
||
|
float2 pixcoord : TEXCOORD1;
|
||
|
float4 offsets[3] : TEXCOORD2;
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
VaryingsBlend VertBlend(Attributes input)
|
||
|
{
|
||
|
VaryingsBlend output;
|
||
|
UNITY_SETUP_INSTANCE_ID(input);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
||
|
#if _USE_DRAW_PROCEDURAL
|
||
|
GetProceduralQuad(input.vertexID, output.positionCS, output.uv);
|
||
|
#else
|
||
|
output.positionCS = TransformFullscreenMesh(input.positionOS.xyz);
|
||
|
output.uv = UnityStereoTransformScreenSpaceTex(input.uv);
|
||
|
#endif
|
||
|
SMAABlendingWeightCalculationVS(output.uv, output.pixcoord, output.offsets);
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
float4 FragBlend(VaryingsBlend input) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
||
|
return SMAABlendingWeightCalculationPS(input.uv, input.pixcoord, input.offsets, _ColorTexture, _AreaTexture, _SearchTexture, 0);
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------------------------
|
||
|
// Neighborhood Blending
|
||
|
|
||
|
struct VaryingsNeighbor
|
||
|
{
|
||
|
float4 positionCS : SV_POSITION;
|
||
|
float2 uv : TEXCOORD0;
|
||
|
float4 offset : TEXCOORD1;
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
VaryingsNeighbor VertNeighbor(Attributes input)
|
||
|
{
|
||
|
VaryingsNeighbor output;
|
||
|
UNITY_SETUP_INSTANCE_ID(input);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
||
|
#if _USE_DRAW_PROCEDURAL
|
||
|
GetProceduralQuad(input.vertexID, output.positionCS, output.uv);
|
||
|
#else
|
||
|
output.positionCS = TransformFullscreenMesh(input.positionOS.xyz);
|
||
|
output.uv = UnityStereoTransformScreenSpaceTex(input.uv);
|
||
|
#endif
|
||
|
SMAANeighborhoodBlendingVS(output.uv, output.offset);
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
float4 FragNeighbor(VaryingsNeighbor input) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
||
|
return SMAANeighborhoodBlendingPS(input.uv, input.offset, _ColorTexture, _BlendTexture);
|
||
|
}
|
||
|
|
||
|
#endif // UNIVERSAL_POSTPROCESSING_SMAA_BRIDGE
|