• 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 ullala · Apr 28, 2011 at 02:03 PM

Thanks for the solution. Nevertheless the two movies do not always run perfectly synchronized. So I tried to have one movie only that includes both: it is double height, has the normal video on top and the grayscale video for the mask on bottom. The material uses this one movie for both textures, while the tilings and offsets are adapted. But for the culling mask the tiling and offset values are ignored - it looks like I need to adapt the shader, but sadly I have no idea about shader scripting. Any help?

Comment
Add comment · Show 3 · 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 Seth-Bergman · Mar 29, 2012 at 04:35 AM 0
Share

O$$anonymous$$ so this is quite an old post.. however I have recently been trying to fix this same issue. On this suggestion, I stacked both my files as described above, diffuse on top, alpha on bottom, into a single video. Then by using the same shader from $$anonymous$$evin above (slightly altered), I added my stacked video texture to both slots (alpha and diffuse) of the shader on my plane. Then I set tiling y value for both to .5, and offset one of the y values by .5 . Works perfectly! Thanks for all the suggestions on this thread, up to ullala for suggesting the final clue.. tiling & offset DO work here! Only way I've been able to get the two channels to sync perfectly. However, it does seem to be performance intensive, at least for my purposes.. I have a foreground video, with alpha as described, and a background video I want to play simultaneously.. but while they're both playing at once, it's quite choppy. Once the top one finishes, only the background is left playing, and it smooths out.. However, I'm using best quality .mov's, hopefully reducing quality/filesize will help.. UPDATE: LOL updated my computers drivers and the choppiness went away! works perfectly after all!

avatar image QuasarTD · Jun 08, 2012 at 11:00 AM 0
Share

Hi Seth

have just done the same setup as you have however the defuse part is still semi transparent. would you be kind enough to post the changes you made to your shader to get it to work properly. Thanks very much

avatar image davidosullivan · Jun 08, 2015 at 07:44 PM 0
Share

I'm trying to do this with unity5 but it unity5 seems to require that the CGPROGRA$$anonymous$$ has both a vertex bit and a fragment bit...

Does anyone know what the vertex bit should be?

I have tried adding :-

 v2f vert (appdata_base v)
                      {
                      v2f o;
                      o.pos = mul (UNITY_$$anonymous$$ATRIX_$$anonymous$$VP, v.vertex);
                      return o;                     
                      }

But that is a complete guess and I cannot get it to work. Anyone know what I should be using?

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 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

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.



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