122 lines
3.2 KiB
HLSL
122 lines
3.2 KiB
HLSL
|
#ifndef UNITY_POSTFX_SMAA_BRIDGE
|
||
|
#define UNITY_POSTFX_SMAA_BRIDGE
|
||
|
|
||
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
||
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
|
||
|
|
||
|
#define SMAA_HLSL_4_1
|
||
|
|
||
|
TEXTURE2D_X(_InputTexture);
|
||
|
TEXTURE2D_X(_BlendTex);
|
||
|
TEXTURE2D(_AreaTex);
|
||
|
TEXTURE2D(_SearchTex);
|
||
|
|
||
|
float4 _SMAARTMetrics;
|
||
|
|
||
|
#define SMAA_RT_METRICS _SMAARTMetrics
|
||
|
#define SMAA_AREATEX_SELECT(s) s.rg
|
||
|
#define SMAA_SEARCHTEX_SELECT(s) s.a
|
||
|
#define LinearSampler s_linear_clamp_sampler
|
||
|
#define PointSampler s_point_clamp_sampler
|
||
|
#define GAMMA_FOR_EDGE_DETECTION (1/2.2)
|
||
|
|
||
|
#include "SubpixelMorphologicalAntialiasing.hlsl"
|
||
|
|
||
|
struct Attributes
|
||
|
{
|
||
|
uint vertexID : SV_VertexID;
|
||
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||
|
};
|
||
|
|
||
|
// ----------------------------------------------------------------------------------------
|
||
|
// Edge Detection
|
||
|
|
||
|
struct VaryingsEdge
|
||
|
{
|
||
|
float4 vertex : SV_POSITION;
|
||
|
float2 texcoord : TEXCOORD0;
|
||
|
float4 offsets[3] : TEXCOORD1;
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
VaryingsEdge VertEdge(Attributes v)
|
||
|
{
|
||
|
VaryingsEdge o;
|
||
|
UNITY_SETUP_INSTANCE_ID(v);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||
|
o.vertex = GetFullScreenTriangleVertexPosition(v.vertexID);
|
||
|
o.texcoord = GetFullScreenTriangleTexCoord(v.vertexID);
|
||
|
|
||
|
SMAAEdgeDetectionVS(o.texcoord, o.offsets);
|
||
|
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
float4 FragEdge(VaryingsEdge i) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||
|
return float4(SMAAColorEdgeDetectionPS(i.texcoord, i.offsets, _InputTexture), 0.0, 0.0);
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------------------------
|
||
|
// Blend Weights Calculation
|
||
|
|
||
|
struct VaryingsBlend
|
||
|
{
|
||
|
float4 vertex : SV_POSITION;
|
||
|
float2 texcoord : TEXCOORD0;
|
||
|
float2 pixcoord : TEXCOORD1;
|
||
|
float4 offsets[3] : TEXCOORD2;
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
VaryingsBlend VertBlend(Attributes v)
|
||
|
{
|
||
|
VaryingsBlend o;
|
||
|
UNITY_SETUP_INSTANCE_ID(v);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||
|
o.vertex = GetFullScreenTriangleVertexPosition(v.vertexID);
|
||
|
o.texcoord = GetFullScreenTriangleTexCoord(v.vertexID);
|
||
|
|
||
|
SMAABlendingWeightCalculationVS(o.texcoord, o.pixcoord, o.offsets);
|
||
|
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
float4 FragBlend(VaryingsBlend i) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||
|
return SMAABlendingWeightCalculationPS(i.texcoord, i.pixcoord, i.offsets, _InputTexture, _AreaTex, _SearchTex, 0);
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------------------------
|
||
|
// Neighborhood Blending
|
||
|
|
||
|
struct VaryingsNeighbor
|
||
|
{
|
||
|
float4 vertex : SV_POSITION;
|
||
|
float2 texcoord : TEXCOORD0;
|
||
|
float4 offset : TEXCOORD1;
|
||
|
UNITY_VERTEX_OUTPUT_STEREO
|
||
|
};
|
||
|
|
||
|
VaryingsNeighbor VertNeighbor(Attributes v)
|
||
|
{
|
||
|
VaryingsNeighbor o;
|
||
|
UNITY_SETUP_INSTANCE_ID(v);
|
||
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||
|
o.vertex = GetFullScreenTriangleVertexPosition(v.vertexID);
|
||
|
o.texcoord = GetFullScreenTriangleTexCoord(v.vertexID);
|
||
|
|
||
|
SMAANeighborhoodBlendingVS(o.texcoord, o.offset);
|
||
|
return o;
|
||
|
}
|
||
|
|
||
|
float4 FragNeighbor(VaryingsNeighbor i) : SV_Target
|
||
|
{
|
||
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
||
|
return SMAANeighborhoodBlendingPS(i.texcoord, i.offset, _InputTexture, _BlendTex);
|
||
|
}
|
||
|
|
||
|
#endif
|