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