Unity播放带Alpha通道的视频(unity play channel movie)

最近讨论在unity播放带alpha通道的视频,一开始一点效果也没有,然后搜索各种解决方案,总结出三种不太好的方案,有更好的方案的希望大家提出来。

方案重点两个方面:

        1.能否播放带alpha通道的视频

        2.播放的视频和三维场景的层级关系

1.剔除

使用一个剔除的shader,不渲染黑色部分

shader代码如下:

Shader "AlphaVideo/CullingVideo"
{
	Properties
	{
		_MainTex("Base (RGB)", 2D) = "white" {}
		_AlphaOffsetX("alpha offset x", float) = 0.5
		_AlphaOffsetY("alpha offset y", float) = 0
		_Cutoff("Cutoff", Range(-1,0)) = -0.3
	}

	SubShader
	{
		//Lighting Off
		AlphaTest Less[_Cutoff]
		Tags{ "Queue" = "Transparent-20" "IgnoreProjector" = "True" "RenderType" = "Transparent" }

		LOD 300

		CGPROGRAM
		#pragma surface surf Lambert alphatest:_Cutoff

		sampler2D _MainTex;
		float _AlphaOffsetX;
		float _AlphaOffsetY;

		struct Input
		{
			float2 uv_MainTex;
		};

		void surf(Input IN, inout SurfaceOutput o)
		{
			half4 c = tex2D(_MainTex, IN.uv_MainTex);
			IN.uv_MainTex.x += _AlphaOffsetX;
			IN.uv_MainTex.y += _AlphaOffsetY;
			half4 d = tex2D(_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;
			o.Alpha = ((d.r*-1) + 1)*-1;
		}

		ENDCG
	}

	// FallBack "Diffuse"
	FallBack "Transparent/Diffuse"
}

编写一个播放视频的C#脚本如下:

using UnityEngine;
using System.Collections;

public class MovieControl : MonoBehaviour
{

    public MovieTexture movie;
    public AudioClip movieSound;

    void Start()
    {
        Play();
    }

    public void Play()
    {
        if (movie != null)
        {
            MovieTexture temp = (MovieTexture)gameObject.GetComponent<MeshRenderer>().sharedMaterial.mainTexture;

            if (temp != null)
            {
                temp.Stop();
            }

            gameObject.GetComponent<MeshRenderer>().sharedMaterial.mainTexture = movie;
            movie.Play();
            if (movieSound != null)
            {
                GetComponent<AudioSource>().clip = movieSound;
                GetComponent<AudioSource>().Play();
            }
        }
    }

    public void Stop()
    {
        movie.Stop();
    }

}

在场景的面板前后简历两个小方块,测试视频与3d的顺序问题:

效果如图:

第一种方案满足条件2,条件1的效果不好。

2.shader叠加遮罩

这种方案需要两个视频叠加,这里是重网上下载的测试视频,视频图和遮罩图如下:

使用的shader如下:

Shader "AlphaVideo/MaskVideo"
{
	Properties
	{
		_MainTex("MainTex", 2D) = "white" {}
		_Mask("Mask", 2D) = "white" {}
		_Transparency("Transparency", Range(0, 1)) = 0
		_Color("Color", Color) = (0.4485294,0.310013,0.310013,1)
		[HideInInspector]_Cutoff("Alpha cutoff", Range(0,1)) = 0.5
	}

	SubShader
	{
		Tags
		{
			"IgnoreProjector" = "True"
			"Queue" = "Transparent"
			"RenderType" = "Transparent"
		}

		Pass
		{
			Name "FORWARD"
			Tags {"LightMode" = "ForwardBase"}
			Blend SrcAlpha OneMinusSrcAlpha
			ZWrite Off

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#define UNITY_PASS_FORWARDBASE
			#include "UnityCG.cginc"
			#include "UnityPBSLighting.cginc"
			#include "UnityStandardBRDF.cginc"
			#pragma multi_compile_fwdbase
			#pragma exclude_renderers gles3 metal d3d11_9x xbox360 xboxone ps3 ps4 psp2
			#pragma target 3.0

			uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
			uniform sampler2D _Mask; uniform float4 _Mask_ST;
			uniform float _Transparency;
			uniform float4 _Color;

			struct VertexInput
			{
				float4 vertex : POSITION;
				float2 texcoord0 : TEXCOORD0;
			};

			struct VertexOutput
			{
				float4 pos : SV_POSITION;
				float2 uv0 : TEXCOORD0;
			};

			VertexOutput vert(VertexInput v)
			{
				VertexOutput o = (VertexOutput)0;
				o.uv0 = v.texcoord0;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				return o;
			}

			float4 frag(VertexOutput i) : COLOR
			{
				float4 _MainTex_var = tex2D(_MainTex,TRANSFORM_TEX(i.uv0, _MainTex));
				float3 emissive = (_Color.rgb*_MainTex_var.rgb);
				float3 finalColor = emissive;
				float4 _Mask_var = tex2D(_Mask,TRANSFORM_TEX(i.uv0, _Mask));
				return fixed4(finalColor,((lerp(lerp(lerp(_Mask_var.b, _Mask_var.r, _Mask_var.rgb.r), _Mask_var.g, _Mask_var.rgb.g), _Mask_var.b, _Mask_var.rgb.b))*_Transparency));
			}

			ENDCG
		}

	}

	FallBack "Diffuse"
	CustomEditor "ShaderForgeMaterialInspector"
}

实现效果如图:

这种效果能同时满足条件1和2,但是要两个视频,比较麻烦,不知道有没有大神知道其他方案,遮罩换成图片也行。

3.unity自带的shader

首先用untiy的FX/Flare的shader,两种视频的播放效果如图:

发现能满足条件1,不能满足条件2,然后发现太亮了

然后unity自带的shader Particles/Addtive

效果如图:

亮度可以降下来,失去了视频原来的颜色,这也是醉了,所以,各位朋友们有其它更好的方案的欢迎交流。

项目工程文件目录:MovieTextureAlpha

时间: 2024-11-02 23:20:27

Unity播放带Alpha通道的视频(unity play channel movie)的相关文章

带alpha透明通道视频—网页播放带alpha通道视频叠加合成方案

带alpha通道的图片有GIF和PNG,但是GIF只有8位,失真严重,边缘锯齿非常明显. 做动画,其它考虑PNG24,用css3 animations播放.但是,每个都配置太麻烦.综合考虑还是做透明背景的及带alpha通道的视频做背景做好. 带alpha通道可以跟背景融合的视频,常用有三种格式 微软 AVI,微软压缩比太差,文件太大. 苹果mov,在windows平台,要装相关插件. 谷歌webM,只要与新版chrome即支持. webM 与webP是一个爹养的,在网络应用绝佳--高压缩比高保真

Unity中播放带有alpha通道格式为Mp4的视频

问题: Unity中实现播放透明的MP4视频时出现黑点 解决办法:    使用Unity自带的shader去除黑点 1:shader代码如下所示 Shader "Unlit/NewUnlitShader" { Properties { _Color("Color", Color) = (1,1,1,1) //_MainTex ("Albedo (RGB)", 2D) = "white" {} _AlphaVideo("

移除Unity工程里所有图片的Alpha通道

为测试Untiy工程里Texture的Alpha对性能的压力,需要临时移除Unity工程里所有图片的Alpha通道,做测试对比. 这里有一个基本的技巧,当图片不存在Alpha通道时,就不需要处理,如何判断图片是否存在Alpha通道呢,Unity不存在直接的接口.但可以这么干: 1. ti.textureFormat = TextureImporterFormat.AutomaticTruecolor; AssetDatabase.ImportAsset(_relativeAssetPath);

【Unity】4.2 提升开发效率的捷径--导入Unity自带的资源包

分类:Unity.C#.VS2015 创建日期:2016-04-06 一.简介 Unity自带的资源包也称为标准资源包.换言之,Unity自带的所有标准资源包导入到Unity项目中以后,都会放在Project视图的Standed Assets文件夹下.如果是多平台,除了Standed Assets文件夹以外,还会有一个Edit文件夹. 如果你打开别人写的Unity项目,只要看到项目中包含有Standed Assets文件夹和Edit文件夹,你就应该马上想到,这些文件夹下的资源都是从Unity自带

什么是Alpha通道?

图像处理(Alpha通道,RGB,...)祁连山(Adobe 系列教程)施雪扬的UI课程 一个也许很傻的问题,在图像处理中alpha到底是什么?  Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区. 为什么用‘Alpha’代表透明度? l  Alpha 没有透明度的意思,不代表透明度.opacity 和 transparency 才和透明度有关,前者是不透明度,后者是透明度.比如 css 中的「opacity: 0.5」就是设定元素有 5

Alpha通道

 Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算  为什么用‘Alpha’代表透明度? l  Alpha 没有透明度的意思,不代表透明度.opacity 和 transparency 才和透明度有关,前者是不透明度,后者是透明度.比如 css 中的「opacity: 0.5」就是设定元素有 50% 的不透明度. l  一个图像的每个像素都有 RGB 三

如何基于纯GDI实现alpha通道的矢量和文字绘制

今天有人在QQ群里问GDI能不能支持带alpha通道的线条绘制? 大家的答案当然是否定的,很多人推荐用GDI+. 一个基本的图形引擎要包括几个方面的支持:位图绘制,文字绘制,矢量绘制(如矩形,线条). 可惜GDI这个20多年前发明的老古董,对这几项的绘制, 除了位图绘制可以通过AlphaBlend支持alpha通道,其他绘制都不支持alpha通道. 那有没有方法让能通过纯GDI让文字和矢量的绘制也支持alpha通道呢? 讨论这个问题之前,我们先看一下用GDI函数在支持alpha通道的DC上绘制会

【Unity Shaders】Transparency —— 使用alpha通道创建透明效果

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 从这篇开始是一个全新的章节:透明效果(Transparency).之前在制作LOGO闪光效

Unity播放视频之WebGL

环境:win10, Unity2018.2.6f1, vs2015 就用Unity自带的VideoPlayer用法都知道,就不赘述了 而且之前在别的文章里也说过,当初做一个安卓端应用,一开始用的是Unity5.6.2,莫名卡顿,换了2017.3就好了,所以要用videoplayer的话,建议unity用2017及以上版本 好了,这次遇到的就是程序发布成webgl版,在网页上视频不播放的问题 就是弄好了让它自动播放,Play On Awake 然后布置到iis上,打开--经测试,只有edge浏览器