【问题标题】:Which mouse picking strategy for milions of primitives?数百万个基元的鼠标选择策略是什么?
【发布时间】:2012-03-01 12:43:51
【问题描述】:

我正在使用 VBO 渲染基于数百万个(最多十个)三角形的模型,我需要检测用户可以点击哪些三角形。

我尝试阅读并理解“名称堆栈”和“唯一颜色”的工作原理。 我发现名称堆栈最多只能包含 128 个名称,而唯一颜色最多可以有 2^(8+8+8) = 16777216 种可能的不同颜色,但有时可能会有一些近似值,所以它可以得到修改..

哪种策略最适合我的情况?

【问题讨论】:

  • 也许有适当的包围体层次结构的光线拾取?
  • 名称/颜色真的很慢......我不会出于任何目的推荐。照巴特说的去做。

标签: opengl selection jogl mouse-picking


【解决方案1】:

基本上,您有 2 类选项:

  1. “每个三角形的唯一颜色方式”,这意味着您将 id 附加到每个三角形,并将 id 渲染到单独的渲染目标。它可以是 32 位(RGB 为 8,a 为 8),但您可以添加第二个以获得更多想法。获取每个三角形的 id 会很麻烦,但实现起来相对容易。不过可能对性能非常不利(填充率)。

  2. 正确的光线追踪。您几乎肯定想要一个加速结构(八叉树、kd、...),但您可能已经有一个用于截锥剔除的结构。一根射线真的不多,这个方法应该很快。

  3. 混合。可能是最容易实现的。渲染出顶点缓冲区 id(“每个缓冲区的唯一颜色:),当您知道选择了哪个顶点缓冲区”时,只需针对所有三角形跟踪一条射线。

在一般情况下,我会说 2) 是最佳选择。如果您想快速完成某些工作,请选择 3)。 1) 可能没什么用。

【讨论】:

  • 同意。具有空间加速结构的光线追踪是最好的方法。
  • 鉴于我对 OpenGL 比较陌生,我想从一些容易实现的东西开始(也许也大致 ^^),所以 1 或 3.. 事实上我主要只有一个VBO 包含,比方说,1000 万个三角形,我想当你提到“对所有三角形的射线”时,我担心这对于如此大量的三角形来说是不可行的。另一件事,你呢有一些关于光线追踪的好教程的链接吗?那么用一个像素读取深度并将其传递给 gluUnProject 以检索 x 和 y 坐标呢?
  • @elect,不要使用名称/颜色。如果你想让它变得简单,请使用 gluUnProject() 并从那里从任意半径获取一堆三角形,并测试每个三角形的交点。但我警告您:您可能无法获得正确的 x/y 位置,具体取决于与模型的距离/角度。不过,无论如何,您可能需要八叉树来使用此方法。
  • 我说 1) 非常没用,因为为每个三角形渲染出一个唯一的 id(没有插值)并不是一件容易的事(但也不是太难)。如果你能做到,那么一定要继续。另请注意,我错误地使用了“光线追踪”,您可能想要“光线拾取”。谷歌包围体层次、八叉树、射线三角交点。
【解决方案2】:

如果您的 GPU 卡有 OpenGL 4.2,您可以使用 GLSL 中的函数 imageStore() 来标记图像中的三角形 Id。就我而言,我需要检测屏幕上预定义窗口后面的所有三角形。拾取(选择窗口上渲染的三角形)的工作方式类似。选择对我来说是实时运行的。

图像(或纹理)的最大尺寸应该 >= 8192x8192 = 64 M。因此它可以使用多达 64 M 个图元(如果我们使用 2、3 个图像,甚至更多)。

可以使用这个片段着色器将所有三角形 ID 保存在屏幕后面:

uniform  uimage2D id_image;

void main() 
{
    color_f = vec4(0)
    ivec2 p;
    p.x = gl_PrimitiveID % 2048;
    p.y = gl_PrimitiveID / 2048;
    imageStore(id_image, p, uvec4(255));
}

要保存屏幕上渲染的所有三角形 ID:首先,我们预先计算一个深度缓冲区,然后使用稍微不同的片段着色器:

uniform  uimage2D id_image;

**layout(early_fragment_tests) in;** //the shader does not run for fragment > depth

void main() 
{
    color_f = vec4(0)
    ivec2 p;
    p.x = gl_PrimitiveID % 2048;
    p.y = gl_PrimitiveID / 2048;
    imageStore(id_image, p, uvec4(255));
}

【讨论】:

  • 现在我正在研究 OpenGL 2。但我可能会在不久的将来改变。为您的有趣帖子 +1
猜你喜欢
  • 1970-01-01
  • 2015-07-13
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多