Random color

Questions à propos du scripting Shader.
Avatar de l’utilisateur
corentin3D
Messages : 331
Inscription : 26 Juin 2012 18:38
Contact :

Random color

Message par corentin3D » 23 Août 2014 16:13

Salut les gars,

Je dois faire un shader spécifique avec un random color spécifique, par exemple 5 couleurs : Bleu, turquoise, rouge, jaune, violet. Lorsque j'applique ce shader à un group d'assets (exemple : sphères) je voudrais que cela distribue les couleurs de manière random.

Un peu a la manière de cette image (faite rapidos sous Blender) :

Image


Merci !
------------------------------
CB3D STUDIO | Créateur de pixels.
Agence de 3D et formation 3D agréée.

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Random color

Message par F@B » 24 Août 2014 11:23

salut, tu bloques ou du coup ? pas besoin de shader, tu fais un nouveau material, et tu met change ta couleurs au start?

si ce n'est qu'un objet t'inspirer du shader ci dessous il remplace les couleurs RGB de la texture par la couleur en param (ne tiens pas compte de UV_head)

ici dans le shader plus bas, si rouge et vert quasi a fond sur la texture je remplace, ça pourrait être que vert :

Code : Tout sélectionner

if (c.r >0.98 && c.g >0.98 && c.b < 0.02){
	c.rgb=_hairColor;
par script(JS désolé) l'instanciation si j'ai moulte objets:

var red:float = Random.Range(0.0,1);
color_hair= Color(red, Mathf.Clamp(Random.Range(0.0,1),0,red-0.1) ,0); //toujours marron ou blond max
renderer.material.SetColor("_hairColor", color_hair );
//plus simple n'imprtequ'elle couleur RBG
color_short= Color(Random.Range(0.0,1.0),Random.Range(0.0,1.0),Random.Range(0.0,1.0));
le shader complet :

Code : Tout sélectionner

Shader "Custom/ToonBasic" {
	Properties {
		_Color ("Main Color", Color) = (.5,.5,.5,1)
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_ToonShade ("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }
        _UV_head ("UV head", Range(0,4)) = 0
        _hairColor ("hair Color", Color) = (1, 1, 1, 1)
        _shirtColor ("shirt Color", Color) = (1, 1, 1, 1)
        _shortColor ("short Color", Color) = (1, 1, 1, 1)
		_OutlineColor ("Outline Color", Color) = (0,0,0,1)
		_Outline ("Outline width", Range (.002, 0.03)) = .005

	}


	SubShader {
		
		Pass {
			Name "BASE"
			ZWrite On
			ColorMask RGB
			Blend SrcAlpha OneMinusSrcAlpha
			
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma fragmentoption ARB_precision_hint_fastest 
			#pragma target 3.0
			#include "UnityCG.cginc"

			sampler2D _MainTex;
			samplerCUBE _ToonShade;
			float4 _MainTex_ST;
			float4 _Color;
			int _UV_head;
     	 	float3 _hairColor;
   	     	float3 _shirtColor;
   		    float3 _shortColor;
        	
			struct appdata {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
				float3 normal : NORMAL;
			};
			
			struct v2f {
				float4 pos : POSITION;
				float2 texcoord : TEXCOORD0;
				float3 cubenormal : TEXCOORD1;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.cubenormal = mul (UNITY_MATRIX_MV, float4(v.normal,0));
				return o;
			}

			float4 frag (v2f i) : COLOR
			{
				float4 c = _Color * tex2D(_MainTex, i.texcoord);
				
	            if (i.texcoord.x >0.5 && i.texcoord.y >0.5 && _UV_head>1 ){
	                if (_UV_head<=2)
		            	i.texcoord.x +=0.25;
		            else if(_UV_head<=3)
		            	i.texcoord.y +=0.25;
		            else if(_UV_head<=4){
		            	i.texcoord.x +=0.25;
		            	i.texcoord.y +=0.25;
		            }
	            }
				
			    if (c.r >0.98 && c.g >0.98 && c.b < 0.02){
	            	c.rgb=_hairColor;
	            }else if (c.r  < 0.02 && c.g >0.98 && c.b >0.98){
	                c.rgb=_shirtColor;
	            }else if (c.r >0.98 && c.g < 0.02 && c.b >0.98){
	            	c.rgb=_shortColor;
	            }			
				
				float4 cube = texCUBE(_ToonShade, i.cubenormal);
				return float4(2.0f * cube.rgb * c.rgb, c.a);
			}
			ENDCG			
		}
		

	} 
	
	Fallback "VertexLit"
}

je sais pas si je suis très clair? 

ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
corentin3D
Messages : 331
Inscription : 26 Juin 2012 18:38
Contact :

Re: Random color

Message par corentin3D » 24 Août 2014 16:49

Salut !

Ben écoute pour commencer déjà merci pour ta réponse. J'en suis toujours au même point.
J'ai trouvé un lien sympa : http://waynelee3d.com/blog/2014/05/22/u ... om-colours
Mais d'après mon dev, il y aurait un souci avec le lien ci-dessus. Pour l'instant il a pas le temps de se pencher dessus (pas tout de suite en tout cas) donc je m'y colle, je fais juste de l'intégration pure dans Unity, pas de prog etc. Bon, je connais le fonctionnement des scripts etc, mais je suis pas codeur quoi.

J'ai ce résultat :

Image

Y a 3 systèmes de particules fait en amont dans Blender, puis baké et exporter, donc chaque sphère (ou molécules reliées) sont indépendant.

Le bût est d'arriver a ce résultat, un bukkake de couleur : Image

Validé suivant un gradient Image

D'ailleurs je me demande si on peut utilisé le gradient pour distribuer en random les couleurs ? Ou si il faut uniquement des colors type (ex) : Image

Thx

++
------------------------------
CB3D STUDIO | Créateur de pixels.
Agence de 3D et formation 3D agréée.

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Random color

Message par F@B » 25 Août 2014 09:43

Je ne vois pas ou ton dev a un soucis, c'est en gros la première solution que je te donne!? ou alors comme tu me dis c'est que tes particules sont un seul et meme object baké avec des couleurs différentes chaque fois??

je pense qu'il te faut donc un shader comme je t'ai donné, qui remplace à la volée les couleurs X par une au pif du gradient.

je sais pas si c'est clair! :)
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Random color

Message par Alesk » 25 Août 2014 10:48

Et en bidouillant les vertex color ?

Actuellement, tu affiches quoi dans unity ? des sphères "réelles" composées de plein de triangles ou des billboards ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Random color

Message par boubouk50 » 25 Août 2014 13:32

Tu peux utiliser un random entre 0.0 et 1.0 pour venir piquer dans ton image de gradient. Cette valeur sera celle de ton UV.
Pour utiliser un tableau de couleur, il te faut simplement définir les zones de couleurs. Ex: valeur entière aléatoire entre 0 et 7, la diviser par 7 pour obtenir un float entre 0 et 1 que tu utiliseras comme abscisse u d'UV, et de la même manière pour la coordonnée v avec d'autres limites (ici 0 et 3 pour ton tableau). EDIT : (attention à décaler un peu l'UV pour pas être sur l’arête ou bien le faire dans la texture)

De manière plus simple, la solution de définir à l'avance des couleurs et de les appliquer au départ comme le dit F@b, semble être la plus efficace. (Il te faudra définir ces valeurs à la main cependant)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

goldsmith
Messages : 1
Inscription : 28 Jan 2015 14:34

Re: Random color

Message par goldsmith » 28 Jan 2015 14:36

this is very nice post :D
Usman

Répondre

Revenir vers « les Shaders »