Comment utiliser GL REPEAT pour ne répéter qu'une sélection d'un atlas de texture? (OpenGL)

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

par exemple, mon sprite (selection) est dans les coordonnées de texture:

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

Ensuite, je veux le répéter, sprite n fois à une bande triangulaire (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 qu'il a quelque chose à faire avec GL_REPEAT et textureCoords va passé la gamme [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 complète se répéter...

Comment faire de la bonne façon?

18
demandé sur Kriem 2009-03-19 15:59:04

5 réponses

cela ne peut pas être fait de la façon décrite dans la question. Les modes de coordonnées de texture d'OpenGL ne s'appliquent qu'à l'ensemble de la texture.

Normalement, pour répéter une texture, vous dessinez un polygone qui est "plus grand" que votre texture implique. Par exemple, si vous aviez une texture carrée que vous vouliez répéter un certain nombre de fois (par exemple six) sur une plus grande surface, vous dessineriez un rectangle qui est six fois plus large qu'il est grand. Ensuite, vous définissez les coordonnées de texture à (0,0)-(6,1), et la texture mode à "répéter". Lors de l'interpolation à travers le polygone, la coordonnée de texture qui va au-delà de 1 sera, en raison de la répétition étant activé, "wrap around" dans la texture, provoquant la texture à être cartographié six fois à travers le rectangle.

aucun des modes d'enveloppement de texture ne supporte le type d'opération décrit dans la question, c'est-à-dire qu'ils se positionnent tous à la gamme complète [0,1], pas un sous-ensemble arbitraire. quand vous texturez en utilisant juste une partie de la texture, il n'y a aucun moyen de spécifier que une plus grande coordonnée de texture de manière à ce Qu'OpenGL ne la répète qu'à l'intérieur du sous-rectangle.

vous avez essentiellement deux choix: soit créer une nouvelle texture qui n'a que le sprite dont vous avez besoin à partir de la texture existante, soit écrire un programme de vertex GLSL pour cartographier les coordonnées de la texture de manière appropriée.

18
répondu Kriem 2011-01-08 13:24:19

Je ne suis pas sûr que tu puisses faire ça. Je pense que les modes de coordonnées de texture D'OpenGL ne s'appliquent qu'à l'ensemble de la texture. Lorsque vous utilisez un atlas, vous utilisez des "sous-textures", de sorte que vos coordonnées de texture ne s'approchent jamais de 0 et 1, les limites normales où l'emballage et le serrage se produisent.

il pourrait y avoir des extensions pour traiter cela, je n'ai pas vérifié.

modifier: Normalement, pour répéter une texture, vous dessinez un polygone qui est "plus grand" que votre texture implique. Par exemple, si vous aviez une texture carrée que vous vouliez répéter un certain nombre de fois (par exemple six) sur une plus grande surface, vous dessiniez un rectangle qui est six fois plus large qu'il est grand. Ensuite, vous définissez les coordonnées de texture à (0,0) - (6,1), et le mode de texture à "répéter". Lors de l'interpolation à travers le polygone, la coordonnée de texture qui va au-delà de 1 sera, en raison de la répétition étant activé, "wrap around" dans la texture, provoquant la texture à être cartographié six fois à travers le rectangle.

C'est un peu brut d'expliquer sans images.

de toute façon, quand vous texturez en utilisant juste une partie de la texture, il n'y a aucun moyen de spécifier cette plus grande coordonnée de texture d'une manière qui fait Qu'OpenGL la répète à l'intérieur seulement du sous-rectangle.

6
répondu unwind 2009-03-19 13:56:19

aucun des modes Wrap de texture ne supporte le type d'opération que vous recherchez, c'est-à-dire qu'ils se positionnent tous à la gamme complète [0,1], pas un sous-ensemble arbitraire. Vous avez essentiellement deux choix: soit créer une nouvelle texture qui n'a que le sprite dont vous avez besoin à partir de la texture existante ou écrire un programme de pixel GLSL pour mapper les coordonnées de la texture de manière appropriée.

5
répondu TrayMan 2009-03-20 05:17:00

c'est peut-être un vieux sujet; voici comment j'ai fini par le faire:

Une solution serait de créer plusieurs mailles, collées ensemble contenant le sous-ensemble de la Texture UV.

E. g.: J'ai une texture laser contenue dans un atlas de texture plus grand, à U[0,05 - 0,1] & V[0,05-0,1].

je construirais alors des mailles N, chacune ayant des coordonnées U[0,05-0,1] & V[0,05-0,1]. (N = Longueur / texture.hauteur; hauteur étant la dimension de la texture que je voudrais comme pour répéter. Ou plus facile: le nombre de fois où je veux répéter la texture.)

Cette solution serait plus rentable que d'avoir à recharger texture après texture. Surtout si vous lot rendre tous les appels (comme vous).

(OpenGL ES 1.0, 1.1, 2.0-Mobile Hardware 2011)

1
répondu Methius 2011-12-09 11:48:42

ne Peut pas être fait...

-3
répondu Jimmy J 2009-03-19 13:58:54