Вычисление координат текстуры для одной плитки с текстурным атласом в OpenGL - PullRequest
3 голосов
/ 10 декабря 2010

Я пытаюсь использовать текстурный атлас в игровой программе, которую я пишу на C # / OpenGl с библиотекой OpenTK.

Я загрузил свой текстурный атлас как текстуру в OpenGL (размер 256x256)и каждая плитка имеет размер 32x32.

Чтобы отобразить первую плитку атласа, я использовал этот код:

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 было вычислено путем деления 1/8, 8 - числоплиток в строке / столбце.

Я понятия не имею, как таким образом вычислить координаты второй плитки!Я попытался использовать 0,125 и 0,25 вместо 0 и 0,125 соответственно, но это ничего не делает.Я предполагаю, что вам не разрешено использовать значение больше нуля для (РЕДАКТИРОВАТЬ) первых (0) координат текстуры?

Если кто-то может помочь или предоставить лучший способ сделать это, это было бывысоко ценится!

Ответы [ 3 ]

2 голосов
/ 10 декабря 2010

Дайте этому шанс:

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);
1 голос
/ 10 декабря 2010
  1. Избавьтесь от "* зума". Просто вызовите gl.scale (zoom, zoom, 1), прежде чем gl.begin.
  2. просматривайте тайлы 8x8 во вложенном цикле следующим образом:

    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 голосов
/ 10 декабря 2010

Координаты текстуры находятся в диапазоне от 0 до 1. Представьте, что это перевод вашей сетки плиток, но вместо каждого 32x32 они равны 0,125fx0,125f.Кроме того, 256/8 = 32. Вы получили число, выполнив 32 / 256.

Чтобы получить вторую плитку (при условии, что вы проходите горизонтально), вам нужно сместить (т.е. добавить 0,125f) кваши координаты текстуры x значения.Пример:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...