【问题标题】:OpenGL Use shader as filterOpenGL 使用着色器作为过滤器
【发布时间】:2013-05-06 16:47:48
【问题描述】:

在 OpenGL 中用作一种过滤器的标准程序是什么?当我说过滤器时,我的意思是边缘检测之类的东西。例如,假设我想将 SSAO 过滤器应用于 FBO。我是否将 FBO 和深度缓冲区绑定到纹理,然后在使用着色器的同时在相机前面绘制一个四边形,同时绘制到单独的 FBO?这就是我到目前为止一直在做的事情,但这有点烦人。我想知道大多数人使用的常见做法。我可能在这里遗漏了一些相当大的东西。我正在使用 LWJGL,所以如果这很重要,请不要过度使用。

【问题讨论】:

  • 你为什么觉得它很烦人?您希望这在 OpenGL 中如何工作?

标签: opengl lwjgl fbo


【解决方案1】:

这正是常见的做法。将您的场景绘制成一个或多个纹理(通过使用 FBO),然后通过绘制纹理屏幕大小的四边形将这些纹理输入过滤着色器,将结果渲染到另一个纹理(通过使用另一个或相同的 FBO)或完成后直接进入默认(显示)帧缓冲区。

现在(使用 OpenGL 4.3 硬件和驱动程序)您还有另一种选择。您还可以为此类任务使用Compute Shader。这基本上是一种特殊的着色器,与所有其他着色器阶段相比,它不是通常的图形管道的一部分,而是将通用 GPGPU 编程模型(从 CUDA 或 OpenCL 已知)暴露给 OpenGL,同时能够使用所有OpenGL 数据结构和功能,例如图像加载/存储或纹理过滤。 (好吧,实际上也可以使用 CUDA 或 OpenCL,它们允许与 OpenGL 互操作,但这相当麻烦,对于非常适合图像过滤等图形域的任务来说不值得。但是计算着色器的 为零 学习和互操作开销使其成为可用的替代方案。)

【讨论】:

  • 我想我认为简单地绘制一个屏幕大小的四边形会“不专业”或其他什么。至少现在我不必更改我的代码!感谢您提供有关计算着色器的额外信息。
  • @Abaab 好吧,在某种程度上,这确实是一种 hack,将图形管道滥用于非图形任务(好吧,图像过滤仍然与图形相关,但它并不真正需要硬件的专用光栅化功能,确实是一个经典的 GPGPU 任务)。这就是在 CUDA 之前 GPGPU 的做法……
  • @Abaab ...正确的(或“专业”)方法是使用实​​际的计算框架(CUDA/OpenCL),但因为我们'已经在 OpenGL 应用程序中,必要的互操作开销(如 “编程开销” 而不是 “运行时开销”)是不值得的。但幸运的是,计算着色器改变了这种情况,因为它们很好地集成到了 OpenGL 的其余部分,并且没有任何图形计算互操作开销。
  • @Abaab ...但话又说回来,实时计算机图形学中的许多常见和经典技术和算法可以被视为(或至少开始)作为破解任务的图形管道的黑客。 t应该首先解决。示例:为什么要使用一些奇怪的模板来渲染阴影体积的边界,而不仅仅是渲染体积本身?因为您的光栅化显卡不会渲染体积而是渲染表面。
  • 是的……显卡已经有点“凌乱”了。我一直希望从太阳发出巨大的随机 EM 爆炸,这样我们就可以清除所有凌乱、过时的东西并重新开始。
【解决方案2】:

你就是这样做的,绘制屏幕大小的四边形。您需要告诉 OpenGL 您要过滤屏幕的哪个部分,并且由于 OpenGL 是一个光栅化器,它需要对该部分进行光栅化,以便知道将什么输入片段着色器,因此是四边形。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多