Question

J'ai un programme dans lequel je dois appliquer une texture 2 dimensions (image simple) sur une surface générée en utilisant l'algorithme marche-cubes. J'ai accès à la géométrie et peut ajouter les coordonnées de texture avec une relative facilité, mais la meilleure façon de générer les coordonnées me échappe.

Chaque point représente le volume d'une seule unité de données, et chaque unité de données peut avoir des propriétés différentes. Pour simplifier les choses, je regarde les classer en « types » et en attribuant chaque type une texture (ou une partie d'un seul grand atlas de texture).

Mon problème est que je ne sais pas comment générer les coordonnées appropriées. Je peux stocker l'emplacement de la texture de type dans la classe de type et l'utiliser, mais les coutures sera étirée horriblement (si deux points voisins utilisent différentes parties de l'atlas). Si possible, je voudrais mélanger les textures sur les coutures, mais je ne suis pas sûr de la meilleure façon de le faire. Blending est facultative, mais je dois texturer les sommets d'une certaine façon. Il est possible, mais indésirable, de diviser la géométrie en parties pour chaque type, ou de dupliquer des sommets à des fins texturation.

Je voudrais éviter d'utiliser les shaders si possible, mais si nécessaire, je peux utiliser un sommet et / ou fragment shaders pour faire le mélange de textures. Si je fais Shaders utilisation, ce serait la façon la plus efficace de dire qu'il était texture ou une partie de l'échantillon? Il semble que le passage du type par un paramètre serait le moyen le plus simple, mais possible lente.

Mes volumes sont relativement faibles, 8-16 points dans chaque dimension (je les garder pour en accélérer la génération, mais il y a beaucoup à un moment donné à l'écran). J'ai brièvement envisagé de faire la isosurface deux fois la résolution du volume, de sorte que chaque point a plus de sommets (8, en théorie), qui peut simplifier texturation. Il ne semble pas comme ça rendrait le mélange plus facile, cependant.

Pour construire les surfaces, j'utilise la Visualisation Bibliothèque pour OpenGL et ses cubes de marche et système de volume. Je l'amende produit de la géométrie, il suffit de comprendre comment texturer.

Est-il possible de le faire efficacement, et si oui quoi? Sinon, quelqu'un at-il une idée d'une meilleure façon de gérer un volume texturation?

Modifier : Juste à noter, la texture est pas simplement un dégradé de couleurs. Il est en fait une texture, le plus souvent avec des motifs. D'où la difficulté de cartographier ce, un gradient aurait été trivial.

Edit 2: Pour aider à clarifier le problème, je vais ajouter quelques exemples. Ils peuvent juste compliquer les choses, alors pensez à tout ce qui précède fait précis et ceux-ci tout comme l'aide si possible.

Ma géométrie est en cubes, toujours (chargé, produit et enregistré en cubes). Si la forme influe sur les solutions possibles, voilà.

Je dois appliquer des textures, composé de motifs et / ou des couleurs (les uniques selon le « type » du point de) à la géométrie, dans une technique similaire à la splatting fait pour le terrain (ce n'est pas le terrain, cependant, donc je ne sais pas si l'on pouvait utiliser les mêmes techniques).

Shaders sont une solution rapide et facile, bien que je voudrais les éviter si possible, comme je l'ai mentionné auparavant. Quelque chose utilisable dans un canal à fonction fixe est préférable, la plupart du temps pour l'augmentation mineure de la compatibilité et le temps de développement. Comme il est seulement une augmentation mineure, je vais aller avec Shaders et rendu multipass si nécessaire.

Je ne sais pas si une autre clarification est nécessaire, mais je vais mettre à jour la question au besoin.

Était-ce utile?

La solution 4

En raison des problèmes avec texturation et certaines des contraintes que j'ai, je l'ai choisi d'écrire un algorithme différent pour construire la géométrie et la poignée texturation directement dans ce qu'elle produit des surfaces. Il est un peu moins lisse que les cubes de marche, mais me permet d'appliquer les texcoords d'une manière qui fonctionne pour mon projet (et est un peu plus rapide).

Pour les personnes intéressées texturation marching cubes, ou le mélange juste textures, la réponse de Tommy est une technique très intéressante et les liens timday affichés sont d'excellentes ressources sur aplatissement mailles pour texturation. Merci à tous les deux pour leurs réponses, ils peuvent l'espérons être utiles à d'autres. :)

Autres conseils

Sur la partie de combinaison de texture de la question:

Avez-vous regardé dans les textures 3D? Comme nous parlons des cubes de marche, je devrais probablement dire tout de suite que je parle explicitement pas textures volumiques. Au lieu de cela vous empilez toutes vos textures 2D dans une texture 3D. Vous puis encodez chaque texture coordonnez être la position 2d serait et la texture il référence comme la troisième coordonnée. Il fonctionne mieux si vos textures sont généralement du type où, logiquement, à la transition d'un type de modèle à un autre, vous devez passer par les intermédiaires.

Un exemple d'utilisation est évidente texture mapping à une simple carte de hauteur - vous pourriez avoir une texture de la neige sur le dessus, une texture rocheuse en dessous, une texture herbe en dessous et une texture de l'eau au fond. Si un sommet qui fait référence à l'eau est à côté de celui qui fait référence à la neige alors il est acceptable pour le remplissage de la géométrie à la transition à travers la texture de la roche et l'herbe.

Une autre solution est de le faire en plusieurs passes utilisant un mélange additif. Pour chaque texture, dessiner chaque visage qui utilise cette texture et dessinent un fondu à travers des transparents extension faces passage d'une texture à l'autre.

Vous voudrez probablement pour préparer la mémoire tampon de profondeur avec un tirage complet (avec les masques de couleur tous ensemble pour rejeter les modifications dans la mémoire tampon de couleur), puis passer à un test de profondeur GL_EQUAL et tirer à nouveau avec un tampon d'écriture à la profondeur désactivée. Dessin exactement la même géométrie par exactement la même transformation devrait produire exactement les mêmes valeurs de profondeur indépendamment des questions de précision et de précision. Utilisez glPolygonOffset si vous avez des problèmes.

Sur la partie coordonnées:

Populaire et correspondances faciles sont cylindriques, boîte et sphérique. Conceptualiser que la forme est délimitée par un cylindre, boîte ou d'une sphère avec une application bien définie à partir de points de surface à des emplacements de texture. Ensuite, pour chaque sommet de votre forme, commencez et suivre la normale sur jusqu'à ce que vous frappez la géométrie de délimitation. Ensuite, prenez l'emplacement de texture qui serait à cette position sur la géométrie de délimitation.

Je suppose qu'il ya un problème potentiel qui Normales ont tendance à ne pas être brillant après des cubes en marche, mais je vais vous parier en savez plus sur ce problème que moi.

Ceci est un problème difficile et intéressant.

La façon la plus simple est d'éviter complètement la question en utilisant des cartes de texture 3D, surtout si vous voulez juste ajouter un peu de détails de la surface aléatoire à la géométrie de isosurface. Perlin textures procédurales liées au bruit mises en œuvre dans un travail de shaders très bien pour cela.

La façon difficile est de regarder dans divers algorithmes pour conformationnelle texture mapping (également connu sous le nom surface conformationnelle paramétrisation ), qui ont pour but de produire une correspondance entre l'espace de texture 2D et la surface de la géométrie 3D qui est dans une certaine optimal de détection (moins distorsion). Cette papier a quelques bonnes images. Sachez que la topologie de la géométrie est très importante; il est facile de générer une cartographie conformationnelle pour cartographier une texture sur une surface fermée comme un cerveau, beaucoup plus complexe pour plus genre objets où il est nécessaire d'introduire des coupes / larmes / jointures.

Vous pouvez essayer de faire une carte UV d'un maillage dans un outil comme Blender pour voir comment ils le font. Si je comprends bien votre problème, vous avez un champ 3D qui définit un volume solide ainsi qu'un (continu) couleur. Vous avez créé un maillage du volume, et maintenant vous devez UV-map la maille à une texture 2D avec texels extraites de l'espace colorimétrique en continu. Dans un outil définiriez « coutures » dans le maillage 3D que vous pourriez découpez de sorte que tout le maillage peut être posé à plat pour faire une carte UV. Il peut être aliasing dans votre texture au niveau des coutures, de sorte que lorsque vous rendre le maillage, il sera également discontinu à ces coutures (soit une bande de triangle ne peut pas traverser la couture, car il est une discontinuité dans la texture).

Je ne sais pas de méthodes formelles pour aplatir le maillage, mais vous pouvez imaginer couper le long des coutures, puis traiter la chose comme un système ressort / contrainte que vous déposez sur une surface plane. Je suis tout à résoudre les choses à la dure. ; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top