2012-11-29 145 views
0

我正在學習OpenGL中的頂點數組對象。使用mingw gcc作爲我的編譯器運行代碼塊。我用這個(只是一堆四邊形用作牆壁)將二維數組傳遞給只有一維數組的函數(C++)

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多邊形。我知道我將不得不把每個多邊形放在一個單獨的頂點緩衝區中,不需要提醒我。我只需要知道是否可以傳入我的二維數組的一部分!
有沒有更容易和更有效的方式來做到這一點。

+0

您可以傳遞1行的二維數組並給出其中的一個索引 –

+1

我很困惑,您在實際上沒有使用任何C++時如何標記此C++。除了可以在任何地方定義變量的能力,但即使這是合法的C99。我不是在談論你選擇的文件IO API。 –

+0

glBufferData(GL_ARRAY_BUFFER,sizeof(polygondata [0]),polygondata [0],GL_STATIC_DRAW); < - 那樣? – agusterodin

回答

3

看到類似用途這裏有一個更好的主意,不涉及你做了什麼......。

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。

+0

解釋我將如何在glBufferData()中使用polygondata向量; – agusterodin

+0

對不起,我不能成爲一個專家一夜之間 – agusterodin

+1

@Gishump:「*解釋我將如何在glBufferData();中使用polygondata向量*」我做到了。答案就在那裏。 –