Текстурирование объектов Вершинного Буфера
-
22-08-2019 - |
Вопрос
То, что я хочу сделать, это нарисовать (большой) ландшафт с помощью OpenGL.Итак, у меня есть набор вершин, скажем, 256 x 256, которые я сохраняю в объекте vertex buffer в видеопамяти.Я правильно триангулировал их, так что у меня есть индексный буфер для граней.
// vertexes
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBufferId);
glVertexPointer(3, GL_FLOAT, 0, 0);
// textures
glBindBufferARB(GL_ARRAY_BUFFER_ARB, texCoordBufferId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
// indexes
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexBufferId);
// draw it
glDrawRangeElements(GL11.TRIANGLES, 0, size - 1, size, GL_UNSIGNED_INT, 0);
Я также загрузил квадратную текстуру, которая должна быть применена к каждому треугольнику.Итак, у меня проблема с текстурными координатами:
Каждая вершина включена в 4 треугольника, что означает, что для нее требуется 4 текстурных координаты.Но glDrawRangeElements() требует столько же текстурных координат, сколько и вершин.
Так что я не вижу способа, как это сделать с VBO.Может быть, есть лучшая концепция для решения моей проблемы, или мне просто не хватает хорошей идеи.
Заранее благодарю.
Решение
Если ваша текстура должна повторяться (или зеркально отражать) саму себя в каждом квадрате, лучшим способом было бы использовать координаты текстуры, которые соответствуют номеру позиции (x, y) в вашем массиве.Например.для первой строки вершин используйте эти текстурные координаты:(0.0, 0.0), (1.0, 0.0), (2.0, 0.0)...(255.0, 0.0).
Другие советы
Поскольку вы, вероятно, хотите, чтобы ваша текстура была бесшовно выложена плиткой, все, что вам нужно, это вычислить правильную координату текстуры для каждой вершины и передать их точно так же, как вершины.