2010-12-27 3 views
4

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

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

На данный момент я пытаюсь использовать лист текстуры для спрайта. У меня есть графический файл с каждой текстурой 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); 

дает мне прямоугольник со всей спрайта листа, так и uv из 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 для любого из этих идентификаторов. Последний бит не объясняется очень хорошо, поэтому я объясню это лучше, если вы захотите.

Спасибо заранее!

ответ

5

Местоположения текстуры спрайтов в изображении в 16 х 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 вызовы.

+0

Проблема, с которой я сейчас сталкиваюсь, - это идентификатор, идущий от 0 в левом нижнем углу до 15 в верхнем левом углу и так далее. – s5d

+0

В этом случае значения, которые вы хотите для строки и столбца, вероятно: row = (16 - texNo)% 16; col = texNo/16; –

1

Лист спрайтов простирается от 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 для представления координат текстуры.

+0

Как насчет наличия других листов текстуры с разной шириной/высотой? – s5d

+0

Абсолютная ширина/высота листа не имеет значения (она всегда соответствует единицам 1 × 1 у.е.). Если вы имеете в виду, что у вас есть листы с разными матрицами спрайтов (например, 2x2, 16x16, ...), вы всегда можете масштабировать их для лучших. –