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

时间:2012-02-21 18:04:30

标签: c++ c opengl opengl-es

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

  

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。

     

stride 指定连续颜色之间的字节偏移量。如果迈步   为0时,颜色被理解为紧密排列在阵列中。该   初始值为0。

     

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

简单来说,我们可以说大小类型参数指定一个颜色单位的字节数, stride 指定字节连续颜色单位之间的偏移。

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

4 个答案:

答案 0 :(得分:8)

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

另一方面,

glDrawArrays包含 count 参数,该参数指定顶点数。毋庸置疑,您的颜色数组中必须有足够的数据来提供每个绘制的顶点。

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

答案 1 :(得分:3)

它知道因为你指定了glDraw *函数中使用的索引数。

答案 2 :(得分:1)

从同一页面开始:

  

glColorPointer指定数组的位置和数据格式   渲染时使用的颜色组件。 size指定的数量   每种颜色的组件,必须是3或4. type指定数据类型   每个颜色分量,stride指定一个字节步长   颜色到下一个,允许打包顶点和属性   单个数组或存储在单独的数组中。 (单阵列存储可能   在一些实现上更有效率;请参阅glInterleavedArrays。)

     

如果将非零命名缓冲区对象绑定到GL_ARRAY_BUFFER   指定颜色数组时指向(参见glBindBuffer),指针是   被视为缓冲对象数据存储中的字节偏移量。也,   缓冲区对象绑定(GL_ARRAY_BUFFER_BINDING)保存为颜色   顶点数组客户端状态(GL_COLOR_ARRAY_BUFFER_BINDING)。

     

...

     

仅当GL版本为1.1或更高版本时,glColorPointer才可用。

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

答案 3 :(得分:1)

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

这也可能导致很好的错误,这些错误似乎来自一个绘制调用,此时有一段代码是在远远灰色的过去执行的,此时调试器无法查看。