2012-07-16 40 views
0

我有問題使用這些代碼在屏幕上渲染很多圈子。使用GL_LINE_LOOP繪製多個圈子

float degree = 0; 
unsigned int ctr = 0; 
for(int xi = -3200; xi < 3200; xi+= 2*r) 
{ 
    for(int yi = 4800; yi > -4800; yi-= 2*r) 
    { 
     for(int i = 0; i < 360; ++i) 
     { 
      vertices.push_back(xi + r * cos(float(degree))); 
      vertices.push_back(yi + r * sin(float(degree))); 
      vertices.push_back(-8); 

      indices.push_back(i+ctr);    
      ++degree; 
     } 
     ctr += 360; 
     degree = 0; 
    } 
} 

unsigned int i = 0; 
for(i = 0; i < indices.size()/360; ++i) 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, &vertices[i*360]); 
    glLineWidth(1); 
    glDrawElements(GL_LINE_LOOP, 360, GL_UNSIGNED_INT, &indices[i*360]); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 

下面是結果 circles

此外,該程序崩潰時我改變XI值[-6400,6400]

回答

4

撇開這種技術的可疑性質的,你看不正確地訪問索引。

glVertexPointer(3, GL_FLOAT, 0, &vertices[i*360]); 
glDrawElements(GL_LINE_LOOP, 360, GL_UNSIGNED_INT, &indices[i*360]); 

glDrawElements的索引指定從glVertexPointer的頂點的偏移量。您已經定義了指數爲相對於頂點緩衝區的開始:

indices.push_back(i+ctr); 

但你移動緩衝區每個你畫圈子偏移。因此,在您的索引緩衝區中,第二個圓圈從索引360開始。但是,當您繪製第二個圓圈時,還要移動頂點指針,使得索引360是指針的第0個元素。

然後,當您嘗試訪問索引360時,您實際上正在訪問元素720(360 +啓動緩衝區@ 360)。

+0

謝謝先生。我真是個愚蠢的錯誤。 – taker 2012-07-16 22:25:10