gpt4 book ai didi

c++ - 使用客户端顶点数组在没有 VBO 的情况下在 opengl 3.1+ 中呈现

转载 作者:太空狗 更新时间:2023-10-29 21:15:40 25 4
gpt4 key购买 nike

我想知道是否可以在不使用 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 中的客户端顶点数组。关于他们,它说:

The following features are present to maintain backward compatibility with OpenGL ES 2.0, but their use in not recommended as it is likely for these features to be removed in a future version.

虽然我不希望它们永远消失,但显然建议您不要使用它们。

至于 VAO 是否完全可以使用客户端指针的问题,是的(当然,当完全支持客户端指针时)。 VAO 始终存储顶点数组状态,无论这些数组来自何处。使用客户端指针调用 glVertexAttribPointer 会将指针存储在当前 VAO 中,就像将缓冲区对象+偏移量存储在 VAO 中一样。

关于c++ - 使用客户端顶点数组在没有 VBO 的情况下在 opengl 3.1+ 中呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37178601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com