Comment peindre sur des modèles 3D

Sep 17 2020

J'ai cherché ce sujet pendant très longtemps et je n'ai trouvé aucune information à ce sujet.

Si nous avons un modèle 3D avec une mise en page uv. Quelle est la technique de base pour la peinture 3D sur ledit modèle avec un pinceau? Un coup de pinceau se compose des données / image de pixel de pinceau disposées successivement. Alors projetons-nous chaque image de pinceau sur la surface de l'objet? (Bien qu'en réalité, pour ce faire, nous projeterions l'objet sur l'espace image à la place). J'ai déjà réussi à projeter des textures sur des objets. Et projeter chaque image de pinceau semble définitivement faisable, mais je ne suis pas sûr que ce soit pratique du point de vue des performances et s'il existe de meilleures techniques.

Réponses

1 wychmaster Sep 18 2020 at 15:18

Je ne peux pas vous donner une «meilleure» approche ici, mais je pense que l’approche

projeter chaque image de pinceau sur la surface de l'objet

n'est pas vraiment un problème de performances si vous implémentez cela à l'aide du GPU. Surtout dans un environnement d'édition, où il ne se passe pas grand-chose par rapport à un jeu vidéo. Tout ce que vous voulez faire est de rendre une seule image par image sur un ensemble limité de textures. Je peux vous donner un brouillon de la façon dont j'aborderais le sujet si j'avais besoin de cette fonctionnalité. Cependant, comme je ne l'ai pas encore implémenté moi-même, il peut y avoir des complications et des problèmes auxquels je n'ai pas pensé, alors faites-le moi savoir dans les commentaires si quelque chose ne fonctionne pas comme prévu.

  1. Trouvez les surfaces affectées

    • Utilisez les coins de la texture de votre pinceau et générez un frustum de projection de pinceau réduit
    • Vérifiez tous les objets et trouvez les surfaces les plus proches -> Si vous utilisez déjà une sorte de sélection pour votre scène, réutilisez la liste d'objets déjà éliminés, car le pinceau ne peut "voir" que ce que voit la caméra
    • Identifiez les sous-surfaces / triangles affectés par le pinceau
  2. Rassemblez toutes les textures affectées. Vous devez savoir pour chaque surface affectée, quelle texture elle possède. De manière optimale, votre objet entier n'a qu'une seule texture UV.

  3. Créez un programme de shader pour rendre votre texture.

    • attention, le vertex shader doit calculer les coordonnées UV normalisées et les transmettre le long du pipeline comme position de sommet, car elles sont la position dans votre texture. Vérifiez les informations supplémentaires dont vous avez besoin pour transmettre le pipeline.
    • Dans le shader de fragment, écrasez chaque pixel qui se trouve sous le pinceau. Vous devrez peut-être utiliser la fusion ici pour les pinceaux non rectangulaires.
    • La position de la brosse est un peu délicate. Vous en avez besoin dans l'espace UV des textures dans le shader de fragment et je ne sais pas si vous pouvez le calculer dans le vertex shader. Vous devrez peut-être le faire dans le shader de fragment ou dans un shader de géométrie. Le problème que je vois est que l'angle dans lequel la projection du pinceau frappe la surface ne peut pas être calculé dans le vertex shader et il est nécessaire de déterminer la zone couverte. Le geometry shader a suffisamment d'informations pour calculer l'angle et la zone couverte. Dans le shader de fragment, vous ne pouvez pas non plus calculer l'angle, mais vous pouvez simplement vérifier si et où il se trouve dans le tronc de projection du pinceau.
  4. Maintenant, rendez simplement vos textures.

    • Liez votre texture de pinceau
    • Pour chaque texture affectée
      • Lier la texture comme cible de rendu
      • Rendez tous les objets affectés et laissez le GPU trier les pixels qui doivent être écrasés.
  5. (Facultatif) Si vous souhaitez enregistrer vos modifications, vous devez relire les textures du GPU et les enregistrer.

Étant donné que le travail principal est effectué par le GPU, cela devrait être assez rapide. Cependant, je peux voir certains problèmes avec l'approche décrite lorsque le pinceau frappe plusieurs objets / textures qui se chevauchent partiellement. Le tri des pixels du pinceau affecte la texture / l'objet qui peut devenir désordonné. Il peut y avoir quelques astuces de tampon de pochoir / profondeur que l'on peut appliquer, mais je pense que c'est un sujet pour une autre question.

1 Thomas Sep 18 2020 at 15:13

Tant qu'aucun pixel de la texture n'est utilisé deux fois, vous pouvez rendre la géométrie et afficher les coordonnées UV (coordonnées de texture). Ils sont généralement une combinaison de rouge et de vert (2d). Lorsque vous utilisez un pinceau, il vous suffit de lire les coordonnées uv que vous avez frappées et de colorer la texture à la position (uv) dans la couleur souhaitée.

Astuce: peignez sur une seconde texture pour ne pas détruire la couleur d'origine de la texture.

Inconvénients: Parfois, la résolution de texture de différents triangles dans une géométrie varie. Ainsi, sur certains visages, il sera joli, et sur d'autres, il sera pixélisé.

Comme dit précédemment, si le maillage (géométrie) utilise deux fois la même partie d'une texture (deux faces visant les mêmes coordonnées de texture), et que vous dessinez sur l'une d'elles, l'autre sera également peinte.

the1bird Sep 17 2020 at 07:19

Vous pouvez le faire de différentes manières.

Mais le moyen le plus logique pour moi est qu'il y a des points échantillonnés le long du chemin, puis des splines / courbes de benzier sont utilisées pour le rendre lisse (des points supplémentaires peuvent être interpolés), puis ils sont projetés et enregistrés sur la texture. Il n'est donc pas nécessaire d'échantillonner «chaque» point.