我有一个 OpenGL ES 程序来处理图片。如果我处理当前像素,我需要使用以前的像素值。但不是主图的像素值。它是已处理的先前像素值。
递归可以在片段着色器中进行吗?
片段着色器的应用顺序没有固定,对全局状态没有副作用。所以问题是你认为什么是前一个像素。
如果您要编写一种算法,该算法涉及从左到右的从上到下的图像扫描,那么您需要明确地对生成输出所需的所有源像素进行采样。如果它是某个像素加上该像素左侧的三个,那么您需要明确获取该像素加上左侧的三个。一个示例算法是 Floyd-Steinberg 抖动。
如果您在谈论之前的帧,那么您可以通过乒乓缓冲来实现,您可以使用渲染到纹理并在一个目的地和另一个目的地之间来回切换,以便您可以将前一帧视为输入纹理。一个示例应用程序可能是音乐可视化器通常做的事情,包括 iTunes 中的应用程序。
OpenGL ES 2.0 规范没有提供访问先前像素值的方法。
但是,一些 GPU 具有特定于供应商的扩展,允许访问帧缓冲区的当前片段值。我知道的是NV_shader_framebuffer_fetch
(Apple 有类似的扩展名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