使用POW解决曝光问题
Shader "Video/YUV"
{
Properties
{
VideoTexY("Image Y", 2D) = "white" {}
VideoTexU("Image U", 2D) = "white" {}
VideoTexV("Image V", 2D) = "white" {}
}
SubShader
{
Cull Off ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D VideoTexY;
sampler2D VideoTexU;
sampler2D VideoTexV;
fixed4 frag(v2f i) : SV_Target
{
half2 uv = i.uv;
uv.y = 1 - uv.y;
half y = tex2D(VideoTexY, uv).a;
uv = i.uv;
uv.y = 1 - uv.y;
half u = tex2D(VideoTexU, uv).a;
uv = i.uv;
uv.y = 1 - uv.y;
half v = tex2D(VideoTexV, uv).a;
float r = y + 1.370705 * (v - 0.5);
float g = y - 0.698001 * (v - 0.5) - 0.337633 * (u - 0.5);
float b = y + 1.732446 * (u - 0.5);
r = clamp(r,0,1.0);
g = clamp(g,0,1.0);
b = clamp(b,0,1.0);
//解决曝光问题
r = pow(r, 2.2);
g = pow(g, 2.2);
b = pow(b, 2.2);
return fixed4(r,g,b,1);
}
ENDCG
}
}
}