【问题标题】:Rendering in opengl 3.1+ without VBO using client side vertex array使用客户端顶点数组在没有 VBO 的 opengl 3.1+ 中渲染
【发布时间】: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() 这样的调用,它允许您为顶点属性指定“常量”值,即所有顶点共享相同值的属性。

标签: c++ opengl opengl-es


【解决方案1】:

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 中一样。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      相关资源
      最近更新 更多