2016-03-28 1 views
0

Dans Christer Ericson, un excellent livre sur la détection de collision, il donne une méthode GPU accélérée pour détecter une collision entre des polygones convexes avec l'algorithme suivant.OpenGL C++ Occlusion Query

Je suis complètement nouveau pour OpenGL, et ma question est, étant donné deux std::vector des points où:

struct Point{ 
    double x, 
    double y, 
} 

Comment puis-je passer ce std::vector<Point> à la fonction suivante et retourner le résultat en C++? Mon vecteur est un ordre de polygone convexe CCW.

// Initialize depth buffer to far Z (1.0) 
glClearDepth(1.0f); 
glClear(GL_DEPTH_BUFFER_BIT); 
// Disable color buffer writes 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
// Enable depth testing 
glEnable(GL_DEPTH_TEST); 
// Initialize occlusion queries 
Gluint query[1], numSamplesRendered; 
glGenQueries(1, query); 
// Set pixels to always write depth 
glDepthFunc(GL_ALWAYS); 
glDepthMask(GL_TRUE); 
// Draw front faces of object A 
glCullFace(GL_BACK); 
RenderObject(A); 
// Pass pixels if depth is greater than current depth value 
glDepthFunc(GL_GREATER); 
// Disable depth buffer updates 
glDepthMask(GL_FALSE); 
// Render back faces of B with occlusion testing enabled 
glBeginQuery(GL_SAMPLES_PASSED, query[0]); 
glCullFace(GL_FRONT); 
RenderObject(B); 
glEndQuery(GL_SAMPLES_PASSED); 
// If occlusion test indicates no samples rendered, exit with no collision 
glGetQueryObjectuiv(query[0], GL_QUERY_RESULT, &numSamplesRendered); 
if (numSamplesRendered == 0) return NO_COLLISION; 
// Set pixels to always write depth 
glDepthFunc(GL_ALWAYS); 
glDepthMask(GL_TRUE); 
// Draw front faces of object B 
glCullFace(GL_BACK); 
RenderObject(B); 
// Pass pixels if depth is greater than current depth value 
glDepthFunc(GL_GREATER); 
// Disable depth buffer updates 
glDepthMask(GL_FALSE); 
// Render back faces of A with occlusion testing enabled 
glBeginQuery(GL_SAMPLES_PASSED, query[0]); 
glCullFace(GL_FRONT); 
RenderObject(A); 
glEndQuery(GL_SAMPLES_PASSED); 
// If occlusion test indicates no pixels rendered, exit with no collision 
glGetQueryObjectuiv(query[0], GL_QUERY_RESULT, &numSamplesRendered); 
if (numSamplesRendered == 0) return NO_COLLISION; 
// Objects A and B must be intersecting 
return COLLISION; 

Répondre

1

Une façon possible:

  1. U besoin de passer votre std::vector<Point> à une fonction qui mettra à jour les tampons de l'objet (A ou B, ou les deux) (sommet/index).
  2. Appelez la fonction qui effectuera la requête d'occlusion et le résultat de retour. Probablement un booléen dans votre cas
+0

Comment mettre à jour un tampon? Je pensais que le but de cette fonction était d'éviter les relectures de tampons – DaynaJuliana

+0

Je parle des tampons requis pour dessiner les objets dans depthBuffer. U peut utiliser glBufferSubData ou glMapBufferBuffer – Raki

+0

Ok merci! Désolé c'est tout nouveau pour moi! – DaynaJuliana