6

Bullet 在旧 OpenGL 中实现了 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 和 VBO 也将成为成员。我将在 GLDebugDrawer 的 ctor 中设置 VAO,然后生成顶点并将其发送到 VBO,并在 drawLine() 中渲染它

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

但是因为每次调用 drawLine() 时我都会发送顶点,所以我似乎没有使用 VAO 的强大功能,而是非常糟糕地模拟了立即模式!

在这个接口中实现线条绘制功能的更好方法是什么,其顶点可以在每次调用中改变?

我想稍后在我的 android 应用程序中使用此代码来检查我的物理特性,因此我正在重写 OpenGL 4.0 中的接口,我认为它更容易转换为 openGLES 2.0 。

我正在考虑在每次 drawLine() 调用时将顶点记录在向量中,然后在 Bullet 对 btIDebugDraw 函数的所有调用完成后更新 VBO。然后我不需要间歇性地向 GPU 发送顶点对,因为 Bullet 调用 btIDebugDraw 函数。

到目前为止,我在这里得到了一些关于管理顶点数据的信息:http: //developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

4

1 回答 1

7

不要马上画图drawLine()。:)
而是将顶点/颜色推入主机/RAM 中的缓冲区。

调用 后dynamicsWorld->debugDrawWorld(),您知道您DebugDrawer已获得框架的所有行,因此您可以执行以下操作:

  1. 更新 VBO 一次
  2. glDraw ...
  3. 清除主机缓冲区
于 2013-04-01T17:55:12.340 回答