Deux normales différentes sur un même vertex

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Alesk
Messages : 2302
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Deux normales différentes sur un même vertex

Message par Alesk » 16 Fév 2016 17:39

Ok merci beaucoup :)

Mais ça ne fonctionne pas :(

Pas ton shader hein, mais l'idée d'appliquer une normalmap flat sur un mesh lissé : le lissage est tout de même pris en compte :/

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

Re: Deux normales différentes sur un même vertex

Message par boubouk50 » 16 Fév 2016 17:59

Le lissage sera toujours pris en compte, ta normalMap sera là pour rectifier au mieux les normales.
C'est la création de ta normalMap qui va être déterminante. En fait, tu fais comme pour les meshs ultradétaillés, sauf qu'au lieu de projeter ton ultraMesh tu projettes ton modèle non lissé.
A priori, ce devrait le faire.
"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
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Deux normales différentes sur un même vertex

Message par Titan » 16 Fév 2016 19:25

Je viens de tomber sur ce sujet, et même si c'est vieux je tiens à souligner que les Geometry shader sont présent depuis directX10 (il y a 10 ans), pour un jeu Windows tu peut partir du principe que tout le monde y à accès (GeForce série 8000). En revanche c'est coté OpenGl que les geometry shader avaient pris un gros retard pour ne sortir qu'avec la 3.2 (il y a 6 ans) mais ça reste acceptable pour Mac et linux.
Enfin OpenGl ES 3.1 + AEP, première version mobile contenant les geometry shader est sortit il y a 2 ans, là par contre c'est encore un peu juste, mais c'est pas un shader indispensable à ton jeu et un fallback sans flat peut faire l'affaire.

A ta place c'est clairement la solution que j'aurai choisi.
____________________________________________
Hop Boy

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

Re: Deux normales différentes sur un même vertex

Message par F@B » 16 Fév 2016 22:10

Oui Titan par contre unity compile pas le geometry pour openGL j'ai l'impression, en tout cas mon shader de fur s'écrase comme une merde sous mac....
ʕ·͡ᴥ·ʔ ==> 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
Alesk
Messages : 2302
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Deux normales différentes sur un même vertex

Message par Alesk » 17 Fév 2016 01:59

Merci Titan pour les précisions.

Les geometry shaders ne sont dispo sur Unity que si on utilise DX11, et donc je préfèrerais m'en passer (pour le moment)
Je pense en attendant avoir trouvé une autre solution beaucoup plus simple... le temps de vérifier que ça fonctionne bien et je vous explique ça !

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

Re: Deux normales différentes sur un même vertex

Message par Alesk » 17 Fév 2016 13:21

Bon alors en fait non ... :(
Je suis tout bêtement revenu à mon truc initial où je stocke la normale secondaire dans la couleur des vertices... Et donc ça n'est pas mis à jour par le skinning du mesh, qui ne modifie bien que le buffer des normales "officielles".

On m'a dit que normalement la matrice "MODEL" était censée contenir toutes les transformations issues des bones pour chaque vertex (ce qui me paraissait un peu trop beau pour être vrai, mais comme j'étais à moitié endormi j'ai eu une brève lueur d'espoir...)

Je me suis basé sur ce shader : http://wiki.unity3d.com/index.php/Silho ... ed_Diffuse

En modifiant la première passe comme ceci (c'est très simple comme modif):

Code : Tout sélectionner

			v2f vert(appdata v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

				// utilisation de la couleur à la place de la normale
				float3 col;
				col.xyz = (1-v.color.rgb) * 2 - 1;

				float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, col.xyz);
				float2 offset = TransformViewToProjection(norm.xy);

				o.pos.xy += offset * o.pos.z * _Outline;
				o.color = _OutlineColor;

				return o;
			}
et donc ça me génère un mesh tout de travers, à partir du moment où il est skinné et animé avec des bones.
Pour un mesh non déformé, ça fonctionne parfaitement.

Quelqu'un saurait s'il existe un moyen de continuer sur cette voie (parce que le coup de la normal map, c'est bien cracra et pas pratique de mon point de vue) et faire en sorte d'appliquer les transformations des bones sur le buffer des couleurs de la même façon qu'il affecte celui des normales ?
(oui j'ai bien conscience que c'est ma question du départ :rouge: )
boubouk50 a écrit :Le lissage sera toujours pris en compte, ta normalMap sera là pour rectifier au mieux les normales.
C'est la création de ta normalMap qui va être déterminante. En fait, tu fais comme pour les meshs ultradétaillés, sauf qu'au lieu de projeter ton ultraMesh tu projettes ton modèle non lissé.
A priori, ce devrait le faire.
Réponse tardive: c'est ce que j'ai fait, mais je me retrouve toujours avec un mesh tout lissé, où l'on ne voit que les bordures des zones flat de la normalmap sur le mesh.
Comme la zone flat de la normalmap ne fait que s'ajouter au lissage actuel (sans le remplacer) c'est cohérent que ça garde un aspect lissé au final.
Dans ce cas il me faudrait une sorte de normalmap "inverse" qui vienne contre-balancer le lissage pour revenir à un aspect plat ... enfin je suppose.
Mais ce n'est pas une solution qui m'enchante des masses car elle n'est pas très "user friendly", et ça serait alors beaucoup plus simple de revenir à la solution du mesh inversé fait à la main.

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

Re: Deux normales différentes sur un même vertex

Message par Alesk » 18 Fév 2016 15:18

Bon... J'ai posé la même question, tournée autrement sur le forum officiel : http://forum.unity3d.com/threads/outlin ... st-2515773

Conclusion : je vais opter pour la solution du second mesh fait à la main.

Pour info : le SkinnedMeshRenderer mets à jour les buffers des normales et des tangentes, donc on m'a suggérer de passer par le buffer des tangentes pour y stocker mon second jeu de normales, puis de calculer les tangentes directement dans le shader... Mais comme j'ai envie d'avoir un shader pas trop lourd, je vais m'abstenir de passer par plus de tergiversations shaderesques sur ce point là ;)

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

Re: Deux normales différentes sur un même vertex

Message par boubouk50 » 21 Déc 2016 16:33

Yop Alesk,

J'ai un pb similaire: Je fais du flat avec displacement pour simuler le vent, l'eau, etc. Il me faut donc une normale unique pour chaque sommet (soudés) pour le displace (les sommets doivent bouger le long du même axe), mais également une normale par face pour l'éclairage.
Je vais partir comme toi sur un mesh non lissé, avec la normale lissée en vertex color. Par contre comment procèdes-tu pour coller la normale (Object-Space) dans le vertexColor? (j'utilise 3dsMax)
Si par hasard, tu aurais trouvé un autre moyen plus intéressant, je suis également preneur, par contre je suis limité à OpenGL 2.0.

Merci.
"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 »