[Resolu]Niveau d'eau variable dans une carafe

Questions à propos du scripting Shader.
EmileF
Messages : 619
Inscription : 18 Mars 2017 19:39

[Resolu]Niveau d'eau variable dans une carafe

Message par EmileF » 16 Déc 2019 12:57

Bonjour, encore une petite question,

Je voudrais dans une carafe ou un vase transparent, de forme irrégulière, créer un niveau d'eau qui puisse suivre les contours du vase selon la hauteur du niveau. et aussi que les couleurs soient différentes au dessous et au dessus du niveau.

Je ne sais pas si j'ai été assez clair.

Merci de me guider un peu pour ce détail. Je ne sais pas si ça peut se faire avec une déformation de mesh ou avec les shaders.

Un conseil ou un tuto serait super, mes recherches ont été négative sur le web.

Merci
Dernière édition par EmileF le 16 Déc 2019 17:30, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7883
Inscription : 30 Juil 2011 13:57

Re: Niveau d'eau variable dans une carafe

Message par Max » 16 Déc 2019 13:28

Bonjour,

Peut-être que ce genre de chose pourrait convenir:

https://www.youtube.com/watch?v=yDU_KKfvrFE
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

EmileF
Messages : 619
Inscription : 18 Mars 2017 19:39

Re: Niveau d'eau variable dans une carafe

Message par EmileF » 16 Déc 2019 13:36

Super merci Max.

Ca a l'air de correspondre tout à fait à ce que j'ai cherché.

Je vais étudier ça avec beaucoup d’intérêt.

Merci beaucoup. avec Unity.fr on n'est jamais bloqué.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 619
Inscription : 18 Mars 2017 19:39

Re: Niveau d'eau variable dans une carafe

Message par EmileF » 16 Déc 2019 17:05

Une petite question subsidiaire.

Le shader marche bien en mode Edit.

En mode play, en cas de mouvement du vase, le liquide réagit comme je le souhaitais. Pas de problème la dessus.

Maintenant , j'essaye d'ajouter une fonction qui me permet de modifier la hauteur du liquide en mode play, et là ça coince. je n'arrive pas à trouver le principe pour modifier la propriété FillAmount du shader

Voila le shader que j'utilise et qui fonctionne très bien en mode edit:

Code : Tout sélectionner

Shader "Unlit/SpecialFX/Liquid"
{
	Properties
	{
		_Tint("Tint", Color) = (1,1,1,1)
		_MainTex("Texture", 2D) = "white" {}
		_FillAmount("Fill Amount", Range(-10,10)) = 0.0
		[HideInInspector] _WobbleX("WobbleX", Range(-1,1)) = 0.0
		[HideInInspector] _WobbleZ("WobbleZ", Range(-1,1)) = 0.0
		_TopColor("Top Color", Color) = (1,1,1,1)
		_FoamColor("Foam Line Color", Color) = (1,1,1,1)
		_Rim("Foam Line Width", Range(0,0.1)) = 0.0
		_RimColor("Rim Color", Color) = (1,1,1,1)
		_RimPower("Rim Power", Range(0,10)) = 0.0
	}

		SubShader
		{
			Tags {"Queue" = "Geometry"  "DisableBatching" = "True" }

					Pass
			{
			 Zwrite On
			 Cull Off // we want the front and back faces
			 AlphaToMask On // transparency

			 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;
			  float3 normal : NORMAL;
			};

			struct v2f
			{
			   float2 uv : TEXCOORD0;
			   UNITY_FOG_COORDS(1)
			   float4 vertex : SV_POSITION;
			   float3 viewDir : COLOR;
			   float3 normal : COLOR2;
			   float fillEdge : TEXCOORD2;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _FillAmount, _WobbleX, _WobbleZ;
			float4 _TopColor, _RimColor, _FoamColor, _Tint;
			float _Rim, _RimPower;

			float4 RotateAroundYInDegrees(float4 vertex, float degrees)
			{
			   float alpha = degrees * UNITY_PI / 180;
			   float sina, cosa;
			   sincos(alpha, sina, cosa);
			   float2x2 m = float2x2(cosa, sina, -sina, cosa);
			   return float4(vertex.yz , mul(m, vertex.xz)).xzyw;
			}


			v2f vert(appdata v)
			{
			   v2f o;

			   o.vertex = UnityObjectToClipPos(v.vertex);
			   o.uv = TRANSFORM_TEX(v.uv, _MainTex);
			   UNITY_TRANSFER_FOG(o,o.vertex);
			   // get world position of the vertex
			   float3 worldPos = mul(unity_ObjectToWorld, v.vertex.xyz);
			   // rotate it around XY
			   float3 worldPosX = RotateAroundYInDegrees(float4(worldPos,0),360);
			   // rotate around XZ
			   float3 worldPosZ = float3 (worldPosX.y, worldPosX.z, worldPosX.x);
			   // combine rotations with worldPos, based on sine wave from script
			   float3 worldPosAdjusted = worldPos + (worldPosX  * _WobbleX) + (worldPosZ* _WobbleZ);
			   // how high up the liquid is
			   o.fillEdge = worldPosAdjusted.y + _FillAmount;

			   o.viewDir = normalize(ObjSpaceViewDir(v.vertex));
			   o.normal = v.normal;
			   return o;
			}

			fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
			{
				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv) * _Tint;
			// apply fog
			UNITY_APPLY_FOG(i.fogCoord, col);

			// rim light
			float dotProduct = 1 - pow(dot(i.normal, i.viewDir), _RimPower);
			float4 RimResult = smoothstep(0.5, 1.0, dotProduct);
			RimResult *= _RimColor;

			// foam edge
			float4 foam = (step(i.fillEdge, 0.5) - step(i.fillEdge, (0.5 - _Rim)));
			float4 foamColored = foam * (_FoamColor * 0.9);
			// rest of the liquid
			float4 result = step(i.fillEdge, 0.5) - foam;
			float4 resultColored = result * col;
			// both together, with the texture
			float4 finalResult = resultColored + foamColored;
			finalResult.rgb += RimResult;

			// color of backfaces/ top
			float4 topColor = _TopColor * (foam + result);
			//VFACE returns positive for front facing, negative for backfacing
			return facing > 0 ? finalResult : topColor;

		  }
		  ENDCG
		 }

		}
}
Voici le script que j'utilise pour essayer de modifier la hauteur du liquide

Code : Tout sélectionner

    public void HauteurLiquide(float h)
    {
        MaterialPropertyBlock block = new MaterialPropertyBlock();
        transform.GetComponent<Renderer>().GetPropertyBlock(block);
        block.SetFloat("_FillAmount", h);
        transform.GetComponent<Renderer>().SetPropertyBlock(block);
    }
Je pense que dans le shader, il faut faire une modification pour accepter cette valeur. Je n'arrive pas à comprendre vraiment le fonctionnement des shaders, aussi, il m'est très difficile d'adapter celui là à mes désirs.

Est-ce que quelqu'un peut m'aider svp?
Dernière édition par EmileF le 16 Déc 2019 17:31, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 619
Inscription : 18 Mars 2017 19:39

Re: Niveau d'eau variable dans une carafe

Message par EmileF » 16 Déc 2019 17:30

En fait, ça fonctionne comme ça, c'était les valeurs utilisées qui n'étaient pas adaptées à mon cas.

Dans le shader, le FillAmount va de -10 à 10, en mode Edit j'avais du mal pour le mettre au niveau que je voulais
En mode play Impossible.
En fait dans mon cas le fil amount doit aller de 0.37 à 0.60. Je ne sait pas pourquoi, ce doit être une question de taille de l'objet, bien que mon scale est à 1.

Je ne comprends pas tout, mais ça marche.

merci.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5404
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [Resolu]Niveau d'eau variable dans une carafe

Message par boubouk50 » 16 Déc 2019 17:42

Ca à l'air d'être un offset world, donc il faut qu'il soit adapté à ton objet.
Aussi, je pense que la configuration initiale (sans fillAmount) devrait être une bouteille à moitié pleine (ou à moitié vide) pour avoir un range centré sur le 0. Ainsi, tu aurais un fillAmount compris entre -0.115 et -0.115.
Je ne sais pas comment il s'utilise mais tu dois avoir un objet de réglage initial pour définir où tu dois couper non? Ou bien est-ce automatique?
"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

EmileF
Messages : 619
Inscription : 18 Mars 2017 19:39

Re: [Resolu]Niveau d'eau variable dans une carafe

Message par EmileF » 16 Déc 2019 18:23

Boubouk a écrit :Je ne sais pas comment il s'utilise mais tu dois avoir un objet de réglage initial pour définir où tu dois couper non? Ou bien est-ce automatique?
Je ne comprends pas vraiment ta question. mais quand j'ai récupéré le shader, les valeurs de base pour le FillAmount étaient -10 à 10.

Je pense que si c'est des valeurs mondiales, si je change la position verticale de mon vase, ces valeurs devraient être changées.

Après maint tâtonnement j'ai fini pas trouvé que les valeurs qui me conviennent sont 0.37 pour le vase plein et 0.60 pour le vase vide.

Je vais donc me tenir entre ces valeurs pour mes besoins. Mais pourquoi, je ne sais pas.

En tout cas, merci Boubouk.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5404
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [Resolu]Niveau d'eau variable dans une carafe

Message par boubouk50 » 16 Déc 2019 18:34

EmileF a écrit :
16 Déc 2019 18:23
Je pense que si c'est des valeurs mondiales, si je change la position verticale de mon vase, ces valeurs devraient être changées.
Non, c'est un offset, une addition par rapport à la position des sommets. Donc où que ta carafe soit, tu auras toujours les mêmes valeurs.
Par opposition, elles auraient pu être dépendantes de la taille de l'objet pour avoir des valeurs en pourcentage donc entre 0 et 100% par exemple, et ne pas avoir à trouver la dimension réelle.
"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

EmileF
Messages : 619
Inscription : 18 Mars 2017 19:39

Re: [Resolu]Niveau d'eau variable dans une carafe

Message par EmileF » 16 Déc 2019 19:34

Ha d'accord,

Je pense que tu as raison au sujet de la taille. Mais du coup, comme j'ajoute un flotteur, ça me donne la position plus facilement

merci
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « les Shaders »