148 lines
4.8 KiB
GLSL
148 lines
4.8 KiB
GLSL
Shader "02_Selection/Fullscreen"
|
|
{
|
|
properties
|
|
{
|
|
_SamplePrecision ("Sampling Precision", Range(1,3) ) = 1
|
|
_OutlineWidth ("Outline Width", Float ) = 5
|
|
|
|
_InnerColor ("Inner Color", Color) = (1, 1, 0, 0.5)
|
|
_OuterColor( "Outer Color", Color ) = (1, 1, 0, 1)
|
|
_Texture ("Texture", 2D ) = "black" {}
|
|
_TextureSize("Texture Pixels Size", Vector) = (64,64,0,0)
|
|
|
|
_BehindFactor("Behind Factor", Range(0,1)) = 0.2
|
|
}
|
|
|
|
HLSLINCLUDE
|
|
|
|
#pragma vertex Vert
|
|
|
|
#pragma target 4.5
|
|
#pragma only_renderers d3d11 ps4 xboxone vulkan metal switch
|
|
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassCommon.hlsl"
|
|
|
|
// The PositionInputs struct allow you to retrieve a lot of useful information for your fullScreenShader:
|
|
// struct PositionInputs
|
|
// {
|
|
// float3 positionWS; // World space position (could be camera-relative)
|
|
// float2 positionNDC; // Normalized screen coordinates within the viewport : [0, 1) (with the half-pixel offset)
|
|
// uint2 positionSS; // Screen space pixel coordinates : [0, NumPixels)
|
|
// uint2 tileCoord; // Screen tile coordinates : [0, NumTiles)
|
|
// float deviceDepth; // Depth from the depth buffer : [0, 1] (typically reversed)
|
|
// float linearDepth; // View space Z coordinate : [Near, Far]
|
|
// };
|
|
|
|
// To sample custom buffers, you have access to these functions:
|
|
// But be careful, on most platforms you can't sample to the bound color buffer. It means that you
|
|
// can't use the SampleCustomColor when the pass color buffer is set to custom (and same for camera the buffer).
|
|
// float3 SampleCustomColor(float2 uv);
|
|
// float3 LoadCustomColor(uint2 pixelCoords);
|
|
// float LoadCustomDepth(uint2 pixelCoords);
|
|
// float SampleCustomDepth(float2 uv);
|
|
|
|
// There are also a lot of utility function you can use inside Common.hlsl and Color.hlsl,
|
|
// you can check them out in the source code of the core SRP package.
|
|
|
|
#define v2 1.41421
|
|
#define c45 0.707107
|
|
#define c225 0.9238795
|
|
#define s225 0.3826834
|
|
|
|
#define MAXSAMPLES 16
|
|
static float2 offsets[MAXSAMPLES] = {
|
|
float2( 1, 0 ),
|
|
float2( -1, 0 ),
|
|
float2( 0, 1 ),
|
|
float2( 0, -1 ),
|
|
|
|
float2( c45, c45 ),
|
|
float2( c45, -c45 ),
|
|
float2( -c45, c45 ),
|
|
float2( -c45, -c45 ),
|
|
|
|
float2( c225, s225 ),
|
|
float2( c225, -s225 ),
|
|
float2( -c225, s225 ),
|
|
float2( -c225, -s225 ),
|
|
float2( s225, c225 ),
|
|
float2( s225, -c225 ),
|
|
float2( -s225, c225 ),
|
|
float2( -s225, -c225 )
|
|
};
|
|
|
|
int _SamplePrecision;
|
|
float _OutlineWidth;
|
|
|
|
float4 _InnerColor;
|
|
float4 _OuterColor;
|
|
|
|
Texture2D _Texture;
|
|
float2 _TextureSize;
|
|
|
|
float _BehindFactor;
|
|
|
|
float4 FullScreenPass(Varyings varyings) : SV_Target
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(varyings);
|
|
|
|
float depth = LoadCameraDepth(varyings.positionCS.xy);
|
|
PositionInputs posInput = GetPositionInput(varyings.positionCS.xy, _ScreenSize.zw, depth, UNITY_MATRIX_I_VP, UNITY_MATRIX_V);
|
|
float3 viewDirection = GetWorldSpaceNormalizeViewDir(posInput.positionWS);
|
|
|
|
float d = LoadCustomDepth(posInput.positionSS);
|
|
float db = LoadCameraDepth(posInput.positionSS);
|
|
|
|
float alphaFactor = (db>d)?_BehindFactor:1;
|
|
|
|
float4 c = LoadCustomColor(posInput.positionSS);
|
|
|
|
float obj = c.a;
|
|
|
|
uint offset = 5;
|
|
|
|
uint sampleCount = min( 2 * pow(2, _SamplePrecision ), MAXSAMPLES ) ;
|
|
|
|
float4 outline = float4(0,0,0,0);
|
|
|
|
float2 uvOffsetPerPixel = 1.0/_ScreenSize .xy;
|
|
|
|
for (uint i=0 ; i<sampleCount ; ++i )
|
|
{
|
|
outline = max( SampleCustomColor( posInput.positionNDC + uvOffsetPerPixel * _OutlineWidth * offsets[i] ), outline );
|
|
}
|
|
|
|
float4 o = float4(0,0,0,0);
|
|
|
|
float4 innerColor = SAMPLE_TEXTURE2D( _Texture, s_trilinear_repeat_sampler, posInput.positionSS / _TextureSize) * _InnerColor;
|
|
|
|
innerColor.a *= alphaFactor;
|
|
|
|
o = lerp(o, _OuterColor * float4(outline.rgb, 1), outline.a);
|
|
|
|
o = lerp( o, innerColor * float4(c.rgb, 1), obj);
|
|
|
|
return o;
|
|
}
|
|
|
|
ENDHLSL
|
|
|
|
SubShader
|
|
{
|
|
Pass
|
|
{
|
|
Name "Custom Pass 0"
|
|
|
|
ZWrite Off
|
|
ZTest Always
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
Cull Off
|
|
|
|
HLSLPROGRAM
|
|
#pragma fragment FullScreenPass
|
|
ENDHLSL
|
|
}
|
|
}
|
|
Fallback Off
|
|
}
|