[Recherche] Effet de scan sur une planète.

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Shaowkan
Codeur
Codeur
Messages : 319
Inscription : 30 Sep 2012 12:37
Localisation : Marseille
Contact :

[Recherche] Effet de scan sur une planète.

Message par Shaowkan » 08 Mai 2016 17:47

Bonjour à tous.

Je recherche un shader permettant de faire un effet de scan sur une planète à la manière d'Eve Online.

Voici un gif :
Image

Étant complètement noob en shader. Je voulais savoir si vous avez déjà écrit ce genre de shader et si vous pouvez m'aider.
J'ai rechercher sur le net et je n'arrive pas à trouver un truc similaire.

Merci d'avance.

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

Re: [Recherche] Effet de scan sur une planète.

Message par F@B » 08 Mai 2016 20:18

Salut,

si je devais faire pareil je mettrais une color ramp qui scale et replace les valeur niveau de gris de ta texture avec une valeur de depart. un peu comme un cutout en fait.

peut être qu'il y a d'autres façons de faire.
ʕ·͡ᴥ·ʔ ==> 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
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: [Recherche] Effet de scan sur une planète.

Message par ZJP » 08 Mai 2016 21:12

ou plus simplement du "Dissolve" : :mrgreen:
https://www.google.com/search?q=unity3d+dissolve+shader
http://wiki.unity3d.com/index.php?title ... th_Texture
https://www.assetstore.unity3d.com/en/# ... r&dissolve

Avec des textures moins...chaotiques (Genre Metaballs) cela devrait le faire. :-D

Image

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

Re: [Recherche] Effet de scan sur une planète.

Message par F@B » 09 Mai 2016 08:57

je vois pas comment tu veux faire ça ZJP ?
ʕ·͡ᴥ·ʔ ==> 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
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [Recherche] Effet de scan sur une planète.

Message par boubouk50 » 09 Mai 2016 09:42

Tu te sers de la map comme d'un masque. Il te "suffit" d'ajouter le niveau de gris à une variable externe comprise entre -1 et 1 pour avoir une ramp qui va de noir complet à blanc complet.
"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

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

Re: [Recherche] Effet de scan sur une planète.

Message par Alesk » 09 Mai 2016 10:09

boubouk50 a écrit :Tu te sers de la map comme d'un masque. Il te "suffit" d'ajouter le niveau de gris à une variable externe comprise entre -1 et 1 pour avoir une ramp qui va de noir complet à blanc complet.
+1

Il faut deux textures : une avec le dégradé coloré et l'autre avec le motif en niveaux de gris.

Et comme tu débutes en shader, voici un exemple :

Code : Tout sélectionner

Shader "Unlit/noise_map"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Gradient("Gradient", 2D) = "white" {}
		_Offset("Offset", Range(-1, 1)) = 1
		_Value("Value", Range(0.1, 10)) = 1
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				UNITY_FOG_COORDS(1)
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			sampler2D _Gradient;
			float4 _Gradient_ST;
			
			float _Offset;
			float _Value;

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				// sample the texture
				fixed4 intensity = tex2D(_MainTex, i.uv);
				float2 uv;
				uv.x = clamp(pow(intensity + _Offset,_Value),0.01,0.999);
				uv.y = 0;
				
				fixed4 col = tex2D(_Gradient, uv );

				// apply fog
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
			ENDCG
		}
	}
}
A toi de voir si le calcul de "uv.x" correspond à ce que tu cherches ;)
Et si tu as des questions sur les fonctions utilisées, n'hésites pas à demander.

Avatar de l’utilisateur
Shaowkan
Codeur
Codeur
Messages : 319
Inscription : 30 Sep 2012 12:37
Localisation : Marseille
Contact :

Re: [Recherche] Effet de scan sur une planète.

Message par Shaowkan » 09 Mai 2016 17:50

Merci à vous pour vos réponses :)
Alesk a écrit :
boubouk50 a écrit :Tu te sers de la map comme d'un masque. Il te "suffit" d'ajouter le niveau de gris à une variable externe comprise entre -1 et 1 pour avoir une ramp qui va de noir complet à blanc complet.
+1

Il faut deux textures : une avec le dégradé coloré et l'autre avec le motif en niveaux de gris.

Et comme tu débutes en shader, voici un exemple :

Code : Tout sélectionner

Shader "Unlit/noise_map"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Gradient("Gradient", 2D) = "white" {}
		_Offset("Offset", Range(-1, 1)) = 1
		_Value("Value", Range(0.1, 10)) = 1
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				UNITY_FOG_COORDS(1)
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			sampler2D _Gradient;
			float4 _Gradient_ST;
			
			float _Offset;
			float _Value;

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				// sample the texture
				fixed4 intensity = tex2D(_MainTex, i.uv);
				float2 uv;
				uv.x = clamp(pow(intensity + _Offset,_Value),0.01,0.999);
				uv.y = 0;
				
				fixed4 col = tex2D(_Gradient, uv );

				// apply fog
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
			ENDCG
		}
	}
}
A toi de voir si le calcul de "uv.x" correspond à ce que tu cherches ;)
Et si tu as des questions sur les fonctions utilisées, n'hésites pas à demander.
C'est déjà pas mal merci Alesk.
Je pense qu'il me faudrais un mix entre ce code et ce que propose ZJP, un effet disolve :)

Pour donner plus de détail par rapport à l'image d'Eve Online. Ce scan permet de trouver les zones où les ressources de la planète sont les plus abondantes.
Mais je pense que vous l'avez compris :lol:

Petite question, est-il possible de lire des données d'un script C# à partir d'un script shader ?

Merci encore :)
Je vais continuer les recherches ^^.

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

Re: [Recherche] Effet de scan sur une planète.

Message par boubouk50 » 09 Mai 2016 19:52

Petite question, est-il possible de lire des données d'un script C# à partir d'un script shader ?
Oui, la classe shader te permet de la faire, shader qui est utilisé par ton material utilisé dans ton renderer.
"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

Répondre

Revenir vers « les Shaders »