0

我正在学习 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 是一维数组,但是我将所有顶点数据存储到一个二维数组中,第一维用于存储多个多边形(在本例中为 QUADS),第二维用于存储所有 12四边形的顶点。

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

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

4

2 回答 2

4

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

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 。

于 2012-11-29T05:26:09.853 回答
0

您可以只传递二维数组的 1 行并给出两个索引之一,然后它将仅引用特定的多边形数据。

您可以在https://stackoverflow.com/a/13427008/1520364看到类似的用法

于 2012-11-29T05:23:54.350 回答