Вы путаете индексы и координаты вершин.Координаты - это кортежи типа GL_FLOAT
в GL_ARRAY_BUFFER
.Но индексы представляют собой список интегральных индексов (например, типа GL_SHORT
) в GL_ELEMENT_ARRAY_BUFFER
, которые относятся к координатам вершины.
Квадрат может быть нарисован двумя треугольниками.Вы можете определить 6 координат и атрибутов вершин и использовать glDrawArrays
.
В следующем vertices
имеет тип FloatBuffer
:
vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
vertices.put(x1).put(y2).put(r).put(g).put(b).put(a).put(s1).put(t2);
vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);
vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);
vertices.put(x2).put(y1).put(r).put(g).put(b).put(a).put(s2).put(t1);
numVertices += 6;
vbo.bind(GL_ARRAY_BUFFER);
vbo.uploadSubData(GL_ARRAY_BUFFER, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, numVertices);
Или вы можете определить 4 координаты вершины соответственно атрибутам и 6 индексам и использовать glDrawElements
.
В следующем vertices
все еще имеет тип FloatBuffer
, но indices
являетсятипа ShortBuffer
:
vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
vertices.put(x1).put(y2).put(r).put(g).put(b).put(a).put(s1).put(t2);
vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);
vertices.put(x2).put(y1).put(r).put(g).put(b).put(a).put(s2).put(t1);
numVertices += 4;
indices.put(0).put(1).put(2);
indices.put(0).put(2).put(3);
numIndices += 4;
vbo.bind(GL_ARRAY_BUFFER);
vbo.uploadSubData(GL_ARRAY_BUFFER, 0, vertices);
ibo.bind(GL_ELEMENT_ARRAY_BUFFER);
ibo.uploadSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indices);
glDrawElements(GL_TRIANGLES, GL_SHORT, numIndices, null);
Итак, ключ в том, что вам понадобятся 2 uploadSubData
методы.Первый должен иметь дело с FloatBuffer
, а второй - с ShortBuffer
.
Обратите внимание, что в общем случае атрибуты вершин являются значениями с плавающей запятой.Цвета часто являются значениями с плавающей запятой в диапазоне [0, 1].Координаты текстуры находятся в диапазоне [0, 1].Конечно, это можно закодировать в интегральный тип данных, но, по крайней мере, для координат вершин это может привести к потере точности.