2012-02-21 2 views
2

Это Defination из glColorPointer от OpenGL.org:Как API OpenGL, такой как glColorPointer, знает размер массива, который передавался как указатель?

аннулируются glColorPointer (размер GLint, тип GLenum, GLsizei шаг, Const GLvoid * указатель); Параметры

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

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

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

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

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

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

+1

Короче говоря, он не знает ... вполне возможно свернуть приложение, вычеркнув ненужные индексы (или нет, если вам не повезло). Тем не менее, он знает, если объект буфера связан. В этом случае размер элемента буфера, зарезервированного 'glBufferData', является максимально допустимым размером (опять же, вполне возможно рисовать индексы вне этого диапазона, что может привести к сбою вашего приложения). – Damon

+0

@BrendanLong: Почему вы спекулируете? OpenGL хорошо указан, а функции gl * Pointer не разыгрывают указатель. – datenwolf

ответ

1

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

glColorPointer определяет местоположение и данные формата массив цветовых компонентов для использования при визуализации. size указывает количество компонентов на цвет и должно быть 3 или 4. type указывает тип данных каждого цветового компонента, а stride указывает шаг байта от одного цвета к другому, позволяя упаковывать вершины и атрибуты в один массив или хранится в отдельных массивах. (Single-массив хранения данных может быть более эффективным в некоторых реализациях, см. GlInterleavedArrays)

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

...

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

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

8

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

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

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

3

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

1

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

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

+1

Вот почему мы изобрели C++! –

Смежные вопросы