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