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 でインターフェイスを書き直しています。

drawLine() 呼び出しのたびにベクトルに頂点を記録し、Bullet の btIDebugDraw 関数への呼び出しがすべて完了した後に VBO を更新することを考えていました。これで、Bullet が btIDebugDraw 関数を呼び出すときに、頂点のペアを断続的に GPU に送信する必要がなくなります。

これまでのところ、頂点データの管理に関する情報がいくつかあります

4

1 に答える 1

7

すぐに描画しないでくださいdrawLine()。:)
代わりに、頂点/色をホスト/RAM のバッファにプッシュします。

を呼び出した後、フレームのすべての行を取得したdynamicsWorld->debugDrawWorld()ことがわかっているDebugDrawerので、次のことができます。

  1. VBOを一度更新する
  2. glDraw ...
  3. ホストバッファをクリア
于 2013-04-01T17:55:12.340 に答える