Vidéo sur fond vert

Questions à propos du scripting Shader.
Avatar de l’utilisateur
kealkeal
Messages : 925
Inscription : 16 Juil 2010 17:31
Localisation : Paris

Vidéo sur fond vert

Message par kealkeal » 06 Oct 2010 10:04

Bonjour,

Je souhaite intégrer une vidéo sur fond vert (avec un fond transparent).

Le but est de diffuser une vidéo d'un personnage détouré dans un monde 3D.

Quelqu'un a des pistes ... ? :roll:

Merci pour vos propositions.
kealkeal

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Vidéo sur fond vert

Message par ZJP » 06 Oct 2010 16:23

Salut,

Tu veux faire un "Chroma key"?
Ton personnage est filmé sur un fond vert (ou bleu), cette vidéo serait diffusée sur une texture placée devant la caméra, texture elle même placée devant un décor?
Bon résumé?? :D
Si c'est la cas, un shader "Chroma key" ou un truc identique qui ferait disparaitre le fond vert.

JP

Edit : http://forum.unity3d.com/threads/48938- ... ght=chroma
Ou
http://forum.unity3d.com/threads/11512- ... s-an-Alpha
De façon générale un recherche avec "chroma key"

Pas mal ici : http://www.quasimondo.com/archives/000615.php

Avatar de l’utilisateur
kealkeal
Messages : 925
Inscription : 16 Juil 2010 17:31
Localisation : Paris

Re: Vidéo sur fond vert

Message par kealkeal » 08 Oct 2010 11:28

Oui cela fonctionne tres bien.

Merci pourl'info !
kealkeal

Avatar de l’utilisateur
kealkeal
Messages : 925
Inscription : 16 Juil 2010 17:31
Localisation : Paris

Re: Vidéo sur fond vert

Message par kealkeal » 08 Oct 2010 16:44

J'aimerai avoir la possibilité de faire apparaitre et disparaitre ma video avec un systeme de fade out et fade in.

Quelqu'un a dejà testé cela sur une VIDEO.

J'ai vu qu'il etait possible de la faire sur un "simple" shader, mais sur une vidéo .... :roll:
kealkeal

Avatar de l’utilisateur
kealkeal
Messages : 925
Inscription : 16 Juil 2010 17:31
Localisation : Paris

Re: Vidéo sur fond vert

Message par kealkeal » 13 Oct 2010 16:48

Bonjour,

J'utilise ce shader pour intégrer ma vidéo sur fonc vert :

Code : Tout sélectionner

Shader "FX/GreenToAlpha" {

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

SubShader {

   Pass {
   	
Program "" {
// Fragment combos: 1
//   opengl - ALU: 4 to 4, TEX: 1 to 1
//   d3d9 - ALU: 3 to 3, TEX: 1 to 1
SubProgram "opengl " {
Keywords { }
SetTexture [_MainTex] {2D}
"!!ARBfp1.0
# 4 ALU, 1 TEX
PARAM c[1] = { { 0.5 } };
TEMP R0;
TEX R0.xyz, fragment.texcoord[0], texture[0], 2D;
ADD R0.w, R0.x, R0.z;
MAD R0.w, -R0, c[0].x, R0.y;
MOV result.color, R0;
END
# 4 instructions, 1 R-regs
"
}

SubProgram "d3d9 " {
Keywords { }
SetTexture [_MainTex] {2D}
"ps_2_0
; 3 ALU, 1 TEX
dcl_2d s0
def c0, 0.50000000, 0, 0, 0
dcl t0.xy
texld r0, t0, s0
add_pp r1.x, r0, r0.z
mad_pp r0.w, -r1.x, c0.x, r0.y
mov_pp oC0, r0
"
}

}
#LINE 30

		AlphaTest Less [_Cutoff]
		} // pass
	} // subshader
	Fallback "Transparent/Diffuse"
} // shader
J'aimerais avoir la possibilité d'adoucir le contour du détourge. C'est un peu grossier parfois.

Quelqu'un a une idée ?

Merci.
kealkeal

Tamaya
Messages : 14
Inscription : 19 Mai 2010 14:16

Re: Vidéo sur fond vert

Message par Tamaya » 15 Oct 2010 23:15

Salut,

Si ta vidéo est en temps réel (webcam, ...) tu peux utiliser Max Jsp pour capturer les images et les envoyer directement dans Unity. L’intérêt c'est que tu peux facilement faire du keying avec Max ! J'avais eu le même problème que toi concernant la "précision" de la découpe, et la meilleure solution que j'ai trouvée à été de faire ce keying sur deux couleurs (deux tons de vert différent), avec deux valeurs de tolérances...

Si tu veux continuer sur l'idée les shaders peut être qu'il serait intéressant de pouvoir spécifier plusieurs couleurs au shader... Mais ça je sais pas faire ...

En espérant avoir aidé ... :P
Tamaya - Dev freelance

Noodle09
Messages : 32
Inscription : 25 Mai 2011 14:37

Re: Vidéo sur fond vert

Message par Noodle09 » 06 Juil 2011 23:44

Hello,

Je vais relancer le post car je suis actuellement en plein dedans...applique une image avec des persos sur fond vert, j'utilise le script ci dessus pour retirer le fond vert...
j'ai juste adapté pour avoir un keying plus fin et le résultat est passable.

Aussi j'aimerais appliquer un léger blur sur mon keying cad avoir mon image de base - le vert du fond + un léger blur sur les bords...

J'ai beau chercher, je vois pas comment appliquer un blur a un shader. Si quelqu'un a une idée la dessus......

Tamaya
Messages : 14
Inscription : 19 Mai 2010 14:16

Re: Vidéo sur fond vert

Message par Tamaya » 11 Juil 2011 11:41

Salut,

Pour ma part j'ai fais le blur en amont et non pas dans le shader ... mais c'est surement faisable dans le shader. J'espere que des gens pourrons t'aider mieux que moi :)
Tamaya - Dev freelance

Avatar de l’utilisateur
yannminh
Messages : 70
Inscription : 18 Fév 2010 15:09
Localisation : Noisy-Le-Grand
Contact :

Re: Vidéo sur fond vert

Message par yannminh » 14 Déc 2011 11:42

Bonjour,

Le script précédent de KealKeal me fait une erreur de syntaxe à la ligne 18,
aussi j'utilise ce script qui fonctionne pas trop mal..;

Code : Tout sélectionner

Shader "Matte/RGB Color"
{

Properties {
   _MainTex ("Base (RGB)", 2D) = "white" {}
   _Matte ("Matte Color", Color) = (1,0,1,1)
   _Thresh ("Threshold", Range (0,1)) = 0.0 
   _Cutoff ("Cutoff", Range (0,1)) = .5 
}

SubShader {

   Pass {
      AlphaTest Less [_Cutoff]
CGPROGRAM
#pragma fragment frag
#include "UnityCG.cginc"

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

sampler2D _MainTex;
uniform half4 _Matte;
uniform float _Thresh;
uniform float _Cutoff;

half4 frag (v2f i) : COLOR
{
    //return _Matte;
    half4 color = tex2D(_MainTex, i.uv.xy);
    
    half3 keyMinus = half3( (_Matte.r - _Thresh), (_Matte.g - _Thresh), (_Matte.b - _Thresh) );
    half3 keyPlus = half3( (_Matte.r + _Thresh), (_Matte.g + _Thresh), (_Matte.b + _Thresh) );
    
    if ( ((color.r > keyMinus.r) && (color.r < keyPlus.r)) && ((color.g > keyMinus.g) && (color.g < keyPlus.g)) && ((color.b > keyMinus.b) && (color.b < keyPlus.b)) )
    {
        return _Cutoff;
    }
    
    return float4(color.rgb, max(0, _Cutoff-0.01));
}

ENDCG
      } // pass
   } // subshader
   //Fallback "Transparent/Diffuse"
} // shader
Cependant, il génère un liseré vert autour du personnage qui n'est pas élégant.

du coup je viens d'avoir une idée pour générer une vidéo avec Alpha synchrone, qui est de fabriquer un fichier vidéo comportant l'image de foreground, et sa découpe dans la même image. comme ceci
Image

Ensuite, il faudrait fabriquer un shader de type alpha, qui fonctionne avec deux textures. La texture pour l'image, et la texture pour la découpe qu'on ajustent avec l'offset et tiling.

Hélas, je ne sais pas programmer... quelqu'un aurait un peu de temps pour développer ce shader ?

Il permettrait de réaliser des incrustations de bonne qualité dans Unity.

Merci...

Yann, NooIncrustateur...
Dernière édition par yannminh le 16 Déc 2011 10:30, édité 1 fois.

Avatar de l’utilisateur
Loulou
Messages : 239
Inscription : 23 Nov 2011 01:04
Localisation : Paris
Contact :

Re: Vidéo sur fond vert

Message par Loulou » 14 Déc 2011 12:01

Ha le chroma key. une grande histoire d'amour.
De passer par deux videos une pour le RGB et une comme mask alpha n'est pas une si mauvaise idée. A ceci pres que, pour avoir été confronté au probleme, si la video est trop lourde, un decalage va se creer entre les deux vidéos et c'est pas beau a voir.

Au cas ou je viens quand meme de fouiller dans mes anciens fichiers, il me semble que celui la fonctionnne :

Code : Tout sélectionner

Shader "Video/VideoMask" {
	Properties {
		_MainTex ("Video (RGB)", 2D) = "white" {}
		_MaskTex ("Video mask (RGB)", 2D) = "white" {}
	}
	
	SubShader {
		pass{

			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"
	
			sampler2D _MainTex;
			sampler2D _MaskTex;

			struct v2f {
	    		float4  pos : SV_POSITION;
	    		float2  uv : TEXCOORD0;
			};
			
			float4 _MainTex_ST;
			
			v2f vert (appdata_base v)
			{
	   		 v2f o;
	   		 o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
	   		 o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
	   		 return o;
			}

			half4  frag (v2f i) : COLOR {
				half4 mainTex = tex2D (_MainTex, i.uv);
				half4 maskTex = tex2D (_MaskTex, i.uv);
				half4 o;
				
				o.rgb = mainTex.rgb;
				o.a = maskTex.r;
				return o;

			}
			ENDCG
		} 
	}
}
Edit : oups desolé, j'avais pas reussi a tous lire dans ton message.
avec Alpha synchrone, qui est de fabriquer un fichier vidéo comportant l'image de foreground, et sa découpe dans la même image. comme ceci
Fais attention a la taille de tes images.
Dernière édition par Loulou le 14 Déc 2011 12:06, édité 1 fois.

Répondre

Revenir vers « les Shaders »