OpenGL ES 2.0 и объекты буфера вершин (VBO) - PullRequest
8 голосов
/ 28 июля 2011

Я не могу понять, как использовать объект буфера вершин для моей местности в opengl es 2.0 для iphone.Это статические данные, поэтому я надеюсь на повышение скорости с помощью VBO.В обычном OpenGL я использую списки отображения вместе с шейдерами без проблем.Тем не менее, в OpenGLES 2.0 я должен отправить данные вершин в шейдер в качестве атрибута и не знаю, как это работает с VBO.Как буфер вершин может знать, с каким атрибутом он связывает данные вершин при вызове?Это возможно даже в OpenGLES ES 2.0?Если нет, есть ли другие способы оптимизировать визуализацию статического рельефа местности?

1 Ответ

12 голосов
/ 29 июля 2011

Конечно, на самом деле это довольно просто, у вашего атрибута есть местоположение, а данные о вершинах снабжаются glVertexAttribPointer для простых массивов вершин, например:

float *vertices = ...;
int loc = glGetAttribLocation(program, "position");
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, vertices);

Для VBO это то же самое, но вы должны привязать буфер к цели GL_ARRAY_BUFFER, и последний параметр glVertexAttribPointer теперь является смещением в памяти буферной памяти. Само значение указателя интерпретируется как смещение:

glBindBuffer(GL_ARRAY_BUFFER, buffer);
int loc = glGetAttribLocation(program, "position");
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0);

В этом случае смещение равно 0, при условии, что данные вершины загружены в начале буфера. Смещение измеряется в байтах.

Затем рисование выполняется с помощью glDrawArrays / glDrawElements. Надеюсь, это поможет!

...