我想知道在OpenGL 3.1+核心配置文件中是否可以使用顶点数组(客户端渲染而非立即模式)绘制,而不使用VBO。我知道在OpenGL 3.1+核心配置文件中使用VAO是必要的。我想知道是否可以通过使用顶点数组(客户端顶点数组而非立即模式)而不使用VBO进行绘制。
PS:我说的是客户端顶点数组而非立即模式。我想知道是否可以创建一个不带VBO的VAO。
我在OpenGL规范的某个地方读到了这个:立即模式顶点属性规范,客户端顶点数组已被弃用。顶点属性必须存储在一个或多个缓冲区对象中,或者使用glVertexAttrib*()明确指定。自OpenGL 3.2以来,使用顶点数组对象是强制性的。那么这是否意味着我可以像这样使用glVertexAttribPointer指定顶点数组数据?
如果在OpenGL 3.1+中可能的话,我也想知道在OpenGLES 3.0中是否可能。
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中是否可能。
glVertexAttrib*()
指的是像glVertexAttrib4fv()
这样的调用,它允许您为顶点属性指定“常量”值,即所有顶点共享相同值的属性。 - Reto Koradi