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
真的沒有好的方法來做到這一點,他們一次給你一個頂點,他們改變每一幀。這只是一個調試功能,所以我只需繼續模擬即時模式,並關閉調試模式,除非需要進行調試。 – Tim
謝謝,那麼我會盡我所能通過收集數據結構中的點並進行1 VBO更新調用來優化它。 –
@safe_malloc我也試圖在OpenGL 4.4中實現它。在我的「drawLine」函數中,我收集了所有從**和**到** std :: vector頂點的**。然後將該向量傳遞給VBO,並在我的渲染函數中使用GL_LINES進行繪製。在下一個stepSimulation()之前,我清除了我的矢量結構和VBO。 但我的代碼看起來好像不是它應該繪製的。你有沒有把你的代碼公之於衆,比如GitHub等。這會很有幫助。 –