2012-12-23 8 views
5

Bullet ma implementację interfejsu btIDebugDraw w starszym OpenGL, który służy do rysowania świata fizyki do debugowania. Interfejs jest tak:Jak zaimplementować interfejs btIDebugDraw Bullet w OpenGL 4.0

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 implementacja działa w trybie natychmiastowym wysłaniem wierzchołki w dół do GPU przy każdym wywołaniu funkcji. na przykład. tutaj jest 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(); 
} 

Aby przekonwertować to do OpenGL 4.0, mam tu na myśli używając Vertex Array Obiekt zdefiniowany jako członek tej klasy, powiedzmy mVAO i VBOs będą również członkowie. I będzie skonfigurować VAO w ctor z GLDebugDrawer a następnie wygenerować i wysłać wierzchołki do VBO jak uczynić go w drawLine()

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

Ale ponieważ będziesz wysyłać wierzchołki każdym drawLine() jest wywoływana, to Wygląda na to, że nie używam mocy VAO, ale raczej źle symuluję tryb natychmiastowy!

Jaki byłby lepszy sposób zaimplementowania funkcji rysowania linii w tym interfejsie, której wierzchołki można zmienić w każdym połączeniu ?

Chcę użyć tego kodu w mojej aplikacji na Androida później, aby sprawdzić moją fizykę, więc przepisuję interfejs w OpenGL 4.0, który, jak zakładam, będzie łatwiejszy do konwersji na openGLES 2.0.

Zastanawiam się nad nagrywaniem wierzchołków w wektorze przy każdym wywołaniu funkcji drawLine(), a następnie aktualizowaniu VBO po zakończeniu wszystkich wywołań Bullet do funkcji btIDebugDraw. Wtedy nie musiałbym sporadycznie wysyłać par wierzchołków na GPU, ponieważ Bullet wywołuje funkcje btIDebugDraw.

Mam pewne informacje tutaj o zarządzaniu dane wierzchołków do tej pory: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

+0

Naprawdę nie ma dobrego sposobu, aby to zrobić, gdy dają one wierzchołki po jednym na raz, i zmieniają każdą klatkę. Jest to po prostu funkcja debugowania, więc po prostu kontynuowałbym symulowanie trybu natychmiastowego, tak jak to robisz, i wyłącz tryb debugowania, z wyjątkiem sytuacji, gdy potrzebujesz go do debugowania. – Tim

+0

Dzięki, a następnie postaram się jak najlepiej zoptymalizować go, zbierając punkty w strukturze danych i wykonując tylko 1 aktualizację VBO. –

+0

@safe_malloc Próbuję również zaimplementować to w OpenGL 4.4. W mojej funkcji "drawLine" zbieram wszystkie ** od ** i ** do ** wierzchołków w std :: vector. Następnie przekaż ten wektor do VBO i w mojej funkcji rysowania rysuję za pomocą GL_LINES. Przed następnym krokiemSymulacja() wyczyściam strukturę wektorową i VBO. Ale mój kod wygląda na to, że nie rysuje tak, jak powinien. Czy upublicziłeś swój kod gdzieś w rodzaju GitHub itp. Byłoby to pomocne. –

Odpowiedz

5

nie od razu zwrócić na drawLine(). :)
Zamiast tego wepchnij Vertices/Colours do bufora w Host/RAM.

Po wywołaniu dynamicsWorld->debugDrawWorld(), wiesz, że twój DebugDrawer dostał wszystkich liniach, na ramie, dzięki czemu można zrobić:

  1. Aktualizacji VBOs raz
  2. glDraw ...
  3. jasne Host Buffer
+0

Dzięki, tak, właśnie to robię teraz. Tak więc VBO jest aktualizowany przy każdym wywołaniu debugDrawWorld() lub w ramce, jak sądzę. Prawdopodobnie mogę również zmniejszyć ilość danych przesyłanych do VBO, wykonując porównanie wierzchołków, aby znaleźć zmienione wierzchołki i wysłać tylko te. –

Powiązane problemy