50 lines
1.5 KiB
HLSL
50 lines
1.5 KiB
HLSL
// This file contains functionality to apply Fog as a deferred, full-screen post-processing pass.
|
|
// Requires depth texture as input.
|
|
#ifndef UNIVERSAL_FOG_DEFERRED
|
|
#define UNIVERSAL_FOG_DEFERRED
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/GBufferInput.hlsl"
|
|
|
|
struct Attributes
|
|
{
|
|
float4 positionOS : POSITION;
|
|
uint vertexID : SV_VertexID;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
Varyings Vertex(Attributes input)
|
|
{
|
|
Varyings output = (Varyings)0;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
UNITY_TRANSFER_INSTANCE_ID(input, output);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
|
|
float3 positionOS = input.positionOS.xyz;
|
|
output.positionCS = float4(positionOS.xy, UNITY_RAW_FAR_CLIP_VALUE, 1.0); // Force triangle to be on zfar
|
|
|
|
return output;
|
|
}
|
|
|
|
half4 Frag(Varyings input) : SV_Target
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
|
|
GBufferData gBufferData = UnpackGBuffers(input.positionCS.xy);
|
|
float viewZ = LinearEyeDepth(gBufferData.depth, _ZBufferParams); // TODO: This wont work for orthographic camera!
|
|
float nearToFarZ = max(viewZ - _ProjectionParams.y, 0);
|
|
half fogFactor = ComputeFogFactorZ0ToFar(nearToFarZ);
|
|
half fogIntensity = ComputeFogIntensity(fogFactor);
|
|
|
|
return half4(unity_FogColor.rgb, fogIntensity);
|
|
}
|
|
|
|
#endif
|