【问题标题】:Passing A Two Dimensional Array Into A Function That Only Takes A One Dimensional Array (C++)将二维数组传递给只接受一维数组的函数 (C++)
【发布时间】:2012-11-29 05:15:01
【问题描述】:

我正在学习 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 多边形。我知道我必须将每个多边形放在单独的顶点缓冲区中,无需提醒我。我只需要知道是否可以传入我的二维数组的一部分!
有没有一种更简单、更有效的方法来做到这一点。

【问题讨论】:

  • 您可以传递二维数组的 1 行并给出其中一个索引
  • 当您实际上不使用任何 C++ 时,我对如何标记此 C++ 感到困惑。除了可能在任何地方定义变量的能力,但即使那是合法的 C99。而且我不是在谈论您选择的文件 IO API。
  • glBufferData(GL_ARRAY_BUFFER,sizeof (polygondata[0]), polygondata[0] , GL_STATIC_DRAW);
  • @Gishump 是的,看起来应该可以,你试过了吗?
  • @KarthikT:“新”C++ 程序员不应该经常使用new。代码更像 C 而不是 C++。

标签: c++ opengl codeblocks


【解决方案1】:

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

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(), &amp;polygondata[0], ...) 命令将数据上传到 OpenGL。

【讨论】:

  • 解释我将如何在 glBufferData() 中使用多边形数据向量;
  • 对不起,我不能一夜之间成为专家
  • @Gishump:“解释我将如何在 glBufferData() 中使用多边形数据向量;”我做到了。它就在答案中。
  • @Gishump:但你可以阅读(我想是的)。侮辱别人也不是很好。尼可波拉斯所做的正是你应该做的。请查看stackoverflow.com/tags/opengl/topusers,看看哪些人实际上可以帮助您。恭喜你,你刚刚直接侮辱了前三名之一。
  • 是的,我只是觉得他试图让我在问题 cmets 中看起来像个白痴。感谢大家的帮助
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多