问题
我想将几个立方体的位置,法线和颜色存储到一个结构中,并将它们应该绘制的索引存储在一个向量中。但是我的方法在 malloc.c
中触发了错误我在做什么
我从文件中加载立方体的位置以及立方体的颜色:
vector<vec3> cp; // size 51
vector<vec3> cc; // size 51
readLevelFile("levelfile.txt", cp, cc);
我使用对象加载器加载多维数据集的数据:
vector<vec3> vertexPositions; // size 24
vector<int> indices; // size 36
vector<int> outIndices; // empty
vector<vec3> normals; // size 24
vector<vec2> uvs; // unused
loadObject("cube_with_normals.obj", vertexPositions, indices, normals, uvs, 10.0f);
然后我创建一个新结构并创建一个实例:
struct Vertex {
vec3 position;
vec3 normal;
vec3 color;
vec2 texture;
};
Vertex *cubeData = new Vertex;
然后迭代多维数据集位置:
for (int j = 0; j < cp.size()*vertexPositions.size(); j+=vertexPositions.size()) {
for (int i = 0; i < vertexPositions.size(); i++)
{
cubeData[j+i].position = vertexPositions[i]+cc[j/vertexPositions.size()];
cubeData[j+i].normal = normals[i];
cubeData[j+i].color = cc[j/vertexPositions.size()];
}
for (int i=0; i < indices.size();i++)
{
outIndices.push_back(indices[i]+indices.size()*(j/vertexPositions.size()));
}
}
但是会在malloc.c中触发断点
修改 最终我希望数据看起来像这样:
Vertex groundData[] = {
{ vec3(-1000.0,ypos,1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(0.0f, 0.0f) },
{ vec3(-1000.0,ypos,-1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(0.0f, 1.0f) },
{ vec3(1000.0,ypos,-1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(1.0f, 1.0f) },
{ vec3(1000.0,ypos,1000.0), vec3(0.0f, 1.0f, 0.0f), color, vec2(1.0f, 0.0f) }
};
这简化了将数据存储在缓冲区中的过程
答案 0 :(得分:1)
Vertex *cubeData = new Vertex;
仅分配一个Vertex
。如果您不想分配数组,则必须使用new[]
运算符:
Vertex *cubeData = new Vertex[cp.size()*vertexPositions.size()*vertexPositions.size()];
但是,如果您知道如何使用std::vector
自动管理其大小和内存,为什么要动态分配这些数据呢?
std::vector<Vertex> cubeData;
for (int j = 0; j < cp.size()*vertexPositions.size(); j+=vertexPositions.size()) {
for (int i = 0; i < vertexPositions.size(); i++)
{
cubeData.emplace_back();
cubeData[j+i] vertexPositions[i]+cc[j/vertexPositions.size()];
cubeData[j+i].normal = normals[i];
cubeData[j+i].color = cc[j/vertexPositions.size()];
}
for (int i=0; i < indices.size();i++)
{
outIndices.push_back(indices[i]+indices.size()*(j/vertexPositions.size()));
}
}
如果你的函数需要数组而不是向量,那么没有问题,std::vector
有一个成员函数data()
,它返回一个指向底层数组的指针:
void f(Vertex* array_of_vertex);
int main()
{
std::vector<Vertex> cubeData;
//....
f( cubeData.data() ); //Tah dah!
}
答案 1 :(得分:0)
可能是因为您只为Vertex
分配了一个 cubeData
对象。你的循环中有大量的内存覆盖。