你可以在iOS设备上获取关于帧缓冲区中当前片段颜色的信息。自iOS 6.0以来,可编程混合已经通过
EXT_shader_framebuffer_fetch扩展在所有支持该版本的设备上提供。只需在片段着色器中声明该扩展(通过在顶部放置指令
#extension GL_EXT_shader_framebuffer_fetch : require
),然后你就可以在
gl_LastFragData[0]
中获取当前片段数据。
然后,是的,你可以在片段着色器中使用它来实现任何你喜欢的混合模式,包括所有Photoshop样式的混合模式。以下是一个差异混合的示例:
// compute srcColor earlier in shader or get from varying
gl_FragColor = abs(srcColor - gl_LastFragData[0]);
你可以使用这个扩展来实现不混合两种颜色的特效。例如,你可以将整个场景转换为灰度图像——正常渲染场景,然后使用一个着色器绘制四边形,该着色器读取最后一个片段数据并进行处理:
mediump float luminance = dot(gl_LastFragData[0], vec4(0.30,0.59,0.11,0.0));
gl_FragColor = vec4(luminance, luminance, luminance, 1.0);
您可以在GLSL中使用各种混合模式而无需进行帧缓冲提取,但这需要渲染到多个纹理,然后使用混合纹理的着色器绘制四边形。与帧缓冲提取相比,这是一个额外的绘制调用,并且需要在共享内存和瓷砖内存之间来回传输像素 - 这种方法更快。
此外,还可以说帧缓冲数据不一定是颜色...如果您在OpenGL ES 3.0中使用多个渲染目标,则可以从其中一个读取数据并将其用于计算写入另一个的数据。(请注意,扩展在GLSL 3.0中的工作方式有所不同。上述示例是GLSL 1.0,您仍然可以在ES3上下文中使用它。请参见
spec以了解如何在
#version 300 es
着色器中使用帧缓冲提取。)