首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL C++闭包查询

OpenGL C++闭包查询
EN

Stack Overflow用户
提问于 2016-03-28 07:49:07
回答 1查看 818关注 0票数 0

在赫里斯特·埃里克森的“碰撞检测”一书中,他给出了一种用以下算法检测凸多边形间碰撞的加速GPU方法。

我对OpenGL完全陌生,我的问题是,给出两个std::vector点如下:

代码语言:javascript
复制
struct Point{
    double x,
    double y, 
}

如何将此std::vector<Point>传递给以下函数并在C++中返回结果?我的向量是凸多边形序CCW。

代码语言:javascript
复制
// 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;
EN

回答 1

Stack Overflow用户

发布于 2016-03-28 08:57:13

一种可能的方式是:

  1. 您需要将您的std::vector<Point>传递给一个函数,该函数将更新对象的缓冲区(顶点/索引) (A或B或两者兼有)。
  2. 调用将执行遮挡查询和返回结果的函数。可能是你的情况下的布尔值
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36258142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档