109 lines
5.4 KiB
HLSL
109 lines
5.4 KiB
HLSL
|
#ifndef POI_GRAB
|
||
|
#define POI_GRAB
|
||
|
|
||
|
float _RefractionIndex;
|
||
|
float _RefractionOpacity;
|
||
|
float _RefractionChromaticAberattion;
|
||
|
float _RefractionEnabled;
|
||
|
uint _SourceBlend, _DestinationBlend;
|
||
|
float _GrabBlurDistance;
|
||
|
|
||
|
UNITY_DECLARE_TEX2D_NOSAMPLER(_RefractionOpacityMask); float4 _RefractionOpacityMask_ST;
|
||
|
|
||
|
inline float4 Refraction(float indexOfRefraction, float chromaticAberration, float2 projectedGrabPos)
|
||
|
{
|
||
|
float4 refractionColor;
|
||
|
float3 worldViewDir = normalize(UnityWorldSpaceViewDir(poiMesh.worldPos));
|
||
|
float3 refractionOffset = ((((indexOfRefraction - 1.0) * mul(UNITY_MATRIX_V, float4(poiMesh.normals[1], 0.0))) * (1.0 / (poiCam.grabPos.z + 1.0))) * (1.0 - dot(poiMesh.normals[1], worldViewDir)));
|
||
|
float2 cameraRefraction = float2(refractionOffset.x, - (refractionOffset.y * _ProjectionParams.x));
|
||
|
//return tex2D(_PoiGrab, (projgrabPos + cameraRefraction));
|
||
|
UNITY_BRANCH
|
||
|
if (_RefractionChromaticAberattion > 0)
|
||
|
{
|
||
|
float4 redAlpha = tex2D(_PoiGrab, (projectedGrabPos + cameraRefraction));
|
||
|
float green = tex2D(_PoiGrab, (projectedGrabPos + (cameraRefraction * (1.0 - chromaticAberration)))).g;
|
||
|
float blue = tex2D(_PoiGrab, (projectedGrabPos + (cameraRefraction * (1.0 + chromaticAberration)))).b;
|
||
|
refractionColor = float4(redAlpha.r, green, blue, redAlpha.a);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
float2 refractedGrab = projectedGrabPos + cameraRefraction;
|
||
|
refractionColor = tex2D(_PoiGrab, (refractedGrab));
|
||
|
#ifdef CHROMATIC_ABERRATION_LOW
|
||
|
float3 offset = float3(0.0, .05, .12);
|
||
|
float3 weight = float3(0.2270270270, 0.3162162162, 0.0702702703) * .5;
|
||
|
refractionColor *= weight[0];
|
||
|
|
||
|
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab + float2(0.0, offset.y * _GrabBlurDistance)) * weight.y;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab - float2(0.0, offset.y * _GrabBlurDistance)) * weight.y;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab + float2(0.0, offset.z * _GrabBlurDistance)) * weight.z;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab - float2(0.0, offset.z * _GrabBlurDistance)) * weight.z;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab + float2(offset.y * _GrabBlurDistance, 0.0)) * weight.y;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab - float2(offset.y * _GrabBlurDistance, 0.0)) * weight.y;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab + float2(offset.z * _GrabBlurDistance, 0.0)) * weight.z;
|
||
|
refractionColor += tex2D(_PoiGrab, refractedGrab - float2(offset.z * _GrabBlurDistance, 0.0)) * weight.z;
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
return refractionColor;
|
||
|
}
|
||
|
|
||
|
void calculateRefraction(float2 projectedGrabPos, inout float4 finalColor)
|
||
|
{
|
||
|
float3 refraction = 1;
|
||
|
UNITY_BRANCH
|
||
|
if(_RefractionEnabled == 1)
|
||
|
{
|
||
|
refraction = Refraction(_RefractionIndex, _RefractionChromaticAberattion, projectedGrabPos).rgb;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
refraction = tex2Dproj(_PoiGrab, poiCam.grabPos);
|
||
|
|
||
|
#ifdef CHROMATIC_ABERRATION_LOW
|
||
|
float3 offset = float3(0.0, .05, .12);
|
||
|
float3 weight = float3(0.2270270270, 0.3162162162, 0.0702702703) * .5;
|
||
|
refraction *= weight[0];
|
||
|
|
||
|
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos + float2(0.0, offset.y * _GrabBlurDistance)) * weight.y;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos - float2(0.0, offset.y * _GrabBlurDistance)) * weight.y;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos + float2(0.0, offset.z * _GrabBlurDistance)) * weight.z;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos - float2(0.0, offset.z * _GrabBlurDistance)) * weight.z;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos + float2(offset.y * _GrabBlurDistance, 0.0)) * weight.y;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos - float2(offset.y * _GrabBlurDistance, 0.0)) * weight.y;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos + float2(offset.z * _GrabBlurDistance, 0.0)) * weight.z;
|
||
|
refraction += tex2D(_PoiGrab, projectedGrabPos - float2(offset.z * _GrabBlurDistance, 0.0)) * weight.z;
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
finalColor.a *= alphaMask;
|
||
|
finalColor = poiBlend(_SourceBlend, finalColor, _DestinationBlend, float4(refraction, 1));
|
||
|
finalColor.a = 1;
|
||
|
}
|
||
|
|
||
|
float2 calculateGrabPosition()
|
||
|
{
|
||
|
float4 grabPos = poiCam.grabPos;
|
||
|
#if UNITY_UV_STARTS_AT_TOP
|
||
|
float scale = -1.0;
|
||
|
#else
|
||
|
float scale = 1.0;
|
||
|
#endif
|
||
|
float halfPosW = grabPos.w * 0.5;
|
||
|
grabPos.y = (grabPos.y - halfPosW) * _ProjectionParams.x * scale + halfPosW;
|
||
|
#if SHADER_API_D3D9 || SHADER_API_D3D11
|
||
|
grabPos.w += 0.00000000001;
|
||
|
#endif
|
||
|
return(grabPos / grabPos.w).xy;
|
||
|
}
|
||
|
|
||
|
void applyGrabEffects(inout float4 finalColor)
|
||
|
{
|
||
|
float2 projectedGrabPos = calculateGrabPosition();
|
||
|
calculateRefraction(projectedGrabPos, finalColor);
|
||
|
}
|
||
|
|
||
|
#endif
|