我可以使用矢量(OpenGL)构建网格吗?

时间:2015-10-25 18:20:06

标签: c++ opengl mesh vertex

我试图通过传递带有向量的信息来构建我的网格。我认为它必须是一样的。但它没有用。 此向量中的实际信息必须正确,所以我确实很确定问题是构建实际的bufferData。

是否有人暗示那里出了什么问题?或者我怎么可能以更好的方式做到这一点?

void MeshBuilder::buildMesh(std::vector<Vertex> vert, std::vector<int> index){
Vertex vertex;
//Vertex Array Object: Binds Buffer Obj
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

std::vector<GLfloat> verticies;
for (int i = 0; i < vert.size(); i++) {
    verticies.push_back(vert[i].getPosition().x);
    verticies.push_back(vert[i].getPosition().y);
    verticies.push_back(vert[i].getPosition().z);
    verticies.push_back(vert[i].getNormals().x);
    verticies.push_back(vert[i].getNormals().y);
    verticies.push_back(vert[i].getNormals().z);
    verticies.push_back(vert[i].getTexture().x);
    verticies.push_back(vert[i].getTexture().y);
}

std::vector<int> indicies;
for (int i = 0 ; i < index.size(); i++) {
    indicies.push_back(i);
}

//Vertex Buffer Object
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, verticies.size()*sizeof(GLfloat), &verticies, GL_STATIC_DRAW);
//Attributes
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex.SIZE*4, (GLvoid*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex.SIZE*4, (GLvoid*)12);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, vertex.SIZE*4, (GLvoid*)24);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);

glBindVertexArray(0);

//Element Buffer Object
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size()*sizeof(int), &indicies, GL_STATIC_DRAW);

std::cout << "Mesh buildet..." << std::endl;
}

1 个答案:

答案 0 :(得分:1)

在您的方法声明&amp;定义尝试将其从void MeshBuilder::buildMesh(std::vector<Vertex> vert, std::vector<int> index);更改为void MeshBuilder::buildMesh(std::vector<Vertex>& vert, std::vector<int>& index)以通过引用传递而不是复制;这将有助于加快速度。

我能看到的唯一可能导致问题的是你在定义索引之前停止顶点数组。在这三行代码之后,尝试移动glBindVertexArray(0);之前的//Element Buffer Object代码。看看这是否有所作为。

另外,请确保在此功能结束之前或调用此功能之后执行以下操作:

  • 禁用属性指针
  • 下面的下两个必须在顶点数组缓冲区未绑定之后:
    • 停止缓冲区索引 - glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
    • 停止缓冲区 - glBindBuffer( GL_ARRAY_BUFFER, 0 );