您可以在 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 中执行各种混合模式而无需获取帧缓冲区,但这需要渲染到多个纹理,然后使用混合纹理的着色器绘制一个四边形。与 framebuffer fetch 相比,这是一个额外的绘图调用,并且在共享内存和 tile 内存之间来回处理大量像素——这种方法要快得多。
最重要的是,没有说帧缓冲区数据必须是彩色的……如果您在 OpenGL ES 3.0 中使用多个渲染目标,您可以从一个渲染目标读取数据并使用它来计算您写入另一个的数据。(请注意,扩展在 GLSL 3.0 中的工作方式有所不同。上面的示例是 GLSL 1.0,您仍然可以在 ES3 上下文中使用它。请参阅规范以了解如何在#version 300 es
着色器中使用帧缓冲区获取。)