gpt4 book ai didi

c++ - 为 OpenGL 的顶点缓冲区对象动态打包数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:00 24 4
gpt4 key购买 nike

我正在尝试为 OOP 中的 VBO 编写一个包装器,它由 addVertex、addNormal.. addX、flush() 和 render() 函数组成。起初,我将顶点、法线、索引保存在单独的 vector 中,例如:

std::vector<glm::vec4> vertexBuffer;
std::vector<glm::vec4> colorBuffer;
std::vector<glm::vec3> normalBuffer;
std::vector<glm::vec2> texCoordBuffer;
std::vector<unsigned int> indexBuffer;

但正如我在某处读到的那样,为每个 VBO ID 保留不同的 VBO ID 是完全低效的,因此最好按 VertexNormalTexCoordColor - VNTC - VNTC... 的顺序打包它们,并在单个 VBO ID 中表示它们。因此,当上传到 GPU 时,可以有效地使用缓冲区。所以这次我仍然将它们保存在 vector 中,但是当我调用 flush() 时,我想用结构打包它们,然后将该结构 vector 上传到 GPU:

struct VBOData {
glm::vec4 vert;
glm::vec3 normal;
glm::vec4 color;
glm::vec2 texcoord;
};
std::vector<VBOData> vboBuffer;

然后我在 flush() 中上传所有内容:

vboBuffer.reserve(vertexBuffer.size());

for (int i = 0; i < vertexBuffer.size(); ++i) {
VBOData data;
data.vert = vertexBuffer[i];
data.color = colorBuffer[i];
data.normal = normalBuffer[i];
data.texcoord = texCoordBuffer[i];
vboBuffer.push_back(data);
}

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vboBuffer.size() * sizeof(VBOData), (GLchar*) &vboBuffer[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

现在有这个问题,如果我的对象不包含颜色、法线或tex坐标,而只包含顶点怎么办?或者只关于顶点和法线?或者总是有顶点的不同数据组合?我可以按 V(N)(T)(C) 顺序动态打包它们以提高效率吗?

最佳答案

Now there is this problem, what if my object doesn't contain colors, normals, or tex coords and only consists of vertices ? Or only about vertices and normals ?

然后您将设置偏移量到您使用 glVertexAttribPointer 获得的组件,并且不是您未使用的组件集。

顺便说一句,你有一个关于 opengl.org 的很好的教程关于 IBO。

关于c++ - 为 OpenGL 的顶点缓冲区对象动态打包数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19396193/

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