Récupérer le rendu du materiau dans le canal UV

Questions à propos du scripting Shader.
Avatar de l’utilisateur
darkloy
Messages : 290
Inscription : 23 Mars 2011 09:36
Contact :

Récupérer le rendu du materiau dans le canal UV

Message par darkloy » 03 Juil 2020 10:39

Bonjour à tous,

Bon je coince sur un sujet sur lequel je suis pas super efficace...

J'ai deux mesh. Une sphère et un plan courbé. La sphère contient un shader qui dessine son intersection (en blanc) avec le plan courbé :

Image

J'ai réalisé le mapping UV du plan dans blender :
Image

Je souhaiterais récupérer le backing du rendu (donc le matériau noir du plan avec le cercle blanc de l'intersection) dans une texture dans l'espace UV du plan.

Quelque chose comme ça :

Image

Si vous avez des pistes, j'en serais très heureux :D

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

Re: Récupérer le rendu du materiau dans le canal UV

Message par djulio74 » 04 Juil 2020 11:24

Salut,
Alors ça c'est pas forcément simple, ça peut l'être un peu plus si l'objet a détecter est bien toujours une sphère d'une taille connue, et si c'est pas du temps réel mais bien un baking ponctuel.

Dans un script je récupérerai la position de chaque pixel de la texture sur le plan courbe, pour le transposer en position global, et comparerai la position de chacun des position avec celle de la sphère. Si la distance entre les deux est inférieur au rayon de la sphère, dans une nouvelle texture, écrire le pixel en blanc, sinon en noir.
C'est une idée comme ça à froid. Faudrait je regarde directement avec un shader ou compute shader pour avoir ça en temps réel sur toute forme d'intersection.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
darkloy
Messages : 290
Inscription : 23 Mars 2011 09:36
Contact :

Re: Récupérer le rendu du materiau dans le canal UV

Message par darkloy » 06 Juil 2020 08:23

Merci Djulio,

Le problème c'est que non seulement la sphère peux changer de taille, mais en plus cela peux être autre chose qu'une sphère :(

Faire ça via shader n'est t'il pas possible ?

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

Re: Récupérer le rendu du materiau dans le canal UV

Message par djulio74 » 06 Juil 2020 12:31

Si si ça doit pouvoir se faire, mais à mon sens pas de manière continue ignames mais de façon ponctuelle. Je crains ça soit gourmand.
D'ailleurs tu ne dis pas si tu veux récupérer ces info en pure baking ( par exemple une fois en début de partie), de façon répétée ( toute les x seconde) ou plus souvent ( tous les x frame)

Et ton plan courbe il va changer lui ou toujours le même ?

Edit : le problème de faire ça via un shader, c'est que je pense qu'il va être dépendant d'un point de vue, une caméra, et que tout dépend de tes formes, tu risque d'avoir des surfaces cachées duent à des mesh potentiellement fortement concave.
Pourquoi ne pas utiliser le baking natif de unity pour la lumière, car en gros ce que tu cherche à avoir c'est bien les parties d'un mesh caché ( à l'intérieur) par un autre

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
darkloy
Messages : 290
Inscription : 23 Mars 2011 09:36
Contact :

Re: Récupérer le rendu du materiau dans le canal UV

Message par darkloy » 06 Juil 2020 15:27

Merci pour ta réponse.

Effectivement ça sera ponctuel. Même si ça prends une seconde ce n'est pas du tout grave. Et le plan va être plié de façon aléatoire.

Je pense que tu a raison pour les shaders.
J'y ai pensé pour la lumière mais je trouve ça un peu boiteux.

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

Re: Récupérer le rendu du materiau dans le canal UV

Message par djulio74 » 06 Juil 2020 18:18

Alors si tu as un seul plan et que tu sais quel objet detecter, il y a la solution barbare :
- avoir un deuxième plan assez (tres) subdivisé
- que ton plan ai des vertex bien organisé a la façon des pixels d'une image (des index par ordre par ligne et par colone)
- tester la position de chaque vertex s'il se trouve dans le collider de l'objet à detecter
- ecrire une texture en fonction des resultat de chaque vertex

problème : avoir un mesh très subdivisé. un mesh de 128 vertex par 128 vertex te donner une texture de 128x128 pixels. Et peut être long (dans l'exemple, 16k conditions à verifier pour une simple texture 128x128)

Autre solution eventuelle, utilisation des compute shader. la methode reste similaire mais c'est le GPU qui traite les infos et pour ce genre d'application, le gain en temps de calcul peut être extrême.

Derniere solution, plus compliqué. Si tu sait exactement la déformation a appliquer à ton plan, tu devrait pouvoir appliquer la déformation inverse à ton objet à détecter. Avant de déformer ton plan, faire la déformation inverse a ton objet ce qui donnera ton plan qui reste plan, et ton objet déformé. de la faire un render textureen vu isometrique, qui couvre tout juste la surface de ton plan, avec une position de camera a peine plus haut que la surface de ton plan. Avec les render texture tu peu substituer les matériaux appliquer aux objets. donc utiliser un shader qui rend noir les parties éclairée et blanc sinon.
tu recupere la texture que tu applique a ton plan, annule la déformation inverse de l'objet et applique la bon déformation a ton plan. Remarque c'est cette solution la plus barbare ^^

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « les Shaders »