Как OpenGL API, такой как glColorPointer, знает размер массива, который передается как указатель? - PullRequest
2 голосов
/ 21 февраля 2012

Это определение glColorPointer от opengl.org:

void glColorPointer (размер GLint, тип GLenum, шаг GLsizei, указатель const GLvoid *); параметры

размер Указывает количество компонентов на цвет.Должно быть 3 или 4. Начальное значение 4.

type Указывает тип данных каждого цветового компонента в массиве.Символьные константы GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT и GL_DOUBLE принимаются.Начальное значение: GL_FLOAT.

stepde Указывает смещение в байтах между последовательными цветами.Если шаг равен 0, считается, что цвета плотно упакованы в массиве.Начальное значение - 0.

указатель Указывает указатель на первый компонент первого цветового элемента в массиве.Начальное значение равно 0.

Проще говоря, мы можем сказать, что параметры size и type определяют количество байтов одной цветовой единицы, а stride определяет смещение в байтах между последовательными единицами цвета.

Но как эта функция знает общее количество единиц ?Как мы все знаем, если массив передается как указатель на функцию, невозможно получить размер массива, используя sizeof () внутри функции.Так как же glColorPointer узнает размер массива, когда параметр указателя является только указателем GLvoid *?

Ответы [ 4 ]

8 голосов
/ 21 февраля 2012

Поскольку функция сама по себе не имеет доступа к массиву. Он просто сохраняет данные параметры во внутреннем автомате OpenGL. Доступ к данным в массиве возможен только при вызове glDrawArrays или glDrawElements. Только тогда цвет каждой нарисованной вершины читается из местоположения, которое вы задаете в glColorPointer.

glDrawArrays, с другой стороны, содержит count параметр, который определяет количество вершин. Излишне говорить, что в вашем цветовом массиве должно быть достаточно данных для каждой нарисованной вершины.

То же самое относится к любой другой функции gl * Pointer, такой как glNormalPointer или glTexCoordPointer

3 голосов
/ 21 февраля 2012

Он знает, потому что вы указываете количество индексов, которые будут использоваться в функции glDraw *.

1 голос
/ 22 февраля 2012

Это не нужно. Для следующего вызова glDrawElement (или связанного с ним) он понадобится, и тогда он будет иметь размер.

Это также может привести к появлению приятных ошибок, которые, по-видимому, происходят из-за вызова отрисовки, в тот момент, когда нарушающий кусок кода был выполнен в далеком и сером прошлом, где отладчик не может смотреть.

1 голос
/ 21 февраля 2012

С той же страницы:

glColorPointer указывает местоположение и формат данных массива компоненты цвета, используемые при рендеринге . размер указывает количество Компоненты для цвета, и должно быть 3 или 4. Тип указывает тип данных каждого цветового компонента, и шаг определяет байт шаг от одного цвет к следующему, позволяя упаковывать вершины и атрибуты в один массив или хранится в отдельных массивах. (Хранение в одном массиве может быть более эффективным в некоторых реализациях; см. glInterleavedArrays.)

Если буферный объект с ненулевым именем связан с GL_ARRAY_BUFFER цель (см. glBindBuffer), в то время как цветовой массив указан, указатель рассматривается как смещение байта в хранилище данных объекта буфера. Также, привязка объекта буфера (GL_ARRAY_BUFFER_BINDING) сохраняется как цвет Клиентское состояние массива вершин (GL_COLOR_ARRAY_BUFFER_BINDING).

...

glColorPointer доступен, только если версия GL - 1.1 или выше.

Мое предположение состоит в том, что pointer описывает область памяти для последующих функций openGL, используемых для цветов, и когда эти функции ссылаются на эти цвета по индексу, они будут использовать память (если есть) на который указывает функция. Это означает, что поскольку вы управляете как памятью, так и независимостью, они просто говорят, что любой выход за пределы допустимого диапазона - ваша ошибка, и поэтому ему не нужно знать длину буфера. Это не волнует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...