在OpenGL中使用某种过滤器的标准程序是什么?当我说过滤器时,我的意思是边缘检测。例如,假设我想将SSAO过滤器应用于FBO。我是否将FBO和深度缓冲区绑定到纹理,然后在绘制到单独的FBO时使用着色器时在相机前面绘制四边形?这就是我到目前为止所做的,但它有点烦人。我想知道大多数人使用的常见做法。我可能错过了一些非常大的东西。我正在使用LWJGL,所以如果重要的话就没有过剩。
答案 0 :(得分:2)
这正是常见做法。将场景绘制成一个或多个纹理(通过使用FBO)然后通过绘制纹理屏幕大小的四边形将这些纹理提供到过滤着色器中,将结果渲染到另一个纹理中(通过使用另一个或相同的FBO)或者在完成时直接进入默认(显示)帧缓冲。
如今(使用OpenGL 4.3硬件和驱动程序)您还有另一种选择。您还可以使用Compute Shader执行此类任务。这基本上是一种特殊的着色器,与所有其他着色器阶段相比,不是通常的图形管道的一部分,而是将通用GPGPU编程模型(如CUDA或OpenCL所知)暴露给OpenGL,同时能够使用所有OpenGL数据结构和功能,如图像加载/存储或纹理过滤。 (嗯,实际上也可以使用CUDA或OpenCL,它允许与OpenGL进行互操作,但这对于像图像过滤这样适合图形域的任务来说相当麻烦并且不值得。但是计算着色器的 0 学习和互操作开销使其成为可用的替代方案。)
答案 1 :(得分:1)
你就是这样做的,画出屏幕尺寸的四边形。您需要告诉OpenGL要筛选的屏幕部分,并且由于OpenGL是光栅化器,因此需要对该部分进行光栅化以便知道要将哪些内容输入到片段着色器中,因此需要四边形。