[DB-AL]Shader d'eau

Questions à propos du scripting Shader.
eljeronimooo
Messages : 17
Inscription : 29 Sep 2018 17:25

[DB-AL]Shader d'eau

Message par eljeronimooo » 08 Nov 2018 06:28

Bonjour, débutant en shader je suis bloqué sur l'écriture d'un shader d'eau.

Pour maximer les chances de réponses j'expose rapidement le truc.
Je veux faire moi-même de l'eau, il me faut donc un shader.
ShaderGraph offre une alternative à ceux qui n'aime pas le HLSL (comme moi) mais il tourne avec un RendererPipeline différent.
On peut trouver des shaders compatibles pour remplacer ceux de notre projet mais certains sont dispos uniquement avec le RendererPipeline d'origine comme la Skybox procédurale.

Donc si quelqu'un connais des solutions pour convertir un ou en ShaderGraph ??? Mais visiblement c'est mort ça...

Dans l'attente qu'Unity incorpore shaderGraph avec le renderer natif, je me suis lancé dans la rédaction d'un SurfaceShader, le plus simple je pense.
Rien de ouf, une Color, un Fresnel, une NormalMap avec des Tilling différent superposé, une variable pour la Transparence, un Smoothness. Le tout mixer par votre serviteur, voilà le code :

Code : Tout sélectionner


Shader "Custom/Water" {
	Properties{
		_Color("Color", Color) = (1,1,1,1)
		_RimColor("Rim Color", Color) = (0.26,0.19,0.16,0.0)
		_RimPower("Rim Power", Range(0.5,8.0)) = 3.0
		_BumpMap("Normal Map", 2D) = "white" {}
		_Smoothness("Smoothness", Range(0,1)) = 0.6
		_Transparency("Transparency", Range(0,0.5)) = 0.3
	}
		SubShader{
			Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "ForceNoShadowCasting" = "true" "IgnoreProjector" = "true"}
			LOD 200
			Cull off
			//ZWrite Off

			CGPROGRAM
			// Physically based Standard lighting model, and enable shadows on all light types
			#pragma surface surf Standard fullforwardshadows

			// Use shader model 3.0 target, to get nicer looking lighting
			#pragma target 3.0

			float4 _Color;
			float4 _RimColor;
			float _RimPower;
			sampler2D _BumpMap;
			half _Smoothness;
			half _Transparency;

			struct Input {
				float2 uv_BumpMap;
				float3 viewDir;
			};


			// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
			// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
			// #pragma instancing_options assumeuniformscaling
			UNITY_INSTANCING_BUFFER_START(Props)
				// put more per-instance properties here
			UNITY_INSTANCING_BUFFER_END(Props)

			void surf(Input IN, inout SurfaceOutputStandard o) {
				fixed4 c = _Color;

				// Color
				o.Albedo = c.rgb;

				// Normal
				o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap) + tex2D(_BumpMap, IN.uv_BumpMap * 4));

				//Rim (fresnel)
				half rim = saturate(dot(normalize(IN.viewDir), o.Normal));
				o.Emission = _RimColor.rgba * pow(rim, _RimPower);

				// Smoothness
				o.Smoothness = _Smoothness;

				//Transparency
				o.Alpha = _Transparency;
			}
			ENDCG
		}
			FallBack "Diffuse"
}


Seulement plusieurs problèmes reste sans solution malgré mes recherches :
- La commande de transparence "o.Alpha = _Transparency;" n'est pas interprétée, ma texture reste opaque
- J'aimerais modifier le Rim (ou un autre effet) pour faire comme un Fresnel de shaderGraph (avec la couleur du secondaire sur l'extérieur)
- Si je place un cube au-dessus de l'eau, il ne projette pas d'ombre sur l'eau mais sur le sol en contrebas, j'aimerais que l'ombre soit sur l'eau

Dans un second temps je pense ajouter des améliorations, celles-ci sont-t'elle possibles avec un SurfaceShader ? Si oui, des sources à partager ??
- Réflexion avec déformation
- Réfraction avec déformation
- Adapter le Tilling en fonction de la taille de l'objet directement dans le shader

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL]Shader d'eau

Message par djulio74 » 08 Nov 2018 08:57

Salut! ;)

J'ai regardé un peu ton shader et pour répondre a tes questions :
- la transparence ne marche pas car il faut ajouter alpha au #pragma : voir Doc Unity : Optional parameters
Et ça marche peut importe le Queue ou RenderType

Code : Tout sélectionner

#pragma surface surf Standard fullforwardshadows alpha
- Le fresnel est en général un effet de reflection : plus le regard est "razant" une surface plus la reflection est importante. Si tu regarde un verre d'eau de dessus, quasi rien ne se reflette, si ton oeil est au niveau de la surface, l'au devien miroir et impression de non transparente.
D'ailleurs ton code pour le Rim est faux, tu as oublié un "1-" au début : voir Doc Unity : Rim Lighting
Tu devrait aussi rajouter une intensité

Code : Tout sélectionner

half rim = 1 - saturate(dot(normalize(IN.viewDir), o.Normal));
toujours pour ton effet Rim, il est bon pour ce que tu dis vouloir ( en rajoutant le 1-), mais c'est ton utilisation de la normal map qui ne l'est pas.

Code : Tout sélectionner

o.Normal = UnpackNormal(tex2D(_BumpMap , IN.uv_BumpMap));
// a la limite avec un multiplicateur
o.Normal = UnpackNormal(tex2D(_BumpMap , IN.uv_BumpMap)) * 5.0;
- pour ce qui est des ombre, c'est normal. un objet transparent ne reçoit pas d'ombre, ce qui permet de voir un objet transparent, c'est les reflet qu'il produit.

Pour ce qui est des améliorations que tu veux apporter, oui tout est possible avec le surface shader ;-)
- pour la reflection/refraction, il va falloir créer une CubeMap, Soit statique en assignant des texture au 6 faces d'un cube, soit en dynamique via un script : Camera.RenderToCubemap

Pour tout ce que tu veux faire, je pense il serait préférable ( pas obligé, mais plus flexible à mon gout) de passer par Custom lighting models in Surface Shaders.

Je pose ton shader corrigé selon moi :

Code : Tout sélectionner

Shader "Custom/Water" {
	Properties{
		_Color("Color", Color) = (1,1,1,1)
		_RimColor("Rim Color", Color) = (0.26,0.19,0.16,0.0)
		_RimPower("Rim Power", Range(0.5,8.0)) = 3.0
		_BumpMap("Normal Map", 2D) = "white" {}
		_Smoothness("Smoothness", Range(0,1)) = 0.6
		_Transparency("Transparency", Range(0.0,1.0)) = 0.3
	}
		SubShader{
			Tags { "RenderType" = "Opaque"}
			LOD 200
			Cull off
			//ZWrite Off

			CGPROGRAM
			// Physically based Standard lighting model, and enable shadows on all light types
			#pragma surface surf Standard fullforwardshadows alpha     

			// Use shader model 3.0 target, to get nicer looking lighting
			#pragma target 3.0

			float4 _Color;
			float4 _RimColor;
			float _RimPower;
			sampler2D _BumpMap;
			half _Smoothness;
			half _Transparency;

			struct Input {
				float2 uv_BumpMap;
				float3 viewDir;
			};

			void surf(Input IN, inout SurfaceOutputStandard o) {

				fixed4 c = _Color;
				// Color
				o.Albedo = c.rgb;

				// Normal
				o.Normal = UnpackNormal(tex2D(_BumpMap , IN.uv_BumpMap));

				//Rim (fresnel)
				half rim = 1-saturate(dot(normalize(IN.viewDir), o.Normal));
				o.Emission = _RimColor.rgb * pow(rim, _RimPower);

				// Smoothness
				o.Smoothness = _Smoothness;

				//Transparency
				o.Alpha = _Transparency;

			}
			ENDCG
		}
			FallBack "Diffuse"
}



Hésite pas à montrer l'évolution de ton shader et poser des questions si besoin. ;-) :super:

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

eljeronimooo
Messages : 17
Inscription : 29 Sep 2018 17:25

Re: [DB-AL]Shader d'eau

Message par eljeronimooo » 08 Nov 2018 23:08

Merci de tes conseils

- La tranparence marche grâce à toi ;) , seulement une petite chose me perturbe. En ajoutant "alpha" au #pragma j'obtient une légere anomalie uniquement dans la preview de la texture
Image sans "aplha"
Image
Image avec "alpha"
Image
C'est pas génant car ça n'apparaît pas dans la scene mais c'est surement pas optimal, non ?

- Le Fresnel marche mieux avec la normal bien définie, merci

- Pour les ombres, c'est embétant quand même, le rendu est choquant. On ne peut pas corriger au moins l'ombre du cube projetée au sol ?
Image

J'ai à peu de chose près conservé tes modifs, sauf :
"Queue" = "Transparent" //Qui permet de ne pas avoir par exemple les arbres qui passent au premier plan au rendu
"ForceNoShadowCasting" = "true" //Qui permet de ne pas avoir l'ombre de l'objet eau projetée sur le sol
Voilà le nouveau code :

Code : Tout sélectionner

Shader "Custom/Water" {
	Properties{
		_Color("Color", Color) = (1,1,1,1)
		_RimColor("Rim Color", Color) = (0.26,0.19,0.16,0.0)
		_RimPower("Rim Power", Range(0.5,8.0)) = 3.0
		_BumpMap("Normal Map", 2D) = "white" {}
		_Smoothness("Smoothness", Range(0,1)) = 0.6
		_Transparency("Transparency", Range(0,1)) = 0.3
	}
		SubShader{
			Tags {"RenderType" = "Opaque" "Queue" = "Transparent" "ForceNoShadowCasting" = "true" "IgnoreProjector" = "true"}
			LOD 200
			Cull off

			CGPROGRAM
			// Physically based Standard lighting model, and enable shadows on all light types
			#pragma surface surf Standard fullforwardshadows alpha

			// Use shader model 3.0 target, to get nicer looking lighting
			#pragma target 3.0

			float4 _Color;
			float4 _RimColor;
			float _RimPower;
			sampler2D _BumpMap;
			half _Smoothness;
			half _Transparency;

			struct Input {
				float2 uv_BumpMap;
				float3 viewDir;
			};


			// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
			// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
			// #pragma instancing_options assumeuniformscaling
			UNITY_INSTANCING_BUFFER_START(Props)
				// put more per-instance properties here
			UNITY_INSTANCING_BUFFER_END(Props)

			void surf(Input IN, inout SurfaceOutputStandard o) {
				fixed4 c = _Color;

				// Color
				o.Albedo = c.rgb;

				// Normal
				o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)) * 5.0;

				//Rim (fresnel)
				half rim = 1 - saturate(dot(normalize(IN.viewDir), o.Normal));
				o.Emission = _RimColor.rgba * pow(rim, _RimPower);

				// Smoothness
				o.Smoothness = _Smoothness;

				//Transparency
				o.Alpha = _Transparency;
			}
			ENDCG
		}
			FallBack "Diffuse"
}
Pour les améliorations, je regarde ça avec attention et je reviens vers toi, merci pour ton aide :)

eljeronimooo
Messages : 17
Inscription : 29 Sep 2018 17:25

Re: [DB-AL]Shader d'eau

Message par eljeronimooo » 11 Nov 2018 16:26

Bon avec de bon réglages et une normale bien faite le shader que j'ai mis fonctionne bien :) merci
Les effet de réfraction avec ReflectionProbe sont surement très bien pour faire des vitres ou une carrosserie de voiture mais pour un océan.. en regardant le code de StandardAsset/Environement/WaterProDaytime je pense qu'ils utilisent la Camera comme source pour la CubeMap mais cela semble vraiment compliqué, je met de côté pour l'instant ainsi que la Réfraction qui est presque inutile avec la Transparence.

Je n'ai donc plus que 2 choses à régler :
- Retirer l'ombre du cube projetée au sol bien qu'il soit placé au dessus de l'eau (voir image au dessus)
- Faire de l'écume blanche sur la texture, là ou l'eau est en contact avec le Terrain

Si vous avez des infos, sources, mots clé... pour m'aider ce serait cool car pour l'écume je ne sais même pas quel technique utiliser. :)

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL]Shader d'eau

Message par djulio74 » 11 Nov 2018 16:36

Salut.
Oui ici dans ton shader tu simule une pseudo réflection avec ton rim, alors que normalement ce rim +fresnel sert à intensifier ou non la réflection d'une cube map, en fonction de on angle de vue par rapport à la surface.
Dans ce cas oui ça sera un peu plus complexe mais pas compliqué non plus. Dans les liens que je t'avais donné, tu as un exemple de réflection avec cube map.

Pour l'ombre, tu peux juste décocher receive shadow dans l'inspector de ton mesh représentant le fond marin, mais c'est pas une bonne solution.
Normalement, avec une eau claire, tu aura toujours l'ombre, alors que l'ombre s'estompe plus si l'eau est moin claire.
Du coup peut être avec un fig en fonction de la hauteur du mesh, tu trouvera un effet voulu ( idem voir mes liens plus haut)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: [DB-AL]Shader d'eau

Message par Liven » 11 Nov 2018 17:21

eljeronimooo a écrit :
08 Nov 2018 06:28
Dans l'attente qu'Unity incorpore shaderGraph avec le renderer natif
Je ne crois pas que ce soit prévus.

Sinon désolé, je peux pas t'aider sur le codage de shader, mais je vois que tu est déjà entre de bonnes mains.

Répondre

Revenir vers « les Shaders »