我想知道是否可以在不使用VBO的情况下使用顶点数组(客户端渲染而非立即模式)绘制opengl 3.1+核心配置文件。我知道在opengl 3.1+核心配置文件中使用VAO是必不可少的。我想知道是否可以通过使用顶点数组(客户端侧顶点数组不是立即模式)而不使用VBO进行绘制。
PS我说的是客户端顶点数组而不是立即模式。我想知道我是否可以在没有VBO的情况下创建VAO
我在opengl spec 立即模式顶点属性规范中读到了这个,客户端顶点数组被描述。顶点属性必须存储在一个或多个缓冲区对象中,或使用glVertexAttrib *()显式指定。由于OpenGL 3.2使用顶点数组对象是强制性的。 这意味着我可以使用像这样的glVertexAttriPointer指定顶点数组数据
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中
答案 0 :(得分:3)
OpenGL 3.2+的核心配置文件删除了使用客户端顶点数组的能力。
OpenGL ES 2.0允许使用客户端顶点数组,ES的所有更高版本也是如此。但是,使用客户端数组时,顶点着色器输入变量gl_VertexID
(在GLSL ES 3.00中添加)是 undefined 。哦,ES 3.0中的客户端顶点数组在附录F.1:遗留特性中提到。关于他们,它说:
以下功能可以保持与OpenGL ES 2.0的向后兼容性,但不建议使用它们,因为这些功能可能会在将来的版本中删除。
虽然我不希望它们消失,但显然你被建议不使用它们。
关于VAO是否可以使用客户端指针的问题,是的(当然,当支持客户端指针时)。 VAO总是存储顶点数组状态,无论这些数组来自何处。使用客户端指针调用glVertexAttribPointer
会将指针存储在当前VAO中,就像它将缓冲区对象+偏移存储在VAO内一样。
答案 1 :(得分:0)
作为接受的答案的附录,您可以使用UBO / SSBO来“模拟”客户端阵列。 另一方面,通过隐藏的VBO和glBufferData来实现自己的“客户端指针”实现应该不太困难。