LWJGL OpenGL спрайт лист - PullRequest
       7

LWJGL OpenGL спрайт лист

4 голосов
/ 27 декабря 2010

Я новичок в OpenGL и в настоящее время пытаюсь визуализировать куб с четырьмя гранями, каждая с разной текстурой.

Как вы все знаете, наличие отдельной текстуры для каждого типа лица требует очень много памяти изамедляет работу приложения.

В данный момент я пытаюсь использовать текстурный лист для спрайта.У меня есть графический файл с каждой текстурой 16x16 пикселей с 256 спрайтами, упорядоченными в квадрат (16x16).

Я знаю, что

GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(1.0f, 1.0f,  1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(0.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(0.0f, 0.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(1.0f, 0.0f, 1.0f);

дает мне прямоугольник со всем листом спрайта, так что u и v из glTexCoord2f имеют меньше 1,0f.

Теперь мне нужна формула, которая вычислит u и v любогоидентификатор спрайта в текстуре.

Идентификаторы идут в битовой карте текстуры следующим образом:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 16 20 21 22 23 24...

, и я хотел бы иметь u и v для любого из этихидентификаторы.Последний бит не очень хорошо объяснен, поэтому я объясню лучше, если хотите.

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 27 декабря 2010

Расположение текстуры спрайтов в изображении находится в массиве 16 x 16, поэтому расположение текстуры (если вы посчитаете первую как 0):

row = texNo / 16;
col = texNo % 16;

Тогда координаты:

u0 = row / 16;
u1 = (row + 1) / 16;

v0 = col / 16;
v1 = (col + 1) / 16; 

Затем замените 1.0f на u1 или v1, если необходимо, и 0.0f на u0 или v0 в вызовах glTexCoord2Df.

1 голос
/ 27 декабря 2010

Спрайт лист простирается от 0..1 в u и v.Если это 16x16, то верхние левые углы находятся в n/16, m/16, где n, m в диапазоне от 0..15.Если все ваши листы имеют размер 16x16, вы можете упростить свою жизнь, выделив 1/16 в матрицу текстур:

        glMatrixMode(GL_TEXTURE)
        glLoadIdentity()
        glScalef(1f/16f, 1f/16f, 1f)

Это позволит вам адресовать спрайт 0,0, 1,0, 2,0 и т. Д. С целыми числами из-за масштабирования в матрице.

Еще одно преимущество использования матрицы текстуры, подобной этой, заключается в том, что ваши текстурные координаты становятся целыми числами, и теперь вы можете использовать целочисленный тип в массиве вершинVBO для представления координат текстуры.

...