Page 1 sur 1

Random color

Publié : 23 Août 2014 16:13
par corentin3D
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 !

Re: Random color

Publié : 24 Août 2014 11:23
par F@B
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? 


Re: Random color

Publié : 24 Août 2014 16:49
par corentin3D
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

++

Re: Random color

Publié : 25 Août 2014 09:43
par F@B
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! :)

Re: Random color

Publié : 25 Août 2014 10:48
par Alesk
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 ?

Re: Random color

Publié : 25 Août 2014 13:32
par boubouk50
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)

Re: Random color

Publié : 28 Jan 2015 14:36
par goldsmith
this is very nice post :D