Comment créer un objet à motifs avec une densité de motifs variable en temps réel?

8

Supposons qu'il existe une valeur p, calculée par image, qui varie continuellement sur la surface d'un objet. La valeur de pdétermine la densité d'un motif à la surface. Par exemple, dans un cas avec seulement deux densités possibles s'il p < 0.3s'agit d'une densité élevée, sinon elle est faible.

J'ai pensé à une solution simple de haut niveau: créer deux textures, chacune de densités différentes, et basée sur la valeur de l' péchantillon à partir de la bonne. Cependant, il y a un problème avec la frontière entre les hautes et les basses densités.

Voici un exemple pour illustrer le problème (notez que mon problème n'est PAS exclusif à cet exemple de modèle de points. Je décris les modèles avec lesquels je travaille plus tard):

entrez la description de l'image ici

Et voici le seuil entre faible et élevé (affiché sur la texture haute densité mais ce n'est pas pertinent.) Si sous la ligne, cela implique que la texture haute densité doit être échantillonnée.

entrez la description de l'image ici

Et enfin, voici la comparaison entre ce qui est souhaité et ce qui se passerait réellement en utilisant cette méthode:

entrez la description de l'image ici

Le problème est que lorsqu'un cercle haute densité uniquement traverse la ligne, il sera ignoré lorsque p indique la texture basse densité à échantillonner, résultant en un cercle tronqué. Je ne sais pas comment résoudre ce problème car pvarie à chaque image, donc je ne peux pas simplement "cuire" une frontière entre les deux densités. Il est facile de prévenir le problème inverse en créant la texture haute densité à partir de la texture inférieure (c.-à-d. Si un cercle est sur la texture basse densité, assurez-vous qu'il se trouve sur la texture haute densité).

Je suis intéressé si quelqu'un a un moyen d'améliorer ma solution ou a même une autre méthode entièrement. La contrainte ici est quep est calculée par image en temps réel. Une autre contrainte est liée à la texture du motif: le motif est en noir et blanc, où le noir est le motif et le blanc est l'arrière-plan (comme les cercles dans l'exemple). Le motif peut non seulement être des formes identiques répétées, mais tout arrangement de formes noires arbitraires sur un fond blanc. (Peut-être que le motif n'est pas le bon choix de mot.)

Je ne connais pas la recherche dans ce domaine, donc je ne savais pas quels mots clés rechercher, donc j'apprécierais même si quelqu'un pouvait me diriger dans la bonne direction.

Ryan
la source
3
Votre texture réelle est-elle également constituée uniquement de points noirs sur blanc? Si c'est le cas, vous pourriez être en mesure de générer la texture de manière procédurale, par exemple avec un échantillonnage de disque de Poisson avec des rayons variables. Sinon, si votre texture est en fait quelque chose de plus continu, le mélange pourrait être une option (cela ne fonctionnerait pas bien pour des textures nettes comme votre exemple). Donc, si vous pouviez clarifier à quoi ressemble votre motif / texture réel, cela pourrait aider à obtenir des réponses plus utiles.
Martin Ender
1
Processus de publication? Quelque chose comme une variante de la détection des contours: écrivez la distance jusqu'au centre du point le plus proche, puis, dans l'espace à l'écran, recherchez dans le voisinage de chaque point de chaque pixel toutes les valeurs (proches) de zéro. Cela donne des points d'espace à l'écran, vous devez donc écrire et jouer avec les dérivés UV pour revenir à l'espace de texture ... Notez que vous avez toujours un problème de continuité - lorsque la frontière p haute / basse se déplace sur la surface, des points apparaissent et disparaître. Si p peut être continu (une frontière douce), vous pourrez peut-être rétrécir / agrandir les points le long de la frontière ...
Daniel M Gessel
1
Une autre option consiste à examiner le carrelage Wang. introduction , génétique des carreaux , gemmes GPU
maogenc
1
Avez-vous regardé le bombardement de texture? http.developer.nvidia.com/GPUGems/gpugems_ch20.html
Mikkel Gjoel
1
Pouvez-vous donner une idée de la gamme de formes / motifs que vous devez couvrir et de la flexibilité qui peut y avoir dans l'approche? @ La suggestion de DanielMGessel de changer les rayons du cercle au lieu de leur densité pourrait rendre les choses plus simples et donner une animation plus fluide, mais il n'est pas encore clair à quel point votre approche est contrainte.
trichoplax

Réponses:

6

Afin de garantir que les formes du motif sont toujours entièrement présentes ou absentes, jamais coupées, il est nécessaire de s'assurer que la même pvaleur est utilisée pour tous les texels de la forme. Dans votre exemple de cercles, tous les texels d'un cercle donné doivent être d'accord p.

Je suppose que vous avez un moyen d'évaluer pà un point donné de la surface (qu'il soit recherché à partir d'une texture ou calculé à partir d'une fonction). Ensuite, une façon de s'assurer qu'un groupe de texels a tous la même pvaleur est de s'assurer qu'ils le recherchent tous du même point.

Les UV de ce point d'évaluation pourraient être stockés dans des canaux supplémentaires de la texture du motif. Par exemple, vous pouvez demander aux canaux rouge et vert de stocker les coordonnées UV auxquelles évaluerp , le canal bleu stocker le seuil auquel activer cet élément de motif et l'alpha stocker le niveau de gris anticrénelé du motif à afficher. Les données de seuil UV + peuvent également être dans une texture secondaire séparée si vous le souhaitez.

Pour générer cette texture de seuil UV +, à partir d'une texture de motif d'entrée, vous pouvez rechercher par programme les composants connectés (par exemple en recherchant des pixels noirs et en remplissant le flux). Définissez le point d'évaluation pour tous les texels de chaque composant sur les UV du centre du composant et générez un seuil aléatoire pour celui-ci. Ensuite, lors du rendu, utilisez un pixel shader qui échantillonne d'abord cette texture, puis recherche ple point d'évaluation donné et le compare au seuil donné.

De cette façon, chaque forme de motif verra une pvaleur et un seuil uniformes , et s'allumera ou s'éteindra complètement. À pmesure que les augmentations, de plus en plus de formes dépassent leur seuil et apparaissent, donnant l'impression d'une densité variant en continu.

Nathan Reed
la source
1
J'aime vraiment cette idée, je vais devoir l'essayer. C'est parfaitement logique. Merci!
Ryan
0

Une autre pensée va dans ce sens. Si vous avez un ensemble de points uniforme défini sur le plan et une fonction de mappage du plan à la surface cible, la fonction de densité sur la surface est la façon dont les zones sont mappées de la surface du plan à la cible. Ainsi, une carte préservant la zone se traduirait par des points uniformes sur la cible.

MB Reynolds
la source