Что означает шаг в OpenGL | ES

Я просматривал сигнатуру метода glVertexPointer, который

void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)

Может ли кто-нибудь помочь мне понять, что делает третий аргумент stride.

Я получил это определение для stride после того, как погуглил об этом.

Amount of bytes from the beginning of one element to the beginning of the following element. If you pass a zero as stride, it means they are tightly packed. If you have an array of floats, which contains vertices like this, x1,y1,z1,x2,y2,z2... and so on, you can set stride to either zero (as tightly packed), or 12 (3 floats*4 bytes each from the beginning of vertex one to the beginning of vertex two).

Я не могу понять, что это значит? было бы очень полезно, если бы кто-нибудь объяснил это с помощью примера.

Спасибо.


person Mayank    schedule 10.03.2014    source источник


Ответы (1)


Простой случай, когда ваш массив содержит только данные координат вершины. Скажем, у нас всего две координаты, следовательно, 6 чисел с плавающей запятой:

{x1,y1,z1, x2,y2,y2}

Указатель (4-й параметр) указывает на начало первой вершины в массиве (т.е. ноль, указывающий на x1). Шаг должен быть равен 12, а это означает, что для перехода от одной вершины к другой OpenGL необходимо пройти 12 байт (поскольку каждая из 3 координат в каждой вершине занимает 4 байта). Итак, переместившись на 12 байт, мы попадаем туда, где находится x2, начало второй вершины.

Это пример плотной упаковки, так как массив содержит только один тип данных — вы можете установить шаг равным нулю, и OpenGL с радостью пройдёт через массив по одному поплавку за раз. Однако массив не обязательно должен содержать только данные координат — вы также можете хранить данные нормалей и цветов вместе с координатами в массиве:

{x1,y1,z1,nx1,ny1,nz1,r1,g1,b1,a1, x2,y2,z2,nx2,ny2,nz2,r2,g2,b2,a2}

Это больше не плотно упаковано - данные координат больше не являются непрерывными в массиве (они разделены нормальными значениями и значениями цвета). В этом случае шаг будет равен 40. Чтобы перейти от начала одной вершины к другой, OpenGL необходимо пройти 40 байтов: (3 числа с плавающей запятой данных координат + 3 числа с плавающей запятой данных нормалей + 4 числа с плавающей запятой данных цвета) x 4 байта на поплавок.

person NigelK    schedule 10.03.2014