2013-02-04 26 views
0

我試圖將一個向量傳遞給glDrawElements()的最後一個參數。如果我使用數組,它工作正常。但是,當我切換到矢量時,它只渲染了一部分對象。OpenGL - 將一個向量傳遞到glDrawElements()

這只是正常工作:

//TA_CartesianSys.h 
class TA_CartesianSys 
{ 
    private: 
     int drawOrder[86]; 
    //the rest of the class 
} 


//--------------------------------- 
//TA_CartesianSys.cpp 
TA_CartesianSys::TA_CartesianSys() 
{ 
    GLfloat CartesianVertices[] = { ... }; 
    int tempOrder[] = { ... }; 
    for(int i = 0; i < sizeof(tempOrder)/sizeof(int); i++) 
    { 
     drawOrder[i] = tempOrder[i]; 
    } 
    //Code to generate and bind vertex array and buffer 
    glDrawElements(GL_LINES, sizeof(drawOrder)/sizeof(int), GL_UNSIGNED_INT, drawOrder); 
} 

它的工作如預期,這是怎麼看起來像:

enter image description here

現在,我決定用向量來代替陣列DRAWORDER []。這是新代碼:

//TA_CartesianSys.h 
class TA_CartesianSys 
{ 
    private: 
    std::vector<int> drawOrder; //***NOTE: This is the change 
    //the rest of the class 
} 
//--------------------------------- 
//TA_CartesianSys.cpp 
TA_CartesianSys::TA_CartesianSys() 
{ 
    GLfloat CartesianVertices[] = { ... }; 
    int tempOrder[] = { ... }; 

    drawOrder.resize(sizeof(tempOrder)/sizeof(int)); 
    for(int i = 0; i < (sizeof(tempOrder)/sizeof(int)); i++) 
    { 
     drawOrder[i] = tempOrder[i]; 
    } 

    //Code to generate and bind vertex array and buffer - Same as above 

    glDrawElements(GL_LINES, sizeof(drawOrder)/sizeof(int), GL_UNSIGNED_INT, &drawOrder[0]); 
} 

這是我得到了什麼,當我跑的程序:

enter image description here

注:中間的正方形是不是這個對象的一部分。它屬於一個完全不同的階級。

所以,基本上,當我將drawOrder []更改爲向量而不是數組時,只有一小部分對象被渲染(2行)。其餘的都沒有看到。

我在draw()函數中放置了一個斷點,它顯示drawOrder向量已正確初始化,其值與數組計數器部分完全相同。

enter image description here

那麼,爲什麼我只獲得了2行,而不是整個網格?我錯過了什麼?

回答

6

sizeof上的矢量對象只告訴你矢量類實例的大小,而不是元素的數量。你需要的是std :: vector的大小成員函數,它告訴你元素的數量(即你不能用由sizeof元素分隔的std :: vector :: size的數字)。

glDrawElements(
    GL_LINES, 
    drawOrder.size(), // <<<<< 
    GL_UNSIGNED_INT, 
    &drawOrder[0]); 
+0

是的,我意識到這一點。我應該仔細看看。感謝您的答覆。 – TATN