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