2013-08-04 2 views
1

Это заставило меня сходить с ума в течение последних нескольких дней.Картирование текстур в LWJGL

Я оживляющий spritesheet, и это на самом деле работает отлично на моем 96 пикселей 384px текстуры с этим кодом:

glBegin(GL_QUADS); 
     glTexCoord2f((frameCount*24.0f)/imgWidth, (row*24.0f)/imgHeight); glVertex3f(0+x, 0+y, -0.001f*(y+32)); 
     glTexCoord2f((frameCount*24.0f)/imgWidth, ((row+1)*24.0f)/imgHeight); glVertex3f(0+x, 32+y, -0.001f*(y+32)); 
     glTexCoord2f(((frameCount+1)*24.0f)/imgWidth, ((row+1)*24.0f)/imgHeight); glVertex3f(32+x, 32+y, -0.001f*(y+32)); 
     glTexCoord2f(((frameCount+1)*24.0f)/imgWidth, (row*24.0f)/imgHeight); glVertex3f(32+x, 0+y, -0.001f*(y+32)); 
    glEnd(); 

Проблема в том, однако, что, когда я загружаю в 32px 32px текстуры, это выглядит странно ! Я подозреваю, что число 24.0f должно отличаться в зависимости от размера текстуры, но я не могу понять, как это сделать.

Второй вопрос: как этот метод влияет на производительность, есть ли лучшие способы сделать это?

+0

Фактически, я решил это с помощью: \t \t texture.bind(); \t \t \t \t glBegin (GL_QUADS); \t \t \t glTexCoord2f (32.0f * frameCount/imgWidth, 32.0f * row/imgHeight); glVertex3f (0 + x, 0 + y, -0.001f * (y + 32)); \t \t \t glTexCoord2f (32.0f * frameCount/imgWidth, 32.0f * (row + 1)/imgHeight); glVertex3f (0 + x, 32 + y, -0.001f * (y + 32)); \t \t \t glTexCoord2f (32.0f * (frameCount + 1)/imgWidth, 32.0f * (row + 1)/imgHeight); glVertex3f (32 + x, 32 + y, -0,001f * (y + 32)); \t \t \t glTexCoord2f (32.0f * (frameCount + 1)/imgWidth, 32.0f * row/imgHeight); glVertex3f (32 + x, 0 + y, -0.001f * (y + 32)); \t \t glEnd(); Но все еще хотите знать, эффективен ли это? – Deenis

ответ

0

координаты текстуры для оси х (ширину или ¯u значения) должен быть:

frameCount * (frameWidth/imgWidth) 

с frameWidth быть ширином каждого кадра в вашей текстуре и imgWidth быть общей шириной текстуры.

координаты текстуры для оси у (по высоте или об значения) должен быть:

frameCount * (frameHeight/imgHeight) 

с frameHeight быть высотой каждого кадра в вашей текстуре и imgHeight быть общей высотой текстуры (в этом случае они, вероятно, одинаковы, так как каждая текстура кадра имеет такую ​​же высоту, как и вся текстура здесь, или это то, что я предполагаю, глядя на ваш код).

Если вы хотите, чтобы код был более эффективным, вы можете прекомпретировать умножения, которые происходят несколько раз для каждого квадранта. Таким образом, вы можете, вероятно, преумножить:

float widthFraction = frameWidth/imgWidth; 
float heightFraction = frameHeight/imgHeight; 

То же самое относится и к вычислениям координат вершин.

Свыше сотни тысяч вершин, это определенно ускорит вычисления, но вы должны сравнить два метода, чтобы узнать, сколько.

Смежные вопросы