【问题标题】:Slow transform feedback-based picking?基于变换反馈的缓慢拾取?
【发布时间】:2017-10-23 16:40:50
【问题描述】:

我正在尝试使用transform feedback 实现拣货程序。目前它工作正常,但问题是速度非常低(比GL_SELECT 慢)。

现在如何运作:

  1. 使用带有偏移量的glBindBufferRange() 绑定TBO(开头为0)。
  2. 使用glBufferSubData() 重置内存(TF 变化结构的大小)(以确保选择正确)。主要问题在这里。
  3. 使用几何着色器绘制对象,该着色器检查与拾取射线的交点。如果找到交集,着色器将其写入 TF 变化(最初它没有交集,请参见步骤 2)。
  4. 增加偏移量并使用下一个对象转到第 1 步。

所以,最后我有一个为每个对象挑选数据的数组。

问题是如何避免在每次迭代中调用glBufferSubData()?可能的解决方案(但我不知道如何实施)是:

  • 只写一个 TF 变量。所以不需要重置其他的
  • 用任何其他方式重置数据

有什么想法吗?

【问题讨论】:

  • 我已经有一段时间没有使用openGL了,但是你不能一次性处理所有对象并让几何过滤器写出所有相交图元的ID吗?然后,您必须找到一种将基元与它们所属的对象相关联的方法,但这应该是可能的。

标签: c++ opengl picking transform-feedback


【解决方案1】:

如果您只想清除缓冲区的某个区域,use glClearBufferSubData。话虽如此,尚不清楚为什么需要清除它,而不仅仅是覆盖那里的内容。

仅供参考:最好通过渲染场景、为对象分配不同的“颜色”以及读取感兴趣的像素来实现拾取。您的方法总是会变慢。

【讨论】:

  • 并非所有图元都可以与射线相交。我的着色器只写变量以防万一。因为我不知道基元的数量,所以我只使用第一个变量并为下一个对象做偏移。但是下一个第一个变量的内存已经受到前一个对象的影响。这就是为什么我需要清除它。
  • 基于颜色的方法不适合我,因为矩形选择和大缩放的可能性。对象只是可以退化,放大后将没有选定的对象
  • @VetalB:如果您正在缩放,那么该缩放应该是您的拾取渲染的一部分。如果用户可以看到该对象,那么他们可以单击它。框选择可以简单地通过读取该框内的所有像素来工作。 “这就是我需要清除它的原因。” 仍然不清楚为什么必须清除缓冲区。反馈操作会记住他们写入了哪些数据。所以如果你再做一次反馈渲染,只要你没有停止反馈操作,那么写入的数据不会覆盖之前的数据。它只会移动到缓冲区中的下一个位置。
  • 用户可能看不到对象。整个模型可以渲染为一个像素(大缩放)。模型可以包含很多对象,用户必须能够选择每个对象。
  • 让我更详细地解释一下我的方法。 1) 预留 TBO 缓冲区。并且绑定缓冲区范围从 0 2) 拾取第一个对象。让我们想象它有 10 个原语。其中 5 个与射线相交,因此写入了 5 个变量 3) 在一个变量元素的大小上增加绑定偏移量。这是因为我不知道写入原语的数量+节省内存。 4) 拾取第二个对象。因为第二个对象已经被第一个对象(以及前 5 个)写入了,所以我需要清除它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多