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 に送信する必要がなくなります。
これまでのところ、頂点データの管理に関する情報がいくつかあります 。