2013-01-15 33 views
0

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

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

+3

你的问题很混乱。 “处理图片”是什么意思?你到底想做什么? –

回答

2

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

如果您想要编写一个涉及从左到右从上到下的图像扫描的算法,那么您需要明确地对所需的所有源像素进行采样输出。如果它是某个像素加上该像素的左边三个像素,那么您需要明确地将该像素加上左边的三个像素。示例算法将是Floyd-Steinberg抖动。

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

0

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