【发布时间】:2016-09-07 19:07:53
【问题描述】:
我想知道是否可以在不使用 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 中是否可行
【问题讨论】:
-
没有。阅读the docs。具体来说,关于最后一个参数。
-
这意味着您从规范中引用的内容。没有客户端顶点数组。
glVertexAttrib*()指的是像glVertexAttrib4fv()这样的调用,它允许您为顶点属性指定“常量”值,即所有顶点共享相同值的属性。