使用OpenGL着色语言进行拣选

3

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

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

  • 使用系统提供的缓冲区(实际上使用颜色)进行渲染。使用glScissor将渲染限制在特定区域,并使用glReadPixels获取与几何标识符映射的颜色。
  • 使用单独的帧缓冲对象进行渲染。需要定义Renderbuffer格式。也许我可以使用纯整数来放置名称?
  • 使用帧缓冲对象进行渲染和拾取。另外包含已呈现名称的renderbuffer对象。

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

有什么建议吗?

P.S:

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

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

1个回答

3

我不确定着色器在这里是否真的有所帮助,除非它作为某种优化方式,通过渲染到多个目标来生成拾取值和颜色值。

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

如果您真的想创新并与常规偏离,您可以尝试使用着色器执行与场景中形状的射线相交。这将需要大量专业的着色器开发,并且很难看到好处,除非您进行了大量的拾取(也许是光线追踪器?)。


1
如果有人对研究GPU光线相交感兴趣,实际上有一篇论文声称该方法比传统的基于GPU的拾取方法“快2到14倍”,我还没有尝试它。论文链接:http://www.hindawi.com/journals/ijcgt/2009/730894/。 - Loomchild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接