2012-12-23 35 views
5

Bullet在舊的OpenGL中實現了btIDebugDraw接口,該接口用於繪製物理世界進行調試。接口是這樣的:如何在OpenGL 4.0中實現Bullet的btIDebugDraw接口

class GLDebugDrawer : public btIDebugDraw 
{ 
int m_debugMode; 

public: 

GLDebugDrawer(); 
virtual ~GLDebugDrawer(); 

virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor); 

virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color); 

virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color); 

virtual void drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha); 

virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color); 

virtual void reportErrorWarning(const char* warningString); 

virtual void draw3dText(const btVector3& location,const char* textString); 

virtual void setDebugMode(int debugMode); 

virtual int  getDebugMode() const { return m_debugMode;} 

}; 

OpenGL 1.1實現在立即模式下在每次函數調用時將頂點向下發送到GPU。例如。這裏的drawLine()

void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor) 
{ 

    glBegin(GL_LINES); 
     glColor3f(fromColor.getX(), fromColor.getY(), fromColor.getZ()); 
     glVertex3d(from.getX(), from.getY(), from.getZ()); 
     glColor3f(toColor.getX(), toColor.getY(), toColor.getZ()); 
     glVertex3d(to.getX(), to.getY(), to.getZ()); 
    glEnd(); 
} 

轉換成OpenGL的4.0這一點,我想到的是使用被定義爲這個類的成員的頂點數組對象,都說mVAO和維也納組織也將成爲其成員。我會設置了VAO在GLDebugDrawer的構造函數,然後生成和內的drawLine()

drawLine() 
{ 
    // Update buffers 
    // Bind and render the buffer 
} 

發送頂點的VBO以及使其但因爲我會被髮送頂點每次的drawLine()被調用,它似乎我沒有使用VAO的力量,而是模擬立即模式,而不是很糟糕!

什麼是更好的方式來實現這個接口的線繪製功能,其頂點可以在每次調用中更改

我想在我的Android應用程序中稍後使用此代碼來檢查我的物理,因此我正在重寫OpenGL 4.0中的接口,我認爲它將更容易轉換爲openGLES 2.0。

我正在考慮在每次drawLine()調用時在vector中記錄頂點,然後在所有Bullet對btIDebugDraw函數的調用完成後更新VBO。然後,我不需要間歇性地向GPU發送頂點對,因爲Bullet調用btIDebugDraw函數。

我在這裏得到了有關管理頂點數據,到目前爲止的一些信息: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

+0

真的沒有好的方法來做到這一點,他們一次給你一個頂點,他們改變每一幀。這只是一個調試功能,所以我只需繼續模擬即時模式,並關閉調試模式,除非需要進行調試。 – Tim

+0

謝謝,那麼我會盡我所能通過收集數據結構中的點並進行1 VBO更新調用來優化它。 –

+0

@safe_malloc我也試圖在OpenGL 4.4中實現它。在我的「drawLine」函數中,我收集了所有從**和**到** std :: vector頂點的**。然後將該向量傳遞給VBO,並在我的渲染函數中使用GL_LINES進行繪製。在下一個stepSimulation()之前,我清除了我的矢量結構和VBO。 但我的代碼看起來好像不是它應該繪製的。你有沒有把你的代碼公之於衆,比如GitHub等。這會很有幫助。 –

回答

5

不要馬上借鑑drawLine()。 :)
而不是將頂點/顏色推入主機/ RAM中的緩衝區。

調用dynamicsWorld->debugDrawWorld()後,你知道你的DebugDrawer得到了幀中所有的線,所以你可以這樣做:

  1. 更新維也納各組織再次
  2. glDraw ...
  3. 明確的主機緩衝區
+0

謝謝,這就是我現在所做的。所以VBO會在每次調用debugDrawWorld()或每幀的時候得到更新。我也可以通過進行頂點比較來減少發送給VBO的數據量,以查找已更改的頂點並僅發送這些頂點。 –