Texcoord dans Surface Lighting Model?

Questions à propos du scripting Shader.
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Texcoord dans Surface Lighting Model?

Message par boubouk50 » 05 Jan 2016 12:23

Salut les unitiens,

Question pour ceux qui pensent que les shaders c'est trop cool, ça déchire tout le reste haut la main:
Peut-on faire passer les coordonnées de textures dans le Surface Lighting Model?
A partir d'un shader Fake BRDF (mais aussi pour tout autre), je souhaiterai faire un displace de la couleur de la lumière dans la texture de gradient pour avoir un effet de grain.
Mais je n'arrive pas à envoyer les coordonnées de texture au Surface Lighting Model et je ne trouve pas l'info. Est-ce possible?

Code : Tout sélectionner

Shader "Custom/FakeBRDF" {
	Properties {
		_Noise ("Base (RGB)", 2D) = "grey" {}
		_Ramp2D ("BRDF Ramp", 2D) = "black" {}
	}
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Ramp
		#pragma target 2.0

		sampler2D _Noise;
		sampler2D _Ramp2D;

		struct Input {
			float2 uv_Noise;
		};

		half4 LightingRamp (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
		{
			float NdotL = dot (s.Normal, lightDir);
			float NdotE = dot (s.Normal, viewDir);
			
			//do diffuse wrap here
			float diff = (NdotL * 0.45) + 0.5;
			float2 brdfUV = float2((NdotE + 0.1) * 0.9, diff);
			float3 noiseTex = tex2D (_Noise, uv_Noise); //ICI je souhaiterai récupérer mon uv_Noise
			brdfUV.x = brdfUV.x + (noiseTex.x * 0.1f) - 0.05f;
			float3 BRDF = tex2D(_Ramp2D, brdfUV.xy).rgb;
			
			float4 c;
			c.rgb = BRDF;
			c.a = s.Alpha;
			return c;
		}

		void surf (Input IN, inout SurfaceOutput o) {
			half4 c = float4(0.5, 0.5, 0.5, 1);
			o.Emission = c.rgb * 0.25f;
			o.Albedo = float4(0, 0, 0, 1);
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Unlit"
}
La Gradient Ramp
Image
"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
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Texcoord dans Surface Lighting Model?

Message par ZJP » 05 Jan 2016 16:51

Pas vraiment d'idées là-dessus, mais une piste possible serait de jeter un oeil aux "shaders Toonesques". Ah oui, ceux qui "imitent" la peau (Skin) seraient aussi indiqués.

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

Re: Texcoord dans Surface Lighting Model?

Message par boubouk50 » 05 Jan 2016 17:07

J'ai déjà cherché la dessus.
Le Gradient Ramp utilisé n'est pas défini par une coordonnée de texture mais par l'intensité lumineuse (voire la tangente en sus). C'est ce que je fais d'ailleurs. Le mapping est appliqué quant à lui dans le surface shader, et là je peux choppé mes UVs.
Faut que j'arrive à les faire passer ici:

Code : Tout sélectionner

half4 LightingRamp (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {...}
Mais je trouve absolument pas d'info, et ce que je tente à l'aveuglette foire. Normal.

Il faudrait que je crée sinon l'UVs en fonction d'autre chose que l'intensité lumineuse et la tangent pour éviter que deux pixels qui pointent au même endroit sur le gradient ramp, pointe au même endroit sur la texture de Noise. Mais que ça reste cohérent. Je veux dire par là, que le mapping soit pas étiré à mort ou seulement sur certaines parties. Que je ne sois pas obligé d'adapter le shader en fonction des objets et des Gradient Ramp.
"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
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Texcoord dans Surface Lighting Model?

Message par boubouk50 » 13 Jan 2016 14:46

Bon, j'ai trouvé qu'on pouvait customiser le SurfaceOutput. On peut maintenant admirer le magnifique bruit dans l'éclairage:
Image

Code : Tout sélectionner

Shader "Custom/FakeBRDF" {
	Properties {
		_Noise ("Base (RGB)", 2D) = "grey" {}
		_Ramp2D ("BRDF Ramp", 2D) = "black" {}
	}
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Ramp
		#pragma target 3.0

		sampler2D _Noise;
		sampler2D _Ramp2D;

		struct Input {
			float2 uv_Noise;
		};
		
		struct SurfaceOutputCustom {
			fixed3 Albedo;
			fixed3 Normal;
			fixed3 Emission;
			fixed Alpha;
			fixed2 uv_Ramp2D;
		};

		half4 LightingRamp (SurfaceOutputCustom s, half3 lightDir, half3 viewDir, half atten)
		{
			float NdotL = dot (s.Normal, lightDir);
			float NdotE = dot (s.Normal, viewDir);
			
			//do diffuse wrap here
			float diff = (NdotL * 0.45) + 0.5;
			float2 brdfUV = float2((NdotE + 0.1) * 0.9, diff);
			float3 noiseTex = tex2D (_Noise, s.uv_Ramp2D);
			brdfUV.x = brdfUV.x + (noiseTex.x * 0.1f) - 0.05f;
			float3 BRDF = tex2D(_Ramp2D, brdfUV.xy).rgb;
			
			float4 c;
			c.rgb = BRDF;
			c.a = s.Alpha;
			return c;
		}

		void surf (Input IN, inout SurfaceOutputCustom o) {
			o.uv_Ramp2D = IN.uv_Noise;
		}
		ENDCG
	} 
	FallBack "Unlit"
}
Avec des ombres:

Code : Tout sélectionner

Shader "Custom/FakeBRDF Shadow" {
	Properties {
		_Noise ("Base (RGB)", 2D) = "grey" {}
		_Ramp2D ("BRDF Ramp", 2D) = "black" {}
	}
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Ramp
		#pragma target 3.0
		#include "UnityCG.cginc"
		#include "AutoLight.cginc"

		sampler2D _Noise;
		sampler2D _Ramp2D;

		struct Input {
			float2 uv_Noise;
		};
		
		struct SurfaceOutputCustom {
			fixed3 Albedo;
			fixed3 Normal;
			fixed3 Emission;
			fixed Alpha;
			fixed2 uv_Ramp2D;
		};

		half4 LightingRamp (SurfaceOutputCustom s, half3 lightDir, half3 viewDir, half atten)
		{
			float NdotL = dot (s.Normal, lightDir);
			float NdotE = dot (s.Normal, viewDir);
			
			//do diffuse wrap here
			float diff = (NdotL * 0.45) + 0.5;
			float2 brdfUV = float2((NdotE + 0.1) * 0.9, diff);
			float3 noiseTex = tex2D (_Noise, s.uv_Ramp2D);
			brdfUV.x = brdfUV.x * atten + (noiseTex.x * 0.1f) - 0.05f;
			float3 BRDF = tex2D(_Ramp2D, brdfUV.xy).rgb;
			
			float4 c;
			c.rgb = BRDF;
			c.a = s.Alpha;
			return c;
		}

		void surf (Input IN, inout SurfaceOutputCustom o) {
			o.uv_Ramp2D = IN.uv_Noise;
		}
		ENDCG
	} 
	FallBack "VertexLit"
}
La Ramp:
Image
"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
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Texcoord dans Surface Lighting Model?

Message par ZJP » 13 Jan 2016 16:28

Bien joué. Un bel exemple de "shader" qui met bien l'accent sur l'ordre d'exécution des diverses fonctions (et le passage entre-eux de "paramètres") : Vertex, Surface puis enfin Lighting. Bookmarked, comme on dit. 8-) 8-)



Ce n'était pas si compliqué que cela... :-D

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

Re: Texcoord dans Surface Lighting Model?

Message par boubouk50 » 13 Jan 2016 16:41

Au final, non. (Bon j'avoue depuis le post, j'ai pas eu le temps de m'y pencher sérieusement). Il suffit de chercher le vrai nom des choses puis Google fait le reste (plus ou moins).
Le custom surface output est bien utile, mais je pense que j'aurai pu passer l'info via une variable déjà existante que je n'utilise pas pour ce shader, genre Specular.
"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
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Texcoord dans Surface Lighting Model?

Message par ZJP » 13 Jan 2016 17:03

boubouk50 a écrit :Le custom surface output est bien utile
Oui. Le plus marrant c'est que j'avais déjà utilisé des "custom ouput" pour Moons en remplacement de certains "appdata_full" d’origine. Mais jamais entre les fonctions de "traitement" et celles de "Lightning". Je vais pouvoir (encore!!!) optimiser le moteur procedural avec un "Lambert" maison.
boubouk50 a écrit :... mais je pense que j'aurai pu passer l'info via une variable déjà existante que je n'utilise pas pour ce shader, genre Specular.
C'est la suite logique en effet. Une fois piger le truc, on s'amuse. Par exemple : ;-)

http://answers.unity3d.com/questions/36 ... custo.html
http://forum.unity3d.com/threads/is-the ... el.161765/

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

Re: Texcoord dans Surface Lighting Model?

Message par boubouk50 » 13 Jan 2016 17:15

ZJP a écrit :C'est la suite logique en effet. Une fois piger le truc, on s'amuse. Par exemple : ;-)

http://answers.unity3d.com/questions/36 ... custo.html
http://forum.unity3d.com/threads/is-the ... el.161765/
Ce sont les posts que j'ai trouvé et qui m'ont permis de finir mon shader de base. ^^
"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
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Texcoord dans Surface Lighting Model?

Message par ZJP » 13 Jan 2016 17:23

boubouk50 a écrit :
ZJP a écrit :C'est la suite logique en effet. Une fois piger le truc, on s'amuse. Par exemple : ;-)

http://answers.unity3d.com/questions/36 ... custo.html
http://forum.unity3d.com/threads/is-the ... el.161765/
Ce sont les posts que j'ai trouvé et qui m'ont permis de finir mon shader de base. ^^
Les grands esprits, toussa... :-D

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Texcoord dans Surface Lighting Model?

Message par Iwa » 13 Jan 2016 17:33

Tu as tellement mon respect éternel, maintenant que j'ai un peu mis les mains là dedans et que au final j'en suis ressortie machouillée :D. En tout cas ça fait un cool effet
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Répondre

Revenir vers « les Shaders »