разные текстуры на каждой грани куба GLKit

Я использую GL Kit для рисования куба, который вращается на экране. У меня это работает очень хорошо с одной и той же текстурой, нарисованной на каждой грани. Я хотел бы нарисовать разные текстуры на каждом лице.

В настоящее время мой код рисует куб именно так (обратите внимание, что на самом деле у меня есть 6 разных текстур, загруженных в массив theTextures, но пока я рисую только все стороны куба одинаково, когда меняю текстуры).

self.effect.texture2d0.name = theTextures[i].name;
self.effect.texture2d0.enabled = true;
self.effect.texture2d0.target = GLKTextureTarget2D;

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

glBindVertexArrayOES(_vertexArray); 

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);

Я сделал много поисков здесь, в stackOverflow, и просмотрел множество руководств, но не могу найти простой способ сделать это. Я предполагаю, что могу создать массив вершин для каждой из сторон и использовать glDrawElements для каждого массива вершин, но это кажется очень неэффективным. Есть ли способ сделать это без создания 6 разных массивов вершин? Спасибо!


person MarkV309    schedule 13.11.2012    source источник


Ответы (2)


Довольно распространенный способ сделать это — использовать текстурную карту. То есть одна текстура, содержащая все нужные вам подтекстуры. Таким образом, вы не перегружаете систему тоннами текстур, но при этом можете получить всю необходимую графику. Например, если бы здесь было всего 4 текстуры, у вас могло бы получиться вот такое изображение:

A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 

(ПРИМЕЧАНИЕ: все работает лучше всего, если стороны ваших текстур являются степенью двойки (2, 4, 8, 16, 32...), хотя они не обязательно должны быть квадратными!)

Затем, когда вы хотите использовать часть текстуры, просто выберите правильные координаты tx.s/tx.t, чтобы получить часть изображения, которую вы хотите на этом лице.

person Olie    schedule 02.06.2013

Мне удалось сделать это достаточно эффективным способом, хотя я до сих пор рисую каждую сторону отдельно. Я создаю разные массивы вершин и текстуры для каждой стороны, но использую только один массив Indice с вершинами, описанными в двух треугольниках. Если у вас есть какие-либо предложения, пожалуйста, пришлите их мне,

// draw one texture per side

for (int i = 0; i <= 5; i++)
{
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[i]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
    glEnableVertexAttribArray(GLKVertexAttribColor);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, myTexture[i].name);

    glDrawElements(GL_TRIANGLES, sizeof(Indices1)/sizeof(Indices1[0]), GL_UNSIGNED_BYTE, 0);
}
person MarkV309    schedule 03.12.2012
comment
Не могли бы вы опубликовать свой полный исходный код? Я пытаюсь сделать то же самое. - person Clay; 15.07.2013
comment
Убери последний комментарий. В итоге я остановился на решении Texture Map ниже. В итоге стало намного проще. - person Clay; 16.07.2013