2010-12-10 10 views
3

J'essaie d'utiliser un atlas de texture dans un programme de jeu que j'écris en C#/OpenGl avec la bibliothèque OpenTK.Calcul des coordonnées de texture pour une seule tuile avec un atlas de texture en OpenGL

J'ai chargé mon atlas de texture en tant que texture dans OpenGL (dimension 256x256) et chaque pavé est 32x32.

Pour obtenir la première tuile de l'atlas pour afficher, j'ai utilisé ce code:

GL.Begin(BeginMode.Quads); 
GL.TexCoord2(0, 0); GL.Vertex2(0, 0); 
GL.TexCoord2(0.125f, 0); GL.Vertex2((32 * zoom), 0); 
GL.TexCoord2(0.125f, 0.125f); GL.Vertex2((32 * zoom), (32 * zoom)); 
GL.TexCoord2(0, 0.125f); GL.Vertex2(0, (32 * zoom)); 
GL.End(); 

0,125 a été calculée en divisant 1/8, 8 étant le nombre de tuiles dans une ligne/colonne.

Je ne sais pas comment calculer les coordonnées de la deuxième tuile de cette façon! J'ai essayé d'utiliser 0,125 et 0,25 à la place de 0 et 0,125 respectivement, mais cela ne rend rien. Je suppose que vous n'êtes pas autorisé à utiliser une valeur supérieure à zéro pour (EDIT) les premières coordonnées de texture (0)?

Si quelqu'un pourrait aider ou fournir une meilleure façon de le faire, il serait très apprécié!

+0

Veuillez [ne pas utiliser de signatures ou de slogans] (http://stackoverflow.com/faq#signatures) dans vos publications. – meagar

Répondre

1
  1. Débarrassez-vous de la "zoom *". Il suffit de passer un appel à gl.scale (zoom, zoom, 1) avant gl.begin.
  2. regarder à travers les carreaux de 8x8 dans une boucle imbriquée comme ceci:

    GL.Scale(zoom*32,zoom*32,1);
    GL.Begin(BeginMode.Quads);
    for (int i=0; i<8; i++)
    for (int j=0; j<8; j++)
    {
    var x = i/8.0; // texture scale
    var y = j/8.0;
    GL.TexCoord2(x, y); GL.Vertex2(i, j);
    GL.TexCoord2(x+0.125f, y); GL.Vertex2(i+1, j);
    GL.TexCoord2(x+0.125f, y+0.125f); GL.Vertex2(i+1, j+1);
    GL.TexCoord2(x, y+0.125f); GL.Vertex2(i, j+1);
    }
    GL.End();
    GL.Scale(1.0/(zoom*32),1.0/(zoom*32),1); // unzoom

+0

Pour # 1, cela augmente les performances que je devine? Merci pour ce conseil. Je commençais à être confus par les maths, je suis en train de revenir à la programmation après une longue pause.Merci beaucoup :) – CPatton

+0

Désolé pour le double commentaire, mais juste une question: J'ai remarqué que lorsque j'ai utilisé ce code, une ligne droite grisâtre est apparue au bas de l'atlas de texture. Il n'y avait que 4 textures et le reste était transparent (32 bits png) .. Une raison pour cela? Merci – CPatton

+0

Hmm ... Je ne suis pas sûr de comprendre le problème. Peut-être poster une photo (essayez imgur.com). – sharoz

2

Donnez ce un coup:

int col = 0; 
int row = 0; 
float tex_w = 256; 
float tex_h = 256; 
float tile_w = 32; 
float tile_h = 32; 
float w_factor = tile_w/tex_w; 
float h_factor = tile_h/tex_h; 

float x_tex_beg = w_factor*(col+0); 
float x_tex_end = w_factor*(col+1); 
float y_tex_beg = h_factor*(row+0); 
float y_tex_end = h_factor*(row+1); 
+0

Merci beaucoup! Cela aidera un peu dans ma routine de génération de coordonnées :) – CPatton

0

Les coordonnées de texture sont entre 0 et 1. Imaginez comme une traduction de votre grille de tuiles, mais au lieu de chaque être 32x32, ils sont 0.125fx0.125f. Aussi, 256/8 = 32. Vous avez le numéro en faisant 32/256.

Pour obtenir la deuxième tuile (en supposant que vous traversez horizontalement) vous devez déplacer (c'est-à-dire ajouter 0,125f) à vos coordonnées de texture x. Exemple:

GL.TexCoord2(0.125f, 0); GL.Vertex2(0, 0); 
GL.TexCoord2(0.25f, 0); GL.Vertex2((32 * zoom), 0); 
GL.TexCoord2(0.25f, 0.125f); GL.Vertex2((32 * zoom), (32 * zoom)); 
GL.TexCoord2(0.125f, 0.125f); GL.Vertex2(0, (32 * zoom)); 
+0

ah, j'ai obtenu le nombre en faisant 1/8, mais la même chose! :) Aha! Il est facile d'être confus par le 0 ici, j'ignorais complètement la différence entre x et y et je regardais simplement les valeurs telles qu'elles étaient. Merci beaucoup, je vais essayer – CPatton