OpenGL Shader递归过程像素

时间:2013-01-15 02:28:31

标签: android opengl-es shader

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

递归是否可以在片段着色器中完成?

2 个答案:

答案 0 :(得分:2)

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

如果您正在寻找一种能够执行某些操作的算法,比如从左到右的从上到下的图像扫描,那么您需要明确地对所需的所有源像素进行采样输出。如果它是某个像素加上该像素的三个像素,那么你需要明确地获取该像素加上左边的三个像素。一个示例算法是Floyd-Steinberg抖动。

如果您正在谈论之前的帧,那么您可以通过乒乓缓冲实现这一目标,从而使用渲染到纹理并在一个目标和另一个目的地之间来回切换,以便您可以将前一帧视为输入质地。一个示例应用程序可能是音乐直观设备通常会做的事情,包括iTunes中的那个。

答案 1 :(得分:0)

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