像glColorPointer这样的OpenGL API如何知道作为指针传递的数组的大小
How does OpenGL API like glColorPointer know the size of array that passed as a pointer?
这是来自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。
简单地说,我们可以说size和type参数指定一个颜色单位的字节数,step指定连续颜色单位之间的字节偏移。
但是,这个函数如何知道单位总数?众所周知,如果将数组作为指向函数的指针传递,则不可能在函数内部使用sizeof()来获取数组的大小。那么,当指针参数仅为GLvoid*指针时,glColorPointer如何知道数组的大小呢?
因为函数本身不访问数组。它只是将给定的参数保存在OpenGL内部状态机中。只有在调用glDrawArrays
或glDrawElements
时才能访问数组中的数据。只有这样,才能从glColorPointer
中指定的位置读取每个绘制顶点的颜色。
另一方面,glDrawArrays
确实包含指定顶点数量的count参数。不用说,颜色数组中必须有足够的数据来提供绘制的每个顶点。
这同样适用于任何其他gl*指针函数,如glNormalPointer
或glTexCoordPointer
它知道,因为您指定了要在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调用,而此时有问题的代码段是在调试器无法查看的遥远而灰暗的过去执行的。
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空