gpt4 book ai didi

opengl-3 - 如何在OpenGL 4.0中实现Bullet的btIDebugDraw接口(interface)

转载 作者:行者123 更新时间:2023-12-02 19:13:59 24 4
gpt4 key购买 nike

Bullet 在旧版 OpenGL 中实现了 btIDebugDraw 接口(interface),用于绘制物理世界以进行调试。界面是这样的:

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的力量,而是相当糟糕地模拟即时模式!

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

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

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

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

最佳答案

不要立即使用 drawLine() 进行绘制。 :)
相反,将顶点/颜色推送到主机/RAM 中的缓冲区中。

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

  1. 更新一次 VBO
  2. glDraw ...
  3. 清除主机缓冲区

关于opengl-3 - 如何在OpenGL 4.0中实现Bullet的btIDebugDraw接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com