gpt4 book ai didi

c++ - 为什么我不需要在调用 glDrawArrays 之前绑定(bind)我的顶点缓冲对象?

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:04 25 4
gpt4 key购买 nike

我有点困惑为什么这仍然呈现。我认为您需要绑定(bind)一个顶点缓冲区对象,以便 glDrawArrays 知道要使用哪个顶点缓冲区。

这是我的初始化代码..

// Create and bind vertex array to store vertex attribute states.

glGenVertexArraysOES(NUM_VERTEX_ARRAYS, &m_vertexArray);
glBindVertexArrayOES(m_vertexArray);

// Create and bind vertex buffer to store vertex data.

glGenBuffers(NUM_VERTEX_BUFFERS, &m_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 36, &m_vertices[0], GL_STATIC_DRAW);

glEnableVertexAttribArray(VertexAttribPosition);
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(VertexAttribNormal);
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArrayOES(0);

这是我的渲染代码。我很困惑为什么当我将 0 绑定(bind)到 GL_ARRAY_BUFFER 时 glDrawArrays 仍然有效。

glBindVertexArrayOES(m_vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glDrawArrays(GL_TRIANGLES, 0, 36);

glBindVertexArrayOES(0);

最佳答案

I thought you need to bind a vertex buffer object so that glDrawArrays knows which vertex buffer to use.

glDraw… 被调用时,它使用最近调用 gl…Pointer(或等效)调用并由 glEnableVertexAttribArray 激活的数据。当你做的时候

glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

(事件)顶点属性和缓冲区对象之间的关联已形成。或者换句话说:glBindBuffer 仅与调用 glBuffer... gl...Pointer 调用相关. 因此,您可以在调用 gl…Pointer 函数后安全地绑定(bind)不同的缓冲区对象。事实上,以下方法也有效:

glBindBuffer(GL_ARRAY_BUFFER, m_vertexPositionBuffer);    
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

glBindBuffer(GL_ARRAY_BUFFER, m_vertexNormalBuffer);
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

即,不同的缓冲区对象用于每个顶点属性数组。

更新

顶点数组对象为此添加了一些糖衣,通过使对象中的绑定(bind)→指针/偏移关联成为可能,对象本身可以被绑定(bind)。因此,切换到新的(一组)缓冲区对象变得更少了。

关于c++ - 为什么我不需要在调用 glDrawArrays 之前绑定(bind)我的顶点缓冲对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19858487/

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