透明视频"/>
Unity 透明视频
一、问题
有时候图片序列帧太大占用存储和运行IO,故采取透明视频方式处理。制作透明视频相比普通视频大小就会变小,但是如果还是不是很理想,可以进行视频压缩。
二、视频格式和压缩
视频是不带通道视频,格式为MP4,压缩我使用的ffmpeg,命令如下
ffmpeg -i test.mp4 -vcodec libx264 -preset veryslow -crf 28 test-output1.mp4
三、Unity 透明视频
主要通过shader实现,新建shader 复制如下内容,然后新建材质,然后给RawImage和VideoPlayer托入改材质
SimpleAlpha.shader
Shader "Custom/SimpleAlpha"
{Properties{_MainTex("Base (RGB)", 2D) = "white" {}_FilterfColor("Ridof (RGB)",Color) = (1,1,1,1)}SubShader{Tags { "RenderType" = "Opaque" }Blend SrcAlpha OneMinusSrcAlphapass{CGPROGRAM#pragma vertex vertext_convert#pragma fragment fragment_convert#include "UnityCG.cginc" sampler2D _MainTex;sampler2D _MainTex1;float4 _FilterfColor;struct Inputvrite{float4 vertex : POSITION;float4 texcoord : TEXCOORD0;};struct Inputfragment{float4 pos : SV_POSITION;float4 uv : TEXCOORD0;};float ColorLerp(float3 tmp_nowcolor,float3 tmp_FilterfColor){float3 dis = float3(abs(tmp_nowcolor.x - tmp_FilterfColor.x),abs(tmp_nowcolor.y - tmp_FilterfColor.y),abs(tmp_nowcolor.z - tmp_FilterfColor.z));float dis0 = sqrt(pow(dis.x,2) + pow(dis.y,2) + pow(dis.z,2));float maxdis = sqrt(3);float dis1 = lerp(0,maxdis,dis0);return dis1;}Inputfragment vertext_convert(Inputvrite i){Inputfragment o;o.pos = UnityObjectToClipPos(i.vertex);o.uv = float4(i.texcoord.xy,1,1);return o;}float4 fragment_convert(Inputfragment o) : COLOR{float4 c = tex2D(_MainTex,o.uv);c.a *= ColorLerp(c.rgb,_FilterfColor.rgb);return c;}ENDCG}}FallBack "Diffuse"}
更多推荐
Unity 透明视频
发布评论