0

OpenGLで頂点配列オブジェクトを学習しています。コンパイラとしてmingwgccを使用してコードブロックを実行します。これを使用してテキストファイルからデータをロードしました(壁として使用されるクワッドの束)

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が1次元の配列であることを想定していますが、すべての頂点データを2次元の配列に格納し、最初の次元は複数のポリゴン(この場合はQUADS)の格納に使用され、2番目の次元は12個すべての格納に使用されますクワッドの頂点。

これに取り組むための最良の方法は何でしょうか?

私が思いついた提案された解決策は、一度に1つのポリゴンからの頂点データを一時的に格納する別の配列(ただし、単一次元)を作成することでした。この一次元配列をglBufferData関数に渡した直後(glBufferDataは一次元配列の受信に問題がないため)。2次元配列全体を効果的にトラバースし、関数データにポリゴンごとにglBufferDataに渡すすべてのポリゴンに対して、これを繰り返します。私は、各ポリゴンを別々の頂点バッファに配置する必要があることを知っています。私に思い出させる必要はありません。2次元配列の一部を渡すことが可能かどうかを知る必要があります。
これを行うためのより簡単で効率的な方法はありますか?

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);
}

無意味なメモリ割り当てが削除されるだけでなく、データが1D配列になり、1D方式でインデックスを作成できるようになります。ポリゴンYの頂点Xにアクセスする場合Y * numpolygons + Xは、インデックスに使用します。glBufferData(..., sizeof(GLfloat) * polygondata.size(), &polygondata[0], ...)また、簡単なコマンドを使用してデータをOpenGLにアップロードできます。

于 2012-11-29T05:26:09.853 に答える
0

2つのインデックスのいずれかを指定して2D配列の1行だけを渡すことができます。これにより、その特定のポリゴンデータのみが参照されます。

https://stackoverflow.com/a/13427008/1520364で同様の使用法を見ることができます

于 2012-11-29T05:23:54.350 に答える