ArabDesert/Assets/USharpVideo/Shaders/CRTRenderTextureProcessor.s...

82 lines
2.9 KiB
Plaintext

Shader "Merlin/World/Render Texture Processor"
{
Properties
{
[HDR]_Color("Color", Color) = (1, 1, 1, 1)
_SourceTexture("Source Texture", 2D) = "black"
_IsAVPro("Is AV Pro", Int) = 0
_TargetAspectRatio("Target Aspect Ratio", Float) = 1.77777777
}
SubShader
{
Tags { "RenderType" = "Opaque" }
Pass
{
Name "ResizeInput"
CGPROGRAM
#pragma vertex CustomRenderTextureVertexShader
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityCustomRenderTexture.cginc"
float4 _Color;
sampler2D_float _SourceTexture; float4 _SourceTexture_TexelSize; float4 _SourceTexture_ST;
int _IsAVPro;
float _TargetAspectRatio;
half3 VideoEmission(float2 uv)
{
uv = TRANSFORM_TEX(uv, _SourceTexture);
float2 emissionRes = _SourceTexture_TexelSize.zw;
float currentAspectRatio = emissionRes.x / emissionRes.y;
float visibility = 1.0;
// If the aspect ratio does not match the target ratio, then we fit the UVs to maintain the aspect ratio while fitting the range 0-1
if (abs(currentAspectRatio - _TargetAspectRatio) > 0.001)
{
float2 normalizedVideoRes = float2(emissionRes.x / _TargetAspectRatio, emissionRes.y);
float2 correctiveScale;
// Find which axis is greater, we will clamp to that
if (normalizedVideoRes.x > normalizedVideoRes.y)
correctiveScale = float2(1, normalizedVideoRes.y / normalizedVideoRes.x);
else
correctiveScale = float2(normalizedVideoRes.x / normalizedVideoRes.y, 1);
uv = ((uv - 0.5) / correctiveScale) + 0.5;
// Antialiasing on UV clipping
//float2 uvPadding = 0;
//float2 uvfwidth = fwidth(uv.xy);
//float2 maxFactor = smoothstep(uvfwidth + uvPadding + 1, uvPadding + 1, uv.xy);
//float2 minFactor = smoothstep(-uvfwidth - uvPadding, -uvPadding, uv.xy);
//visibility = maxFactor.x * maxFactor.y * minFactor.x * minFactor.y;
}
if (any(uv <= 0) || any(uv >= 1))
return float3(0, 0, 0);
float3 texColor = tex2D(_SourceTexture, _IsAVPro ? float2(uv.x, 1 - uv.y) : uv).rgb;
if (_IsAVPro)
texColor = pow(texColor, 2.2f);
return texColor * _Color.rgb * visibility;
}
float4 frag (v2f_customrendertexture i) : SV_Target
{
return float4(VideoEmission(i.globalTexcoord), 1);
}
ENDCG
}
}
}