opengl - 使用 OpenGL 着色语言进行选择

标签 opengl glsl picking

我正在尝试找出最佳方法来选择使用着色器呈现的信息。 窗口管理器缓冲区(窗口)用于输出渲染。在用户事件中,我应该选择渲染的几何体。使用 gluPick 很简单,但我尝试仅使用着色器进行拾取。

着色器的灵 active 并不能帮助我找到正确的解决方案。我找到了以下解决方案:

  • 使用系统提供的缓冲区进行渲染(实际上是使用颜色)。使用 glScissor 限制特定区域的渲染并使用 glReadPixels 获取颜色,使用几何标识符映射
  • 使用单独的帧缓冲区对象进行渲染。需要定义渲染缓冲区格式。或许我可以使用纯整数来放置名称?
  • 使用帧缓冲区对象进行渲染,用于渲染和拾取。一个包含渲染名称的附加渲染缓冲区对象。

似乎第二种解决方案是最好的,因为它不会改变窗口缓冲区,并且可以定义自定义方式来指定几何名称。

有什么建议吗?

附言:

由于在片段着色器中我声明了一个 vec4 数组来定义片段数据,我如何设置一个帧缓冲区来保存一个渲染缓冲区,其中只有 R 组件,以一定大小的整数内部格式存储?

是否可以将片段着色器输出变量与特定的附加渲染缓冲区链接起来?

最佳答案

我不确定着色器在这里真的有任何帮助,除了可能作为某种形式的优化,您可以在其中渲染多个目标,从而能够一次生成您的拾取值和颜色值。

如果您正在使用光栅化进行拾取,您总是会被 glReadPixels() 调用或等效调用所困,并且您总是会基本上将场景绘制到某种具有拾取值的缓冲区。

如果您真的想发挥创意并打破常规,您可以尝试使用着色器对场景中的形状执行光线交叉。这将需要大量专门的着色​​器开发,除非您进行大量拾取(也许是光线跟踪器?),否则很难看到好处。

关于opengl - 使用 OpenGL 着色语言进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208304/

相关文章:

c++ - 将 Freetype 字形渲染到 OpenGL (3.3+) 纹理会导致重复纹理和伪影

java - 在java 2d中采摘

javascript - 三人组 : assign different colors to each vertex in a geometry

Android OpenGL 3D采摘

c++ - 在 C++ 中强制使用 Opengl 2.0 及更高版本

Java OpenGL渲染许多三角形

java - JOGL:如何更改现有 GLCanvas 的 GLCapability?

c++ - 动态生成对象的 glewInit() 错误?

debugging - 形状取决于点光源顶点或片段着色器中的视角

c++ - GPU粒子元球表面渲染