• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
4
Question by Kevin Laity · Jan 05, 2010 at 06:29 PM · shadermovietexture

Movie Texture Blending

When writing a shader, for some reason if I try to blend using a MovieTexture, the blending gets ignored. I'm trying to use one movie as an alpha channel to another movie.

I've tried all the built in shaders Unity comes with, but none seem to work properly with MovieTextures. Is this even possible?

Is there a shader out there that's known to blend movie textures properly?

Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image SebastianErler · Jul 01, 2015 at 03:46 PM 0
Share

I have the same problem in Unity 5.1. I only see a transparent plane. Therefore I uploaded a simple unity project (ZIP, 123$$anonymous$$B): https://www.mediafire.com/?nz9yx2ae4bh13fo

I used the movies of voncgoh.

Here is a Screenshot of the Project:

alt text

It would be great if someone could edit and reupload the project.

screenshot-unityproject.png (264.3 kB)

6 Replies

· Add your reply
  • Sort: 
avatar image
7
Best Answer Wiki

Answer by MaDDoX · Jul 06, 2010 at 03:23 AM

Thanks for heading us in the right direction Kevin. Now, there's a little drawback in your implementation, it uses the same UV for both images, which might not be what everyone needs. I've especially noticed that if you use a regular image as the main texture and a movie texture/quicktime for the alpha texture (great for custom transitions, you can have the alpha QT at a much lower resolution), they do NOT coincide because movie textures apparently use just the bottom left corner of the UV space. To remedy that, I had to make a custom object with two UV sets, the second taking double the size of the first and anchored at the bottom left corner (0,0 in UV space). That plus the fixed script did the trick. Here it goes:

Shader "Particles/SplitAlpha" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Mask ("Culling Mask", 2D) = "white" {} _Cutoff ("Cutoff", Range (0,1)) = .5 }

SubShader { Tags {"Queue"="Transparent"}

 ZWrite Off
 Blend SrcAlpha OneMinusSrcAlpha

 Pass 
 {    
     CGPROGRAM 
         #pragma fragment frag 
         #include "UnityCG.cginc"  

         sampler2D _MainTex; 
         sampler2D _Mask; 

         struct v2f 
         { 
             float4 pos : POSITION; 
             float4 uv : TEXCOORD0;
             float4 uv2 : TEXCOORD1;                 
         }; 

         half4 frag (v2f i) : COLOR 
         { 
             half4 color = tex2D(_MainTex, i.uv.xy); 
             half4 color2 = tex2D(_Mask, i.uv2.xy); 

             return half4(color.r, color.g, color.b, color2.r); 
         } 
     ENDCG         
 }    

}

Fallback "Transparent/Diffuse" }

Now, as for actually playing the quicktime placed in the _mask texture, here's the js you need attached to your object:

var mask; function Start () { mask = renderer.material.GetTexture ("_Mask"); }

function Update () { if (Input.GetButtonDown ("Jump")) { mask.Play(); } }

GLHF! :)

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Kevin Laity · Jul 06, 2010 at 03:38 AM 0
Share

Awesome! It's true that my solution was tailored for my specific circumstances, thanks for adding a broader solution :)

avatar image
3
Best Answer

Answer by Kevin Laity · Jan 05, 2010 at 11:48 PM

After alot of digging and experimentation with other people's examples, I came up with a shader that seems to work.

The solution involved writing a fragment program. I'm not sure if I'm taking a performance hit by doing it this way, and I'm not sure that it's really impossible to do this without one.

Shader "MovieWithSeperateAlpha" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Mask ("Culling Mask", 2D) = "white" {} _Cutoff ("Cutoff", Range (0,1)) = .5 }

 SubShader 
 {
     Tags {"Queue"="Transparent"}

     ZWrite Off
     Blend SrcAlpha OneMinusSrcAlpha

     Pass 
     {    
         CGPROGRAM 
             #pragma fragment frag 
             #include "UnityCG.cginc"  

             sampler2D _MainTex; 
             sampler2D _Mask; 

             struct v2f 
             { 
                 float4 pos : POSITION; 
                 float4 uv : TEXCOORD0; 
             }; 

             half4 frag (v2f i) : COLOR 
             { 
                 half4 color = tex2D(_MainTex, i.uv.xy); 
                 half4 color2 = tex2D(_Mask, i.uv.xy); 

                 return half4(color.r, color.g, color.b, color2.r); 
             } 
         ENDCG         
     }    
 }

 Fallback "Transparent/Diffuse" 

}

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image AlKir · Apr 19, 2010 at 06:23 PM 0
Share

Thank you very much! This shader may be usefull for me. For playing mask video simultaneously with mainTexture I need also run it with .Play() function? But when I try do it Unity compiler say: "'Play' is not a member of 'UnityEngine.RenderTexture'." What may be wrong?

avatar image AlKir · Apr 19, 2010 at 06:26 PM 0
Share

Ups.. Solved with $$anonymous$$ovieTexture :)

avatar image
1

Answer by pointcache · Oct 16, 2015 at 01:47 AM

I made this shader in shaderforge works pretty well

 // Shader created with Shader Forge v1.21 
 // Shader Forge (c) Neat Corporation / Joachim Holmer - http://www.acegikmo.com/shaderforge/
 // Note: Manually altering this data may prevent you from opening it in Shader Forge

 Shader "0_CD/VideoMaskedColored" {
     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 {
 /////// Vectors:
 ////// Lighting:
 ////// Emissive:
                 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"
 }
 
Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Oruji · Nov 19, 2015 at 05:08 PM 0
Share

Works great, thanks for sharing.

I combined this with ullala's suggestion about keeping the alpha in the same video file to perfectly sync the mask with the video.

Altering line 59 and 62 is enough, but you might not want the values hard-coded.

59 -> float4 _$$anonymous$$ainTex_var = tex2D(_$$anonymous$$ainTex,TRANSFOR$$anonymous$$_TEX(i.uv0 * float2(1,0.5f) + float2(0,0.5f), _$$anonymous$$ainTex));

62 -> float4 _$$anonymous$$ask_var = tex2D(_$$anonymous$$ainTex,TRANSFOR$$anonymous$$_TEX(i.uv0 * float2(1, 0.5f), _$$anonymous$$ainTex));

Also, you can remove the $$anonymous$$ask property and I suggest setting Transparency property default value to 1.

avatar image liruishenga · Jan 18, 2016 at 08:49 AM 0
Share

Yes! the Shader is Great!$$anonymous$$y Unity version is 5.3.0f4.Thank you very much! $$anonymous$$y c# code is below:

using UnityEngine; using System.Collections;

public class Play$$anonymous$$ovieOnSpace : $$anonymous$$onoBehaviour { void Update () { if (Input.GetButtonDown ("Jump")) {

         Renderer r = GetComponent<Renderer>();
         $$anonymous$$ovieTexture movie1 = ($$anonymous$$ovieTexture)r.material.GetTexture("_$$anonymous$$ainTex");
         $$anonymous$$ovieTexture movie2 = ($$anonymous$$ovieTexture)r.material.GetTexture("_$$anonymous$$ask");
         
         if (movie1.isPlaying) {
             movie1.Pause();
             movie2.Pause();
         }
         else {
             movie1.Play();
             movie2.Play();
         }
     }
 }

}

avatar image
0

Answer by vincgoh · Jan 29, 2015 at 05:45 PM

Anyone with a sample project file? I tried the script but get total transparent material even in preview within Unity Inspector. I use After Effects to output the Alpha quicktime in H264.

Just to confirm in case it is reverse, White is to show and Black is transparent, right?

Comment
Add comment · Show 4 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image meat5000 ♦ · Jan 29, 2015 at 04:33 PM 0
Share

You made a shader file ins$$anonymous$$d of a normal script, right?

avatar image vincgoh · Jan 30, 2015 at 12:45 PM 0
Share

I uploaded the C# scipt, shader file, ocean.mov and mask.mov to $$anonymous$$ediaFire. I am reading up on shader to understand more.

https://www.mediafire.com/folder/mp2s7r8rjqvph/Unity3DAlphaVideoShader

avatar image DiegoAtaqueEnLongBeach · Feb 10, 2015 at 04:58 PM 0
Share

The set-up is just a simple plane + script and a material with the shader, right? Somehow, I am not getting it to work.

avatar image pointcache DiegoAtaqueEnLongBeach · Oct 16, 2015 at 01:31 AM 0
Share

Same, doesnt work for me - trasnparent and thats it.

avatar image
0

Answer by Smeister · Jul 31, 2012 at 08:40 PM

"it does'nt work with CSharp. Do it in Javascript it will work ;)"

You can do it in C#. For playing the movie texture and the movie mask just drop this script onto the same object that uses the shader above:

 public class MovieTextureWithAlphaMask: MonoBehaviour {

   private MovieTexture mask;
   private MovieTexture mainTex;

void Start () { mask = (MovieTexture)renderer.material.GetTexture("_Mask"); mainTex = (MovieTexture)renderer.material.GetTexture("_MainTex"); }

void Update () { if (Input.GetButtonDown("Jump")) { mainTex.Play(); mask.Play(); } } }

One thing I noticed, however, is that there seems to be a tiny delay between the movie and the mask so they may not line up perfectly when they are played.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
  • 1
  • 2
  • ›

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

10 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Difference between TRANSFORM_TEX and MultiplyUV 0 Answers

Chromakey shader for movie textures? 2 Answers

Is it possible to use a movie texture as a normal map, or as a mask to hide a texture in a shader? 1 Answer

MovieTexture on iOS 0 Answers

ChromaKey MovieTexture 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges