Если у меня есть сетка (например, куб с 6 гранями, каждая из которых состоит из 4 вершин, всего 24 вершины), и я хочу применить к каждой грани разные текстуры, как мне это сделать? В настоящее время я рисую сразу всю сетку (все 6 граней куба) с помощью glDrawElements(), передавая все индексы в один буфер. Я не вижу способа применить текстуру к подмножеству индексов при рисовании. Придется ли мне разделять индексы, рисовать каждую грань одну за другой, перепривязывать текстуры между каждой гранью, или есть более красноречивое решение?
Привязка нескольких текстур к одному мешу в OpenGL ES 1.1
Ответы (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
или что-то в этом роде, я не полностью уверен, как вы это сделаете, но полагаю, что вы, вероятно, могли бы нарежьте его по мере необходимости и получите необходимые буферы для каждого лица с различной текстурой. В любом случае, процесс остается примерно таким же: разделите сетку и для каждой грани привяжите текстуру и отрисуйте только те индексы, которые соответствуют этой грани.
Вы должны использовать несколько текстурных блоков. Ознакомьтесь с документацией по функции glClientActiveTexture()
в спецификации. Также см. этот вопрос.
ОБНОВЛЕНИЕ: вы также можете рассмотреть возможность использования libgdx, очень хорошей оболочки OpenGL ES (и не только) .
glClientActiveTexture
на самом деле не имеет к этому большого отношения, насколько я вижу, и вы не объяснили актуальность вопроса, который вы связали. Указание ему/ей просто использовать очень хорошую... оболочку также не объясняет, почему спрашивающий должен использовать обертку или как она решает вопрос.
- person ; 23.07.2011