Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于慢变换反馈的拾取?_C++_Opengl_Picking_Transform Feedback - Fatal编程技术网

C++ 基于慢变换反馈的拾取?

C++ 基于慢变换反馈的拾取?,c++,opengl,picking,transform-feedback,C++,Opengl,Picking,Transform Feedback,我正在尝试使用来实现拾取例程。目前它工作正常,但问题是速度非常低(低于GL\u SELECT) 它现在的工作原理: 使用带有偏移量(开头为0)的glBindBufferRange()绑定TBO 使用glBufferSubData()重置内存(TF varyings结构的大小)(以确保拾取正确)。主要问题在这里 使用检查与拾取光线相交的几何体着色器绘制对象。如果找到交集,着色器会将其写入TF变量(最初它没有交集,请参见步骤2) 增加偏移量,然后使用下一个对象转到步骤1 因此,在最后,我有一个为每个

我正在尝试使用来实现拾取例程。目前它工作正常,但问题是速度非常低(低于
GL\u SELECT

它现在的工作原理:

  • 使用带有偏移量(开头为0)的
    glBindBufferRange()
    绑定TBO
  • 使用
    glBufferSubData()
    重置内存(TF varyings结构的大小)(以确保拾取正确)。主要问题在这里
  • 使用检查与拾取光线相交的几何体着色器绘制对象。如果找到交集,着色器会将其写入TF变量(最初它没有交集,请参见步骤2)
  • 增加偏移量,然后使用下一个对象转到步骤1
  • 因此,在最后,我有一个为每个对象拾取数据的数组

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

    • 只写一篇文章。因此,没有必要重置其他
    • 以任何其他方式重置数据

    有什么想法吗?

    如果您只想清除缓冲区的一个区域。也就是说,不清楚为什么需要清除它,而不是仅仅覆盖其中的内容


    仅供参考:通过渲染场景、为对象指定不同的“颜色”以及读取感兴趣的像素,可以最好地实现拾取。你的方法总是比较慢。

    我已经有一段时间没有使用openGL了,但是你不能一次性处理所有对象,让几何过滤器写出所有相交图元的ID吗?然后,您必须找到一种方法将基本体与它们所属的对象相关联,但这应该是可能的。并非所有基本体都可以与光线相交。我的着色器仅在其写入变量的情况下写入变量。因为我不知道基本体的数量,所以我只使用第一个变量,并对下一个对象进行偏移。但是下一个第一个对象的内存已经受到前一个对象的影响。这就是为什么我需要清除它。基于颜色的方法不适合我,因为矩形选择和大缩放的可能性。对象可能会退化,放大后将不会选择任何对象objects@VetalB:如果要缩放,则该缩放应该是拾取渲染的一部分。如果用户可以看到该对象,则可以单击该对象。只需读取该框中的所有像素,框选择即可工作。“这就是为什么我需要清除它。”仍然不清楚为什么必须清除缓冲区。反馈操作会记住他们编写的数据。因此,如果执行另一个反馈渲染,只要尚未停止反馈操作,则写入的数据将不会覆盖以前的数据。它只会移动到缓冲区中的下一个位置。用户可能看不到该对象。整个模型可以渲染为一个像素(大缩放)。模型可以包含很多对象,用户必须能够选择每个对象。让我详细解释我的方法。1) 保留TBO缓冲区。和绑定缓冲区范围从0到2)拾取第一个对象。让我们假设它有10个基本体。其中5个与射线相交,因此写入5个变量3)根据一个变化元素的大小增加绑定偏移量。这是因为我不知道写入的原语+保存内存的数量。4) 拾取第二个对象。因为第二个对象已经被第一个对象(以及所有前5个对象)写入,所以我需要清除它