Unity播放透明视频的三种方式

Unity支持播放众多格式视频,在这就不一一列举了,接下来说下如何播放透明视频,通过查阅资料与请教高手,总结了几种方式,与大家记录分享一下。
首先想到的是直接将视频拖入面板,Unity自动添加VedioPlayer组件


播放一下,确实能实现效果,但是却出现一个问题,虽然可以调该物体Scale,但是并不能实现改变其大小
效果如下图:
  


那么,如何播放透明视频,且可以自由控制呢?接下来进入正题。

要播放透明视频,首先视频具有 alpha通道。

1,第一种方式:通过Plane+shader
先创建一个Plane,把视频拖到Plane上面,通过控制Plane来控制视频的大小,但是却发现视频周边是黑色的,播放看看效果:
 



我们可以使用一个shader,剔除黑色

shader代码如下:

Shader "Custom/Example" 
{  
    Properties  
    {  
        _Color ("Color", Color) = (1,1,1,1)  
        //_MainTex ("Albedo (RGB)", 2D) = "white" {}  
        _AlphaVideo ("Alpha Video(R)", 2D) = "white" {}  
        _Glossiness ("Smoothness", Range(0,1)) = 0.5  
        _Metallic ("Metallic", Range(0,1)) = 0.0  
    }  
    SubShader  
    {  
    Tags { "Queue"="Transparent" "RenderType"="Transparent" }  
        LOD 200  
          
        CGPROGRAM  
        // Physically based Standard lighting model, and enable shadows on all light types  
        #pragma surface surf Standard alpha  
    
        // Use shader model 3.0 target, to get nicer looking lighting  
        #pragma target 3.0  
    
        sampler2D _MainTex;  
        sampler2D _AlphaVideo;  
    
        struct Input {  
            float2 uv_MainTex;  
            float2 uv_AlphaVideo;  
        };  
    
        half _Glossiness;  
        half _Metallic;  
        fixed4 _Color;  
    
        void surf (Input IN, inout SurfaceOutputStandard o) {  
            // Albedo comes from a texture tinted by color  
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;  
            fixed4 _alpha = tex2D (_AlphaVideo, IN.uv_AlphaVideo);  
            o.Albedo = c.rgb;  
            // Metallic and smoothness come from slider variables  
            o.Metallic = _Metallic;  
            o.Smoothness = _Glossiness;  
            o.Alpha = _alpha.r;  
              
        }  
        ENDCG  
    }  
    FallBack "Diffuse" 
}

再添加一个播放视频的脚本:

public MovieTexture moveTexture;
   // Use this for initialization
   void Start () {
       GetComponent<Renderer>().material.mainTexture = moveTexture;
       moveTexture.loop = true;
       moveTexture.Play();
   }
    
   // Update is called once per frame
   void Update () {
        
   }

效果图如下:

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号 

x
Unity支持播放众多格式视频,在这就不一一列举了,接下来说下如何播放透明视频,通过查阅资料与请教高手,总结了几种方式,与大家记录分享一下。
首先想到的是直接将视频拖入面板,Unity自动添加VedioPlayer组件


播放一下,确实能实现效果,但是却出现一个问题,虽然可以调该物体Scale,但是并不能实现改变其大小
效果如下图:
  


那么,如何播放透明视频,且可以自由控制呢?接下来进入正题。

要播放透明视频,首先视频具有alpha通道。

1,第一种方式:通过Plane+shader
先创建一个Plane,把视频拖到Plane上面,通过控制Plane来控制视频的大小,但是却发现视频周边是黑色的,播放看看效果:
 



我们可以使用一个shader,剔除黑色

shader代码如下:
[C#]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Shader "Custom/Example" 
     Properties 
    
         _Color ( "Color" , Color) = (1,1,1,1) 
         //_MainTex ("Albedo (RGB)", 2D) = "white" {} 
         _AlphaVideo ( "Alpha Video(R)" , 2D) = "white" {} 
         _Glossiness ( "Smoothness" , Range(0,1)) = 0.5 
         _Metallic ( "Metallic" , Range(0,1)) = 0.0 
    
     SubShader 
    
     Tags { "Queue" = "Transparent" "RenderType" = "Transparent"
         LOD 200 
          
         CGPROGRAM 
         // Physically based Standard lighting model, and enable shadows on all light types 
         #pragma surface surf Standard alpha 
    
         // Use shader model 3.0 target, to get nicer looking lighting 
         #pragma target 3.0 
    
         sampler2D _MainTex; 
         sampler2D _AlphaVideo; 
    
         struct Input { 
             float2 uv_MainTex; 
             float2 uv_AlphaVideo; 
         }; 
    
         half _Glossiness; 
         half _Metallic; 
         fixed4 _Color; 
    
         void surf (Input IN, inout SurfaceOutputStandard o) { 
             // Albedo comes from a texture tinted by color 
             fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
             fixed4 _alpha = tex2D (_AlphaVideo, IN.uv_AlphaVideo); 
             o.Albedo = c.rgb; 
             // Metallic and smoothness come from slider variables 
             o.Metallic = _Metallic; 
             o.Smoothness = _Glossiness; 
             o.Alpha = _alpha.r; 
              
        
         ENDCG 
    
     FallBack "Diffuse" 
}




再添加一个播放视频的脚本:
[C#]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
10
11
public MovieTexture moveTexture;
    // Use this for initialization
    void Start () {
        GetComponent<Renderer>().material.mainTexture = moveTexture;
        moveTexture.loop = true ;
        moveTexture.Play();
    }
    
    // Update is called once per frame
    void Update () {
        
    }



效果图如下:
 
总结: 这种方式需要视频格式为MOV、MP4等,视频的Importer Version改为 MovieTexTure。但是,使用MovieTexture播放视频的话,不能导入移动端,至于什么原因,呵呵,这个,在下也不知道啊。

2,第二种方式:Plane+使用Unity自带的shader,如下图

视频格式为:webm

添加组件:Vedio Player

效果图如下:
 


总结:这种方式比较简单,也可自由控制大小,但是有时会出现视频微卡现象。

3,第三种方式:通过UI:RawImage +Vedio Player

视频格式:webm

添加UI:RawImage 

添加组件:Vedio Player

Project面板添加:Render Texture

Render Texture的size参数改为视频的长度和宽度,如下图:
 



Render Texture拖入RawImage 和 Vedio Player,播放,效果图如下:
 


总结:这种方式也挺简单,效果也不错。

到此就结束了,以上为播放透明视频的三种方式,根据个人喜好自行选择吧,鄙人学习Unity也是纯属瞎摸索,有错误之处,还望众位大神不吝指出。

4.png (48.35 KB, 下载次数: 1)

4.png

7.png (23.97 KB, 下载次数: 1)

7.png
转自: http://www.manew.com/thread-134897-1-1.html
<think>我们正在处理用户关于Unity播放透明视频的问题。根据用户提供的引用资料,我们可以总结出几种实现透明视频的方法:1.使用AfterEffects制作透明背景视频,然后通过Media Encoder转换为WebM格式(支持透明通道),再导入Unity播放。2.编写特殊Shader来实现透明视频播放(如引用2中提到的互动大屏应用)。3.使用Unity Recorder导出带透明通道的视频(如引用3中修改代码以输出透明通道的.mov视频,然后转换为WebM格式导入Unity)。由于用户直接询问实现方法及步骤,我们将结合引用内容提供详细步骤。步骤1:制作透明背景视频(使用AE)-使用AfterEffects制作带有透明通道的视频(例如,Alpha通道)。-导出时选择支持透明通道的格式,如QuickTime(.mov)格式,并选择RGB+Alpha通道。步骤2:转换视频格式(使用MediaEncoder)-将制作好的透明视频导入Media Encoder。-选择输出格式为WebM(因为WebM支持透明通道,且Unity支持WebM格式的透明视频)。-导出WebM视频。步骤3:将WebM视频导入Unity-将导出的WebM文件直接拖入Unity项目资源文件夹。-在Unity中,WebM视频的导入设置中,确保“AlphaSource”设置为“FromMaterial”或自动检测到透明通道(通常会自动处理)。步骤4:在Unity播放透明视频-创建一个平面(Plane)或UI元素(如RawImage)。-将视频材质赋给该对象,并确保使用支持透明通道的Shader(例如,Unlit/Transparent)。-使用Video Player组件播放视频。另外,如果用户希望直接在Unity中录制透明视频(如引用3所述),可以修改UnityRecorder的代码以支持导出带透明通道的.mov视频,然后转换为WebM格式再导入Unity。但这种方法较为复杂,通常用于录制阶段。注意:Unity内置的视频播放器对透明通道的支持取决于视频格式。WebM格式(VP8/VP9编解码器)支持透明通道(Alpha通道)是较为常用的选择。下面我们提供在Unity播放透明视频的详细步骤:1.准备透明视频:使用AE或其他支持导出带Alpha通道视频的软件制作视频,并转换为WebM格式(使用MediaEncoder)。2.导入Unity:将WebM视频文件放入Assets文件夹。3.创建播放器:-在场景中创建一个GameObject(例如,一个Plane或一个UIRawImage)。-添加VideoPlayer组件。-将WebM视频文件拖拽到VideoPlayer的“Video Clip”属性上。4.设置材质以显示透明通道:-对于3D对象(如Plane):*创建一个新材质,选择Shader为“Unlit/Transparent”或“Standard”中具有透明混合的Shader(如Standard支持透明模式为Fade或Transparent)。*将VideoPlayer的纹理赋值给材质的MainTexture。-对于UIRawImage:*直接将VideoPlayer的纹理赋值给RawImage的Texture属性,并确保RawImage的材质支持透明(默认UI材质支持透明)。5.调整渲染设置:确保透明视频后面的物体能够被看到(例如,将背景设置为透明或放置其他物体在视频后面)。注意:在Unity中,VideoPlayer组件播放视频纹理需要应用到材质上,并且材质的Shader必须支持透明混合才能正确显示透明背景。引用[1]中提到的方法:使用AE制作透明视频,ME转换WebM格式,然后导入Unity播放。引用[2]中提到的方法:编写特殊Shader,但我们的步骤中使用了Unity内置的透明Shader(如Unlit/Transparent),这已经足够。引用[3]中提到的方法:修改Unity Recorder以导出透明通道的视频,但此方法适用于录制阶段,对于播放来说,我们只需要使用WebM格式即可。因此,我们推荐用户使用WebM格式的透明视频,并按照上述步骤实现。相关问题:1.如何制作带透明通道的视频?2.除了WebM格式,Unity还支持哪些带透明通道的视频格式?3.如何在Unity中为视频播放器设置Shader以显示透明背景?</think>### Unity播放透明视频的实现方法及步骤 在Unity播放透明视频(带Alpha通道)的关键在于**视频格式选择**和**材质Shader配置**。以下是详细步骤: --- ### 一、实现步骤 #### 1. **准备透明视频** - 使用**After Effects (AE)** 制作带Alpha通道的视频(如`.mov`格式)。 - 通过**Media Encoder (ME)** 转换为支持透明通道的格式: - 推荐格式:**WebM (VP8/VP9编解码器)** - 转换步骤: 1. 在ME中导入视频 2. 输出设置选择 `WebM` 格式 3. 确保勾选 **"包含Alpha通道"** 选项 4. 导出视频(示例输出:`transparent_video.webm`) > 引用[1]:将带有透明通道的视频导入ME,选择WebM格式导出后导入Unity[^1]。 #### 2. **导入Unity** - 将`.webm`文件拖入Unity资源文件夹 - **检查导入设置**: - 在Inspector面板中确认: - `Alpha Source` → **From Material** - `Transparency` → **Enabled** #### 3. **创建播放对象** ```csharp // 创建播放脚本(挂载到GameObject) using UnityEngine; using UnityEngine.Video; public class TransparentVideoPlayer : MonoBehaviour { public VideoClip webmClip; // 拖入.webm文件 void Start() { var videoPlayer = gameObject.AddComponent<VideoPlayer>(); videoPlayer.clip = webmClip; videoPlayer.renderMode = VideoRenderMode.MaterialOverride; // 关键:使用支持透明的Shader var material = new Material(Shader.Find("Unlit/Transparent")); GetComponent<Renderer>().material = material; videoPlayer.targetMaterialProperty = "_MainTex"; } } ``` #### 4. **Shader配置(核心)** - **方案1:使用内置Shader** 为材质选择:`Unlit/Transparent` 或 `UI/Default`(UI元素) - **方案2:自定义Shader**(更灵活) ```glsl Shader "Custom/TransparentVideo" { Properties { _MainTex ("Video Texture", 2D) = "white" {} } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha // 启用Alpha混合 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 pos : SV_POSITION; }; sampler2D _MainTex; v2f vert (appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); return col; // 自动使用Alpha通道 } ENDCG } } } ``` #### 5. **场景设置** - **3D对象**(如Plane): - 附加上述脚本 - 材质选择自定义Shader - **UI元素**(如RawImage): ```csharp // UI播放方案 public VideoPlayer uiVideoPlayer; public RawImage rawImage; void Start() { uiVideoPlayer.targetTexture = new RenderTexture(...); rawImage.texture = uiVideoPlayer.targetTexture; rawImage.material = transparentMaterial; // 透明材质 } ``` --- ### 二、注意事项 1. **格式兼容性**: - Unity原生支持 **WebM** 透明视频(2018.3+版本) - 避免使用`.mp4`(不支持透明通道) - 如需`.mov`,需修改Unity Recorder代码(见引用[3])[^3] 2. **性能优化**: - 小尺寸视频优先(透明视频解码开销较大) - 使用`VideoPlayer.waitForFirstFrame`避免初始黑屏 3. **应用场景**: - AR特效(如引用[2]的互动大屏)[^2] - UI动态图标 - 游戏特效(全息投影、魔法阵等) --- ### 三、备选方案 - **Unity Recorder录制透明视频**: 修改`FFmpegEncoderSettings.cs`启用透明通道(参考引用[3])[^3] ```csharp // 修改后支持Alpha通道 OutputFormat.ProRes4444XQ => "-c:v prores_ks -profile:v 5 -vendor apl0 -pix_fmt yuv420p" ``` - **插件方案**: - **AVPro Video**:商业插件,支持高级透明视频格式 - **WebM for Unity**:免费开源WebM解码器 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值