2016-03-28 9 views
0

Collision Detectionに関するChris Ericsonの著書では、次のアルゴリズムを使用して凸多角形間の衝突を検出するための加速GPUメソッドを提供しています。OpenGL C++ Occlusion Query

私は、OpenGLを完全に新たなんだ、と私の質問は、ポイントの2 std::vector与えられ、次のとおりです。

struct Point{ 
    double x, 
    double y, 
} 

がどのように私は次の関数にこのstd::vector<Point>を渡し、C++で結果を返すことができますか?私のベクトルは凸多角形の順序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; 

答えて

1

1つの可能な方法:

  1. をUは、オブジェクトの(AまたはBまたは両方)のバッファ(頂点/インデックス)を更新する関数へのごstd::vector<Point>を渡す必要があります。
  2. オクルージョンクエリを実行し、結果を返す関数を呼び出します。おそらくあなたの場合のブール値
+0

バッファーを更新するにはどうすればよいですか?私はこの機能のポイントがバッファのリードバックを避けることだと思った。 – DaynaJuliana

+0

私はオブジェクトをdepthBufferに描画するのに必要なバッファについて話している。 UはglBufferSubDataまたはglMapBufferBufferを使用できます – Raki

+0

ありがとう!申し訳ありません、これは私にはすべて新しいです! – DaynaJuliana