像glColorPointer这样的OpenGL API如何知道作为指针传递的数组的大小

How does OpenGL API like glColorPointer know the size of array that passed as a pointer?

本文关键字:指针 数组 何知道 glColorPointer OpenGL API      更新时间:2023-10-16

这是来自opengl.org的glColorPointer的定义:

void glColorPointer(GLint大小、GLenum类型、GLsizei步长、常量GLvoid*指针)参数

size指定每种颜色的组件数。必须是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。

步幅指定连续颜色之间的字节偏移量。如果跨步如果为0,则颜色被理解为紧密地封装在阵列中。这个初始值为0。

pointer指定指向第一种颜色的第一个组件的指针元素。初始值为0。

简单地说,我们可以说sizetype参数指定一个颜色单位的字节数,step指定连续颜色单位之间的字节偏移。

但是,这个函数如何知道单位总数?众所周知,如果将数组作为指向函数的指针传递,则不可能在函数内部使用sizeof()来获取数组的大小。那么,当指针参数仅为GLvoid*指针时,glColorPointer如何知道数组的大小呢?

因为函数本身不访问数组。它只是将给定的参数保存在OpenGL内部状态机中。只有在调用glDrawArraysglDrawElements时才能访问数组中的数据。只有这样,才能从glColorPointer中指定的位置读取每个绘制顶点的颜色。

另一方面,glDrawArrays确实包含指定顶点数量的count参数。不用说,颜色数组中必须有足够的数据来提供绘制的每个顶点。

这同样适用于任何其他gl*指针函数,如glNormalPointerglTexCoordPointer

它知道,因为您指定了要在glDraw*函数中使用的索引数。

来自同一页面:

glColorPointer指定渲染时要使用的颜色组件。size指定每个颜色的分量,并且必须是3或4。type指定数据类型每个颜色分量的,而步幅指定从一开始的字节步幅颜色到下一个,允许将顶点和属性打包到单个阵列或存储在单独的阵列中。(单阵列存储可能在某些实现上更高效;请参见glInterleavedArrays。)

如果非零命名缓冲区对象绑定到GL_ARRAY_buffertarget(请参见glBindBuffer),当指定了颜色数组时,指针为处理为缓冲区对象的数据存储中的字节偏移量。而且缓冲区对象绑定(GL_ARRAY_buffer_binding)保存为颜色顶点数组客户端状态(GL_COLOR_ARAY_BUFFER_BINDING)。

glColorPointer仅在GL版本为1.1或更高版本时可用

我的推测pointer描述了一个内存区域,供后续的openGL函数用于颜色,当这些函数通过索引引用这些颜色时,它们将使用函数指向的内存(如果有的话)。这意味着,由于您同时控制内存和索引,它们只是说任何越界访问都是您的错,因此不需要知道缓冲区的长度。它不在乎。

它不需要它。下面的glDrawElement(或相关)调用将需要它,然后它将具有的大小。

这也可能导致漂亮的错误,这些错误似乎源于draw调用,而此时有问题的代码段是在调试器无法查看的遥远而灰暗的过去执行的。