【发布时间】: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;
}
我知道这有点多余,但在我开始重写将所有数据存储到数组中的部分之前,它会起作用。
通常,数据通过使用
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