2010-02-05 79 views
2

我试图找出选择使用着色器呈现信息的最佳方法。 窗口管理器缓冲区(窗口)用于输出渲染。在用户事件中,我应该选择渲染的几何图形。使用gluPick很容易,但我试图选择仅使用着色器。采用OpenGL着色语言

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

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

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

有什么建议吗?

PS:

由于在片段着色器我声明vec4的阵列用于限定所述片段数据,如何我可以设置一个帧缓冲保持一个呈现只具有R成分缓冲器,存储在尺寸整数内部格式?

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

回答

2

我不确定着色器在这里是否真的有帮助,除非某种形式的优化可以渲染到多个目标,从而能够一次生成拾取值和颜色值。

如果你正在使用光栅化进行拾取,你总是会被glReadPixels()调用或等价的卡住,你总是基本上将你的场景绘制到某种类型的缓冲区中, 。

如果您真的想要创造出与众不同的标准,您可以尝试使用着色器与场景中的形状执行光线交叉。这需要一些专门的着色​​器开发,除非你做了很多选择(可能是光线追踪器),否则很难看到好处。

+0

如果有人对研究GPU射线交集感兴趣,实际上有一篇关于它声称该方法为“2”的[论文](http://www.hindawi.com/journals/ijcgt/2009/730894/)到基于GPU的传统拾取速度的14倍“。我还没有尝试过。 – Loomchild 2012-12-12 14:05:48