GPU Instancer - ColorVariation - SpeedTree

Questions à propos du scripting Shader.
EdLooping
Messages : 49
Inscription : 07 Juin 2017 01:53

GPU Instancer - ColorVariation - SpeedTree

Message par EdLooping » 04 Mai 2020 07:55

Bonjour à tous !
Ca fait pas mal de temps que je n'suis pas venu sur le forum ayant pas mal progressé seul depuis 2-3 ans.
En revanche je reste débutant sur la programmation de shader et c'est bien le problème qui m'amène ajd.

J'utilise GPU Instancer pour instancer des milliers d'arbres, de plantes et de rochers :
https://assetstore.unity.com/packages/t ... cer-117566

L'asset propose un shader ColorVariation qui permet de changer de couleur d'une instance à l'autre et de pouvoir l'update.
ColorVariation.jpg
ColorVariation.jpg (157.75 Kio) Consulté 6855 fois
Le truc c'est que j'aimerais faire exactement ça mais sur les feuilles d'un SpeedTree ou d'un TreeCreator tree.
L'asset propose un shader pour chacun des types d'arbres mais qui ne dispose pas de la variation de couleur.

J'ai contacté le développeur qui m'a renvoyé sur cette page et qui m'a en gros gentiment dit de me démerder tout seul...
https://wiki.gurbu.com/index.php?title= ... on_them.3F

J'essaie depuis plusieurs jours de me démerder seul... mais sans résultat...
Si qq'un pouvait m'aider à trouver la solution ce serait vraiment sympa, je galère vraiment.

Je vous mets les codes du shader ColorVariation et du shader SpeedTree proposé par l'asset.
Vous pouvez trouver également dans le lien wiki le petit script C# qui permet de faire varier le shader ColorVariation.

Merci !!

Code : Tout sélectionner

Shader "GPUInstancer/ColorVariationShader" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200

		CGPROGRAM
		#include "UnityCG.cginc"
		#include "./../../../Shaders/Include/GPUInstancerInclude.cginc"
		#pragma instancing_options procedural:setupGPUI
		#pragma multi_compile_instancing
		#pragma surface surf Standard addshadow fullforwardshadows vertex:colorVariationVert

		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
			float4 colorVariation;
		};

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
			StructuredBuffer<float4> colorBuffer;
		#endif
		
		void colorVariationVert (inout appdata_full v, out Input o) {
			UNITY_INITIALIZE_OUTPUT(Input, o);

			o.colorVariation = _Color;

			#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
				o.colorVariation = colorBuffer[gpui_InstanceID];
			#endif
		}

		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * saturate(IN.colorVariation);
			o.Albedo = c.rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}

		ENDCG
	}
	FallBack "Standard"
}

Code : Tout sélectionner

Shader "GPUInstancer/Nature/SPDTree" 
{
}

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: GPU Instancer - ColorVariation - SpeedTree

Message par Max » 04 Mai 2020 12:15

Bonjour,

Attention aux codes que tu postes (shaders). Si le premier semble accessible à tout à chacun (il est apparemment dans la doc librement consultable, dont tu fournis le lien), le second semble issu de l'Asset, donc pas sûr que tu puisses le poster comme cela sur le forum.
Après, n'ayant pas cet asset sous la main, si je me trompe, dis le, on pourra le re-lister dans ton post.
Image
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

EdLooping
Messages : 49
Inscription : 07 Juin 2017 01:53

Re: GPU Instancer - ColorVariation - SpeedTree

Message par EdLooping » 04 Mai 2020 13:34

Oui je comprends mais il est quasi identique au script de base de Unity des SpeedTree que chacun peu éditer.
Puis on peut strictement rien en faire sans le reste de l'asset.
Et je ne pourrai pas vraiment me faire aider si je ne le poste pas puisque j'aimerais justement qu'on m'indique un moyen de faire un mix des deux...
D'ailleurs tu n'aurais pas une idée ?

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: GPU Instancer - ColorVariation - SpeedTree

Message par Max » 04 Mai 2020 14:16

EdLooping a écrit :
04 Mai 2020 13:34
mais il est quasi identique au script de base de Unity des SpeedTree que chacun peu éditer.
Puis on peut strictement rien en faire sans le reste de l'asset.
Oui je comprend, c'est souvent le soucis quand on est confronté à des soucis avec un asset payant et dont on ne peut pas fournir le contenu. Difficile d'être aidé. Si quelqu'un pense être en mesure de t'aider, vois avec lui pour transmettre les info par MP éventuellement.
Sinon, poste sur le forum officiel au niveau du fil dédié à l'asset. Même si l'auteur ne semble pas super enclin à se pencher sur ta question, d'autres membres (qui ont donc cet asset et donc les shaders associés) t'apporteront peut-être un début de réponse.
EdLooping a écrit :
04 Mai 2020 13:34
D'ailleurs tu n'aurais pas une idée ?
Arf, désolé mais les shaders ne sont pas mon domaine de prédilection (même si je me débrouille à l'occasion sur des shaders simples) :triste1:
Image
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

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

Re: GPU Instancer - ColorVariation - SpeedTree

Message par djulio74 » 04 Mai 2020 16:43

Mon avis :
- Comme dit plus haut, c'est sur que sans le deuxieme shader difficile de voir ce qu'il faut adapter.
- De plus toujours difficile aussi de modifier des asset tout fait, justement parce qu'il faut un moment déjà pour les comprendre et que chacun à sa vision de comment mettre en place les choses.

Ma piste :
Je ne connais pas ton asset (me sers jamais d'asset du net de toute façon, ^^) mais déja testé l'instanciation GPU via les outils présent dans unity.
- Le script dans ton lien cré un buffer (un array de variable pour permettre l'échange CPU/GPU en somme) avec une valeur pour chaque instance
- le shader recupère l'ID de l'instance qu'il est en train de gérer et va chercher la valeur correspondante dans le buffer pour la mixer avec le reste du shader.
- J'imagine tes arbres ont au moins deux matériaux ? si c'est le cas, récupérer le mat sur lequel changer la couleur.
- les lignes importantes pour ton shader d'exemple, et donc à mettre en place dans celui des arbres :

Code : Tout sélectionner

vertex:colorVariationVert
qui défini une fonction que va être appelé

Code : Tout sélectionner

#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
StructuredBuffer<float4> colorBuffer;
#endif
qui va créer u buffer si le mode GPUinstanciate est utilisé

Code : Tout sélectionner

void colorVariationVert (inout appdata_full v, out Input o) {
			UNITY_INITIALIZE_OUTPUT(Input, o);

			o.colorVariation = _Color;

			#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
				o.colorVariation = colorBuffer[gpui_InstanceID];
			#endif
		}
La fonction va soit utiliser la couleur de base du mat, soit utilisée celle du buffer à l'ID de l'instance correspondante

Code : Tout sélectionner

fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * saturate(IN.colorVariation);
qui va multipliser la texture de base par la couleur (du buffer ou de base suivant le cas (instancing ou pas)

Il faut donc dans la pratique transposer ces lignes dans le shader voulu et bien créer le buffer (attention aux noms donnés, qu'ils correspondent bien entre script et shader) qui va stocker les différentes couleurs.

Je ne peux pas vraiment faire mieux étant donné que tu utilise un asset avec des spécificité non propre a unity, et que je ne connais que trop peu les speedTree et treeCréator.

Si jamais tu peux en poster d'avantage (tes scripts et tes shader) je peux éventuellement essayer de t’aiguiller d'avantage.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

EdLooping
Messages : 49
Inscription : 07 Juin 2017 01:53

Re: GPU Instancer - ColorVariation - SpeedTree

Message par EdLooping » 04 Mai 2020 21:34

Salut. Merci pour ta réponse.
C'est en effet ce que j'avais compris et essayé de faire.
J'ai rajouté également le code :

Code : Tout sélectionner

			struct Input {
				float2 uv_MainTex;
				float4 colorVariation;
			};
car sinon il me dit :
Shader error in 'GPUInstancer/Nature/SPDTree': invalid subscript 'colorVariation' at line 51 (on d3d11)

Mais en rajoutant ce code il me dit :
Shader error in 'GPUInstancer/Nature/SPDTree': Unexpected token usertype. Expected: identifier at line 44

La ligne 44 étant : struct Input {

En gros j'en étais là. J'ai essayé de changer la place des termes dans le script, un peu tout tourné dans tous les sens mais rien y fait j'ai tjs des messages d'erreurs plus ou moins semblables...

Puis-je t'envoyer en MP le shader du SPDTree en question et qu'on essaie de se pencher dessus ?

Sinon en utilisant une bonne vielle technique de billboard je pense pouvoir contourner le problème.
Je génère 2 billboards, un pour mon tronc et un autre pour les feuilles et je fais varier la couleur de mon billboard feuille.
Jamais essayé mais je pense que c'est une alternative faisable.
Mais je pense y perdre d'une part en qualité de rendu mais surtout en terme d'optimisation...

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

Re: GPU Instancer - ColorVariation - SpeedTree

Message par djulio74 » 04 Mai 2020 22:31

n'aurais tu pas plutot deux fois le struct Input dans ton shader pour le coup?

pourquoi pas voir le shader complet mais je ne pourrait pas l'essayer vu je n'ai pas l'asset et qu'il y a l'air d'y avoir d'autres dépendance.
Montre déjà a quoi doit ressembler ta scène pour juger du niveau de détail requis, ça peut donner une piste de solution alternative.
Tes arbres sont-ils tous différents ou totalement identique à l'exception de position/rotation/scale?
si tu as un mesh pour tout tes arbres, regarde du coté des graphics.drawMesh de unity, c'est justement pour instancier via GPU.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
stigma
Messages : 1400
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: GPU Instancer - ColorVariation - SpeedTree

Message par stigma » 21 Oct 2023 11:00

GPU Instancer serait parfait pour moi mais un peu cher pour ma bourse :pleur4:
Pourquoi de tels outils sont-ils si chers ?

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

Re: GPU Instancer - ColorVariation - SpeedTree

Message par boubouk50 » 24 Oct 2023 10:26

Vue la somme de travail pour le développer et la plus-value d'un tel asset, 75€ c'est peu cher payé.
Pour un bon freelance, cela correspond à 1h de travail TTC.
"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
stigma
Messages : 1400
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: GPU Instancer - ColorVariation - SpeedTree

Message par stigma » 24 Oct 2023 11:07

Si j'étais certain que ça fonctionne sur mon projet, je n'hésiterais pas mais j'ai l'habitude d'acheter des Assets qui ne me servent pas en définitive. Tu connais cet outil ?

Répondre

Revenir vers « les Shaders »