OpenGL着色器递归处理像素



我有一个OpenGL ES程序来处理图片。如果我处理当前像素,我需要使用之前的像素值。但它不是母图的像素值。它是先前处理过的像素值。

递归可以在片段着色器?

片段着色器没有固定的顺序,对全局状态没有副作用。所以问题是你认为前一个像素是什么。

如果你想写一个算法来做一些事情,比如,从左到右从上到下的图像扫描,那么你需要显式地采样你需要产生输出的所有源像素。如果它是一个特定的像素加上那个像素左边的3那么你需要显式地获取那个像素加上左边的3。Floyd-Steinberg抖动就是一个例子。

如果你谈论的是之前的帧,那么你可以通过使用渲染到纹理的乒乓缓冲来实现,这样你就可以在一个目的地和另一个目的地之间来回切换,这样你就可以将之前的帧视为输入纹理。示例应用程序可能是音乐可视化器通常做的事情,包括iTunes中的应用程序。

OpenGL ES 2.0规范不提供访问先前像素值的方法。

然而,一些gpu有厂商特定的扩展,允许访问当前帧缓冲区的片段值。我知道的是NV_shader_framebuffer_fetch(苹果有类似的扩展APPLE_shader_framebuffer_fetch)。在Tegra 2上,您可以从只读gl_LastFragColor变量中获取GLSL中片段的先前值。这个功能是用来自定义混合碎片着色器。但它只能在nVidia Tegra gpu上使用。

关于这个扩展的更多信息在这里:https://developer.nvidia.com/sites/default/files/akamai/mobile/files/tegra_gles2_development.pdf

最新更新