这是来自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如何知道数组的大小?
答案 0 :(得分:8)
因为函数本身不访问数组。它只是将给定的参数保存在OpenGL内部状态机中。只有在您致电glDrawArrays
或glDrawElements
时才能访问数组中的数据。只有这样,每个绘制顶点的颜色才会从glColorPointer
中提供的位置读取。
glDrawArrays
包含 count 参数,该参数指定顶点数。毋庸置疑,您的颜色数组中必须有足够的数据来提供每个绘制的顶点。
同样适用于任何其他gl *指针函数,如glNormalPointer
或glTexCoordPointer
答案 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(或相关)调用将需要它,然后将具有该大小。
这也可能导致很好的错误,这些错误似乎来自一个绘制调用,此时有一段代码是在远远灰色的过去执行的,此时调试器无法查看。