使用客户端顶点数组,在OpenGL 3.1+中进行渲染而无需使用VBO

4
我想知道在OpenGL 3.1+核心配置文件中是否可以使用顶点数组(客户端渲染而非立即模式)绘制,而不使用VBO。我知道在OpenGL 3.1+核心配置文件中使用VAO是必要的。我想知道是否可以通过使用顶点数组(客户端顶点数组而非立即模式)而不使用VBO进行绘制。
PS:我说的是客户端顶点数组而非立即模式。我想知道是否可以创建一个不带VBO的VAO。
我在OpenGL规范的某个地方读到了这个:立即模式顶点属性规范,客户端顶点数组已被弃用。顶点属性必须存储在一个或多个缓冲区对象中,或者使用glVertexAttrib*()明确指定。自OpenGL 3.2以来,使用顶点数组对象是强制性的。那么这是否意味着我可以像这样使用glVertexAttribPointer指定顶点数组数据?
glBindVertexArray(m_vaoHandle);

glEnableVertexAttribArray(m_attributes[POSITION_HANDLE]);
glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 0,vertexArray);

glEnableVertexAttribArray(m_attributes[TEXCOORDINATE_HANDLE]);
glVertexAttribPointer(m_attributes[TEXCOORDINATE_HANDLE], 2, GL_FLOAT, false, 0, textureArray);

glBindVertexArray(0);

这里的vertexArray和textureArray是CPU上的两个数组,而不是VBO。在绘制它们时

glUseProgram(m_Program);

// Explicitly unbind buffer so attrib pointer knows to slurp in array.
glBindBuffer(GL_ARRAY_BUFFER, 0);

//bind vertex array object
glBindVertexArray(m_vaoHandle);

glDrawArrays(mode, 0, numVertices);

glBindVertexArray(0);

如果在OpenGL 3.1+中可能的话,我也想知道在OpenGLES 3.0中是否可能。

1
不。阅读文档。特别是关于最后一个参数的部分。 - Ivan Aksamentov - Drop
1
它的意思就是你从规范中引用的话是准确的。没有客户端顶点数组。glVertexAttrib*()指的是像glVertexAttrib4fv()这样的调用,它允许您为顶点属性指定“常量”值,即所有顶点共享相同值的属性。 - Reto Koradi
2个回答

4

OpenGL 3.2+ 的核心配置文件已经取消了使用客户端顶点数组的功能。

OpenGL ES 2.0 允许使用客户端顶点数组,所有更高版本的 ES 也是如此。然而,当使用客户端数组时,顶点着色器输入变量 gl_VertexID(在 GLSL ES 3.00 中添加)是未定义的。哦,对于 ES 3.0 中的客户端顶点数组,在附录 F.1:遗留特性中有提到。关于它们,上面写道:

以下特性存在是为了与 OpenGL ES 2.0 向后兼容,但不建议使用这些特性,因为这些特性很可能会在将来的版本中被删除。

虽然我不认为它们会消失,但显然你被建议不要使用它们。

至于VAO是否可以与客户端指针一起使用,答案是肯定的(当然前提是支持客户端指针)。无论数组来自何处,VAO始终存储顶点数组状态。使用客户端指针调用 glVertexAttribPointer 将把指针存储在当前 VAO 中,就像它将缓冲区对象 + 偏移量存储在 VAO 中一样。


0
作为接受答案的附录,您可以使用UBO/SSBO“有点”模拟客户端数组。另一方面,通过隐藏的VBO和glBufferData实现自己的“客户端指针”实现也不应该太难。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接