2012-07-05 87 views
2

我有浮體的載體,這種載體描述了一組每個三角形是使用18個浮子描述三角形的,前3是第一頂點,接下來的3 decribes正常的最後的頂點等3次直到描述每個三角形。在glVertexPointer的OpenGL函數使用C++的std ::矢量

我使用

std::vector<GLfloat> 

來存儲所有號碼,這是我的代碼來呈現三角形

void Visualizer::draw3dModel() 
{ 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glNormalPointer(GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data() + 3); 
    glVertexPointer(3, GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data()); 

    glPushMatrix(); 

     glScalef(0.05f, 0.05f, 0.05f); 
     glColor3f(1,1,1); 

     glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size()); 

    glPopMatrix(); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
} 

此代碼實際工作,但在某些時刻,我重新花車的矢量與新的三角形,它可以是更多或更少的三角形

在創建新的三角形之前,我清除頂點的矢量,使用此功能

std::vector<GLfloat>* MarchingCubesThread::getTriangles(float minvalue_scale) 
{ 
    this->generateTriangles(minvalue_scale); 

    for(unsigned int i=0; i < this->num_triangles; i++) 
    { 
     for(int j=0; j < 3; j++) 
     { 
      this->vertexes.push_back(this->triangles[i].p[j].x); 
      this->vertexes.push_back(this->triangles[i].p[j].y); 
      this->vertexes.push_back(this->triangles[i].p[j].z); 

      this->vertexes.push_back(this->triangles[i].norm.x); 
      this->vertexes.push_back(this->triangles[i].norm.y); 
      this->vertexes.push_back(this->triangles[i].norm.z); 
     } 
    } 

    return &(this->vertexes); 
} 

void MarchingCubesThread::generateTriangles(float minvalue_scale) 
{ 
    this->vertexes.clear(); 
    this->triangles.clear(); 

    this->triangles = MarchingCubesDataset(this->dataset->getMaxVal() * minvalue_scale, *(this->dataset), LinearInterp, this->num_triangles); 
} 

在創建一組新的三角形後,OpenGL渲染器更新了網格,但在某些時候,我得到了一些垃圾三角形和/或來自上一次迭代的三角形,它們應該是

this->vertexes.clear(); 
this->triangles.clear(); 

在這裏連續三次採取了一些截圖:

original surface after creating new triangles, shows some triangles from past surface the same effect here

致電該清除個

關於這裏發生了什麼任何線索?謝謝

PD:爲完整的源代碼,這是在GitHub上公開的Git倉庫: https://github.com/joecabezas/MemoriaJoeCabezasCode/tree/visualizer

回答

4

glDrawArrays在緩衝區預計不計浮標,但是頂點的數量。 所以正確的調用應該是:

glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size()/6); 

通過讓glDrawArrays吸引6倍以上的頂點了要顯示的有效矢量數據結束後的垃圾,有時它是從以前的迭代數據。

+0

編輯的代碼中使用您的建議,但在excecution的時候拋出這個錯誤: intel_do_flush_locked失敗:參數列表過長 –

+0

也,我添加了鏈接到GitHub上託管的,如果你想偷偷的源代碼;) –

+0

aaawwww,我想通了,我在開始製作這個 - > vertexes-> size()的空矢量,現在我強制創建三角形,然後渲染,現在它的工作原理!,謝謝 –