我试图在OOP中为VBO编写一个包装器,它包含addVertex,addNormal .. addX,flush()和render()函数.首先,我在不同的向量中保存顶点,法线,索引,如:
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;
Run Code Online (Sandbox Code Playgroud)
但是当我在某处读到时,为每个人保存不同的VBO ID是完全没有效率的,因此最好按照VertexNormalTexCoordColor - VNTC - VNTC ...的顺序打包它们,并将它们表示在一个VBO ID中.因此,上传到GPU时可以有效地使用缓冲区.所以这次我仍然将它们保存在向量中但是当我调用flush()时我想用结构包装它们,然后将该结构向量上传到GPU:
struct VBOData {
glm::vec4 vert;
glm::vec3 normal;
glm::vec4 color;
glm::vec2 texcoord;
};
std::vector<VBOData> vboBuffer;
Run Code Online (Sandbox Code Playgroud)
然后我上传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);
Run Code Online (Sandbox Code Playgroud)
现在有这个问题,如果我的对象不包含颜色,法线或tex坐标并且只包含顶点怎么办?或者只关于顶点和法线?或者总是有顶点的不同数据组合?为了提高效率,我能否以V(N)(T)(C)顺序动态打包它们?
现在有这个问题,如果我的对象不包含颜色、法线或纹理坐标而只包含顶点怎么办?或者仅关于顶点和法线?
然后,您将设置使用glVertexAttribPointer获得的组件的偏移量,而不是未使用的组件集。
顺便说一句,你在opengl.org上有一个关于 VBO 的很好的教程。
| 归档时间: |
|
| 查看次数: |
1950 次 |
| 最近记录: |