Question

Comment répéter une sélection d'un atlas de texture?

Par exemple, mon sprite (sélection) se situe dans les coordonnées de texture:

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

Je souhaite ensuite répéter ce sprite N fois sur une bande de triangle (ou quad) définie par:

.
GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

Je sais que cela a quelque chose à voir avec GL_REPEAT et textureCoords dépassant la plage [0,1]. Cela ne fonctionne cependant pas: (essayer de répéter N = 10)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

Nous voyons notre atlas de texture complet répété ...

Comment ferais-je cela correctement?

Était-ce utile?

La solution

Cela ne peut pas être fait de la manière décrite dans la question. Les modes de coordonnées de texture d'OpenGL s'appliquent uniquement à la totalité de la texture.

Normalement, pour répéter une texture, vous devez dessiner un polygone & "; plus grand &"; que votre texture implique. Par exemple, si vous aviez une texture carrée que vous souhaitiez répéter plusieurs fois (six par exemple) sur une surface plus grande, vous dessineriez un rectangle six fois plus large que haut. Ensuite, vous définissez les coordonnées de texture sur (0,0) - (6,1) et le mode de texture sur & "Répéter &"; Lors de l'interpolation sur le polygone, la coordonnée de texture au-delà de 1 entraînera & "; Le rebouclage &"; dans la texture, ce qui a pour effet de mapper la texture six fois sur le rectangle.

Aucun des modes d’enveloppement de texture ne prend en charge le type d’opération décrit dans la question, c’est-à-dire qu’ils correspondent tous à la plage [0,1] complète, et non à un sous-ensemble arbitraire. lorsque vous texturez en utilisant seulement une partie de la texture, il est impossible de spécifier cette coordonnée de texture plus grande de manière à ce que OpenGL la répète à l'intérieur du seul sous-rectangle.

Vous avez essentiellement le choix entre deux possibilités: créer une nouvelle texture ne contenant que l’image-objet désirée parmi la texture existante ou écrire un programme de sommet GLSL pour mapper les coordonnées de la texture de manière appropriée.

Autres conseils

Je ne suis pas sûr que vous puissiez faire cela. Je pense que les modes de coordonnées de texture d'OpenGL s'appliquent uniquement à la totalité de la texture. Lorsque vous utilisez un atlas, vous utilisez des & "; Sous-textures &" ;, afin que vos coordonnées de texture ne se rapprochent jamais de 0 et 1, limites normales où l’emballage et le clampage ont lieu.

Il se peut qu'il y ait des extensions pour gérer cela, je n'ai pas vérifié.

EDIT: Normalement, pour répéter une texture, vous devez dessiner un polygone & "; plus grand &"; que votre texture implique. Par exemple, si vous aviez une texture carrée que vous souhaitiez répéter plusieurs fois (six par exemple) sur une surface plus grande, vous dessineriez un rectangle six fois plus large que haut. Ensuite, vous définissez les coordonnées de texture sur (0,0) - (6,1) et le mode de texture sur & "Répéter &"; Lors de l'interpolation sur le polygone, la coordonnée de texture au-delà de 1 entraînera & "; Le rebouclage &"; dans la texture, ce qui a pour effet de mapper la texture six fois sur le rectangle.

C’est un peu brutal à expliquer sans images.

De toute façon, lorsque vous texturez en utilisant seulement une partie de la texture, il n’est pas possible de spécifier cette coordonnée de texture plus grande de manière à ce qu’OpenGL la répète à l’intérieur du sous-rectangle.

Aucun des modes d’enveloppement de texture ne prend en charge le type d’opération que vous recherchez, c’est-à-dire qu’ils correspondent tous à la plage [0,1] complète, et non à un sous-ensemble arbitraire. Vous avez essentiellement le choix entre deux choix: créer une nouvelle texture contenant uniquement l’image-objet souhaitée parmi la texture existante ou écrire un programme de pixels GLSL pour mapper les coordonnées de la texture de manière appropriée.

Bien que cela puisse être un vieux sujet; voici comment j'ai fini par le faire:

Une solution de contournement consisterait à créer plusieurs maillages, collés ensemble, contenant le sous-ensemble des UV de texture.

Exemple: J'ai une texture laser contenue dans un atlas de texture plus grand, à U [0.05 - 0.1] & Amp; V [0,05-0,1].

Je construirais alors N mailles, chacune ayant U [0.05-0.1] & amp; V [0.05-0.1] coordonnées. (N = longueur / texture.Hauteur; la hauteur étant la dimension de la texture que je voudrais répéter. Ou plus facile: le nombre de fois où je souhaite répéter la texture.)

Cette solution serait plus rentable que de devoir recharger texture après texture. Surtout si vous mettez en lots tous les appels de rendu (comme il se doit).

(OpenGL ES 1.0,1.1,2.0 - Matériel mobile 2011)

Ne peut être fait ...

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