Привязка нескольких текстур к одному мешу в OpenGL ES 1.1

Если у меня есть сетка (например, куб с 6 гранями, каждая из которых состоит из 4 вершин, всего 24 вершины), и я хочу применить к каждой грани разные текстуры, как мне это сделать? В настоящее время я рисую сразу всю сетку (все 6 граней куба) с помощью glDrawElements(), передавая все индексы в один буфер. Я не вижу способа применить текстуру к подмножеству индексов при рисовании. Придется ли мне разделять индексы, рисовать каждую грань одну за другой, перепривязывать текстуры между каждой гранью, или есть более красноречивое решение?


person shpen    schedule 22.07.2011    source источник


Ответы (2)


Да, вам придется рендерить каждую грань по-разному (соответственно разделять и привязывать текстуру для каждой грани). Это не элегантно и некрасиво, но это довольно просто, если у вас есть ваши индексы в их собственном буфере элементов (буфер GL, а не ShortBuffer или что-то в этом роде). Вы можете просто указать смещение в буфере, используя glDrawElements и количество треугольников для рисования для каждой грани. Затем это выглядит примерно так (псевдокод):

static class IndexRange
{
    public int offset
    public int numIndices
}

// ... later, down the hall and to the left ...

int faceTextures[] = {tex0, tex1, tex2, ...}
IndexRange faceIndices[] = {face0, face1, face2, ...}

// setup buffers and all that jazz

for (index = 0; index < numFaces; ++index)
{
    IndexRange face = faceIndices[index]
    int texture = faceTextures[index]

    glBindTexture(GL_TEXTURE_2D, texture)
    glDrawElements(GL_TRIANGLES, face.numIndices, GL_UNSIGNED_SHORT, face.offset)
}

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

person Community    schedule 22.07.2011
comment
Это путь. Одним из способов использования буферов Java является изменение буферов во время отрисовки. Тем не менее, я обычно использую VBO, чтобы легко установить смещение для вершин, и я пропускаю использование обычных массивов вершин, поскольку в настоящее время почти каждый Android-телефон поддерживает VBO. - person Wroclai; 23.07.2011

Вы должны использовать несколько текстурных блоков. Ознакомьтесь с документацией по функции glClientActiveTexture() в спецификации. Также см. этот вопрос.

ОБНОВЛЕНИЕ: вы также можете рассмотреть возможность использования libgdx, очень хорошей оболочки OpenGL ES (и не только) .

person kar    schedule 22.07.2011
comment
У меня действительно не складывается впечатление, что этот ответ касается вопроса. glClientActiveTexture на самом деле не имеет к этому большого отношения, насколько я вижу, и вы не объяснили актуальность вопроса, который вы связали. Указание ему/ей просто использовать очень хорошую... оболочку также не объясняет, почему спрашивающий должен использовать обертку или как она решает вопрос. - person ; 23.07.2011