将二维数组传递给只采用一维数组的函数(C ++)

时间:2012-11-29 05:15:01

标签: c++ opengl codeblocks

我正在学习OpenGL中的顶点数组对象。使用mingw gcc作为我的编译器运行代码块。我使用这个来加载文本文件中的数据(只是一堆四边形用作墙)

void setup_world()                                                          // Sets up the world using the world.txt file
{
    float x, y, z, u, v;
    FILE *filein;
    char oneline[255];
    filein = fopen("Data/world.txt", "rt");
    readstr(filein, oneline);
    sscanf(oneline, "NUMPOLLIES %d\n", &numpolygons);
    int cols = 13;
    int rows = numpolygons+1;
    polygondata = new float*[rows];
    for(int i = 0; i < rows; i++)
        polygondata[i] = new float[cols];
    polygondata[0][0] = 69.01;
    for (int loop = 0; loop < numpolygons; loop++)
    {
        readstr(filein, oneline);
        sscanf(oneline, "%f %f %f %f %f %f", &x, &y, &z, &u, &v);
        polygondata[loop][0] = x;
        polygondata[loop][1] = y;
        polygondata[loop][2] = z;
        readstr(filein, oneline);
        sscanf(oneline, "%f %f %f %f %f %f", &x, &y, &z, &u, &v);
        polygondata[loop][3] = x;
        polygondata[loop][4] = y;
        polygondata[loop][5] = z;
        readstr(filein, oneline);
        sscanf(oneline, "%f %f %f %f %f %f", &x, &y, &z, &u, &v);
        polygondata[loop][6] = x;
        polygondata[loop][7] = y;
        polygondata[loop][8] = z;
        readstr(filein, oneline);
        sscanf(oneline, "%f %f %f %f %f %f", &x, &y, &z, &u, &v);
        polygondata[loop][9] = x;
        polygondata[loop][10] = y;
        polygondata[loop][11] = z;
    }
    fclose(filein);
    return;
}

我知道这有点多余,但它会一直存在,直到我开始重写将所有数据存储到数组中的部分。
通常,使用

将数据传递给OpenGL以获取顶点数组对象
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

OpenGL通常会采用与此类似的数组,生成四元组

float g_vertex_buffer_data[] =
{
    -1.0, -1.0,-5.0,
    1.0, -1.0, -5.0,
    1.0,  1.0, -5.0,
    -1.0,  1.0, -5.0,
};

该函数期望g_vertex_buffer_data是一维的arrary,但是我将所有顶点数据存储到二维数组中,第一个维度用于存储多个多边形(在本例中为QUADS),第二个维度用于存储四边形的所有12个顶点。

什么是最好的方法来解决这个问题?

我提出的一个提出的解决方案是创建另一个数组(然而,单个维度),它将临时存储来自一个多边形的顶点数据。在我将这个单维数组传递给glBufferData函数之后(因为glBufferData接收单维数组没有问题)。我会为每个有效遍历整个二维数组的多边形重复此操作,并通过多边形将函数数据传递给glBufferData多边形。我知道我必须将每个多边形放在一个单独的顶点缓冲区中,无需提醒我。我只需要知道是否可以通过我的二维数组的一部分!
是否有更简单,更有效的方法来做这件事。

2 个答案:

答案 0 :(得分:3)

这是一个更好的想法,不涉及......你做了什么。

std::vector<GLfloat> polygondata;
polygondata.reserve(numpolygons * 4 * 3);
for (int loop = 0; loop < numpolygons * 4 * 3; loop++)
{
    readstr(filein, oneline);
    sscanf(oneline, "%f %f %f %f %f %f", &x, &y, &z, &u, &v);
    polygondata.push_back(x);
    polygondata.push_back(y);
    polygondata.push_back(z);
}

不仅删除了无意义的内存分配,您现在将数据放在一维数组中,您可以以一维方式索引。如果要访问多边形Y的顶点X,可以使用Y * numpolygons + X作为索引。您可以使用简单的glBufferData(..., sizeof(GLfloat) * polygondata.size(), &polygondata[0], ...)命令将数据上传到OpenGL。

答案 1 :(得分:0)

您可以通过给出两个索引中的一个来传递您的2D数组的一行,然后它将仅引用该特定多边形数据。

您可以在https://stackoverflow.com/a/13427008/1520364

看到类似用法