Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
opengl4中顶点选择的最佳方法_Opengl_Opengl 4 - Fatal编程技术网

opengl4中顶点选择的最佳方法

opengl4中顶点选择的最佳方法,opengl,opengl-4,Opengl,Opengl 4,我找到了这篇文章,它在某种程度上回答了我的问题,但并不完全: 我试图解决的问题:使用OpenGL 4体系结构执行顶点选择的现代方法: 一个用户画了一条橡皮筋,这不是我想要的 我假设在这个阶段,我可以为模型中的每个顶点提供某种唯一的ID 所选区域以某种方式重新渲染,离线使用某种顶点/片段着色器,将顶点存储在缓冲区中,我可以读回? 我只是猜测它涉及某种缓冲区,着色器可以在其中写入渲染顶点的结果,缓冲区在程序中是可读的。我想知道是否有人已经这样做了,或者至少可以让我朝着正确的方向前进。它需要在非常大的

我找到了这篇文章,它在某种程度上回答了我的问题,但并不完全:

我试图解决的问题:使用OpenGL 4体系结构执行顶点选择的现代方法:

一个用户画了一条橡皮筋,这不是我想要的 我假设在这个阶段,我可以为模型中的每个顶点提供某种唯一的ID 所选区域以某种方式重新渲染,离线使用某种顶点/片段着色器,将顶点存储在缓冲区中,我可以读回? 我只是猜测它涉及某种缓冲区,着色器可以在其中写入渲染顶点的结果,缓冲区在程序中是可读的。我想知道是否有人已经这样做了,或者至少可以让我朝着正确的方向前进。它需要在非常大的模型上理想地快速工作,并且使用OpenGL4不推荐的特性,如GL_SELECT等

理想情况下,我还需要使用相同的技术来选择其他组件,例如边和面。
非常坦率地说:OpenGL是关于将东西绘制到屏幕上,而不是场景管理或选择

您可以使用现代OpenGL实现使用变换反馈缓冲区和滥用FBO作为顶点ID缓冲区的选择


但我真的不想用OpenGL来做这件事。至少不是绘制管道。如果需要GPU加速,我会使用OpenCL或OpenGL计算着色器将我感兴趣的顶点子集转换为屏幕空间,并从中构建屏幕空间2D Kd树。然后使用KD树执行最近邻/边界搜索,以查找选择中的顶点。如果OpenCL或OpenGL计算着色器不可用,您也可以在CPU上进行转换。

这非常好,非常有用。我认为你不是第一个坚持OpenGL不是场景图管理系统这一事实的人。我明白了。例如,您建议的方法的问题是,它无法处理深度排序。例如,如果我想选择仅可见的顶点,2D k-d树方法将不起作用!这就是为什么我想知道一种涉及渲染的方法是否会更好?@user18490:你当然可以读回你正在选择的渲染的深度缓冲区,然后测试找到的顶点是否通过深度测试。是的,这是可能的。所有这些听起来不错,但我很难相信建模工具,无论是Rhino、Maya还是Blender,都使用这种方法。为此,必须创建一个加速结构似乎需要做很多工作。如果编辑点会发生什么?您需要重建id树,等等。这太疯狂了。@user18490:屏幕空间Kd树的构建速度非常快。此外,您不必为选择平衡树。但你肯定想要一个空间细分,否则一个天真的选择机制会咬你。Blender使用混合方法:在Z着色模式下,指针下碎片的深度将根据候选顶点进行测试,并且只考虑通过深度测试的顶点。您仍然需要在每次移动点时更新结构。我相信你,你好像知道搅拌机。如果您只想渲染或选择具有特定区域的顶点,我会假设事情会稍微复杂一些。我认为奇怪的是,没有关于这样一个基本/重要功能的清晰教程,无法找到如何将@符号保持在最前面我认为你可以使用这里描述的技术:如果你想使用深度缓冲区来确定可见性,您可以在顶点着色器中每个点的投影位置对其进行采样,并将该信息传递给几何体着色器,该着色器决定是否将该点发射到反馈缓冲区。我不认为这种技术可以用于边缘或面。谢谢,这很有帮助。如果之前没有人回答,当我有一个有效的解决方案时,我会看一看并在这里发布我的答案。但这是一个良好的开端。