173 lines
5.1 KiB
HLSL
173 lines
5.1 KiB
HLSL
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/AtmosphericScattering/AtmosphericScattering.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Builtin/BuiltinData.hlsl"
|
|
|
|
void VFXEncodeMotionVector(float2 motionVec, out float4 outBuffer)
|
|
{
|
|
EncodeMotionVector(motionVec, outBuffer);
|
|
outBuffer.zw = 1.0f;
|
|
}
|
|
|
|
float4 VFXTransformPositionWorldToNonJitteredClip(float3 posWS)
|
|
{
|
|
#if VFX_WORLD_SPACE
|
|
posWS = GetCameraRelativePositionWS(posWS);
|
|
#endif
|
|
return mul(UNITY_MATRIX_UNJITTERED_VP, float4(posWS, 1.0f));
|
|
}
|
|
|
|
float4 VFXTransformPositionWorldToPreviousClip(float3 posWS)
|
|
{
|
|
#if VFX_WORLD_SPACE
|
|
posWS = GetCameraRelativePositionWS(posWS);
|
|
#endif
|
|
return mul(UNITY_MATRIX_PREV_VP, float4(posWS, 1.0f));
|
|
}
|
|
|
|
#ifdef VFX_VARYING_PS_INPUTS
|
|
void VFXTransformPSInputs(inout VFX_VARYING_PS_INPUTS input)
|
|
{
|
|
#if IS_TRANSPARENT_PARTICLE && defined(VFX_VARYING_POSCS)
|
|
// We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer.
|
|
input.VFX_VARYING_POSCS.xy = _OffScreenRendering > 0 ? (input.VFX_VARYING_POSCS.xy * _OffScreenDownsampleFactor) : input.VFX_VARYING_POSCS.xy;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
float4 VFXTransformFinalColor(float4 color)
|
|
{
|
|
#ifdef DEBUG_DISPLAY
|
|
if (_DebugFullScreenMode == FULLSCREENDEBUGMODE_TRANSPARENCY_OVERDRAW)
|
|
{
|
|
color = _DebugTransparencyOverdrawWeight * float4(TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_COST, TRANSPARENCY_OVERDRAW_A);
|
|
}
|
|
|
|
#endif
|
|
return color;
|
|
}
|
|
|
|
float4 VFXTransformPositionWorldToClip(float3 posWS)
|
|
{
|
|
#if VFX_WORLD_SPACE
|
|
posWS = GetCameraRelativePositionWS(posWS);
|
|
#endif
|
|
return TransformWorldToHClip(posWS);
|
|
}
|
|
|
|
float4 VFXTransformPositionObjectToNonJitteredClip(float3 posOS)
|
|
{
|
|
float3 posWS = TransformObjectToWorld(posOS);
|
|
return mul(_NonJitteredViewProjMatrix, float4(posWS, 1.0f));
|
|
}
|
|
|
|
float4 VFXTransformPositionObjectToPreviousClip(float3 posOS)
|
|
{
|
|
float3 posWS = TransformPreviousObjectToWorld(posOS);
|
|
return mul(_PrevViewProjMatrix, float4(posWS, 1.0f));
|
|
}
|
|
|
|
float4 VFXTransformPositionObjectToClip(float3 posOS)
|
|
{
|
|
float3 posWS = TransformObjectToWorld(posOS);
|
|
return VFXTransformPositionWorldToClip(posWS);
|
|
}
|
|
|
|
float3 VFXTransformPositionWorldToView(float3 posWS)
|
|
{
|
|
#if VFX_WORLD_SPACE
|
|
posWS = GetCameraRelativePositionWS(posWS);
|
|
#endif
|
|
return TransformWorldToView(posWS);
|
|
}
|
|
|
|
float4x4 VFXGetObjectToWorldMatrix()
|
|
{
|
|
return GetObjectToWorldMatrix();
|
|
}
|
|
|
|
float4x4 VFXGetWorldToObjectMatrix()
|
|
{
|
|
return GetWorldToObjectMatrix();
|
|
}
|
|
|
|
float3x3 VFXGetWorldToViewRotMatrix()
|
|
{
|
|
return (float3x3)GetWorldToViewMatrix();
|
|
}
|
|
|
|
float3 VFXGetViewWorldPosition()
|
|
{
|
|
float3 pos = GetCurrentViewPosition();
|
|
#if VFX_WORLD_SPACE
|
|
pos = GetAbsolutePositionWS(pos);
|
|
#endif
|
|
return pos;
|
|
}
|
|
|
|
float4x4 VFXGetViewToWorldMatrix()
|
|
{
|
|
float4x4 viewToWorld = UNITY_MATRIX_I_V;
|
|
viewToWorld._14_24_34 = VFXGetViewWorldPosition();
|
|
return viewToWorld;
|
|
}
|
|
|
|
float VFXSampleDepth(float4 posSS)
|
|
{
|
|
return LoadCameraDepth(posSS.xy);
|
|
}
|
|
|
|
void VFXApplyShadowBias(inout float4 posCS, inout float3 posWS, float3 normalWS)
|
|
{
|
|
}
|
|
|
|
void VFXApplyShadowBias(inout float4 posCS, inout float3 posWS)
|
|
{
|
|
}
|
|
|
|
float3 VFXGetPositionRWS(float3 posWS); //Forward declaration because this function is actually implemented in VFXCommonOutput.hlsl (but expected to be used in fragment only)
|
|
float4 VFXApplyFog(float4 color,float4 posCS,float3 posWS)
|
|
{
|
|
float3 posRWS = VFXGetPositionRWS(posWS);
|
|
PositionInputs posInput = GetPositionInput(posCS.xy, _ScreenSize.zw, posCS.z, posCS.w, posRWS, uint2(0,0));
|
|
|
|
float3 V = GetWorldSpaceNormalizeViewDir(posRWS);
|
|
|
|
float3 volColor, volOpacity;
|
|
EvaluateAtmosphericScattering(posInput, V, volColor, volOpacity); // Premultiplied alpha
|
|
|
|
#if VFX_BLENDMODE_ALPHA
|
|
color.rgb = color.rgb * (1 - volOpacity) + volColor * color.a;
|
|
#elif VFX_BLENDMODE_ADD
|
|
color.rgb = color.rgb * (1.0 - volOpacity);
|
|
#elif VFX_BLENDMODE_PREMULTIPLY
|
|
color.rgb = color.rgb * (1 - volOpacity) + volColor * color.a;
|
|
// Note: this formula for color is correct, assuming we apply the Over operator afterwards
|
|
// (see the appendix in the Deep Compositing paper). But do we?
|
|
// Additionally, we do not modify the alpha here, which is most certainly WRONG.
|
|
#endif
|
|
|
|
return color;
|
|
}
|
|
|
|
#ifdef VFX_VARYING_PS_INPUTS
|
|
float4 VFXApplyPreExposure(float4 color, float exposureWeight)
|
|
{
|
|
float exposure = lerp(1.0f, GetCurrentExposureMultiplier(), exposureWeight);
|
|
color.xyz *= exposure;
|
|
return color;
|
|
}
|
|
|
|
float4 VFXApplyPreExposure(float4 color, VFX_VARYING_PS_INPUTS input)
|
|
{
|
|
#ifdef VFX_VARYING_EXPOSUREWEIGHT
|
|
return VFXApplyPreExposure(color, input.VFX_VARYING_EXPOSUREWEIGHT);
|
|
#elif VFX_BYPASS_EXPOSURE
|
|
return VFXApplyPreExposure(color, 0.0f);
|
|
#else
|
|
return VFXApplyPreExposure(color, 1.0f);
|
|
#endif
|
|
}
|
|
#endif
|