Photoshop混合模式到OpenGL ES的转换,无需使用着色器

18

1
这个页面非常详细地介绍了每种混合模式的工作原理(附有图表)。 - bobobobo
4个回答

20

大多数 Photoshop 的混合模式都基于 Porter-Duff 混合模式。

这要求您的所有图像(纹理、渲染缓冲区)都在预乘颜色空间中。通常,这是通过在将它们存储在纹理之前将所有像素值乘以 alpha 值来完成的。例如,完全透明的像素在非预乘颜色空间中看起来会是黑色。如果您对此颜色空间不熟悉,请花一两个小时在网络上阅读相关内容。这是一个很好和重要的概念,也是类似于 Photoshop 合成所需的。

无论如何 - 一旦您的图像达到了这种格式,您可以使用以下代码启用屏幕混合模式:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

OpenGL|ES管线不支持完全的MULTIPLY模式。如果你只处理完全不透明的像素,可以通过以下方法来模拟:

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

即使您的纹理和帧缓冲中都有透明像素,结果也将不正确。


11

你应该尝试这个:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

在 iPhone / OpenGL ES 上看起来像是乘法。


1
感谢您的出色回答,看起来就像Photoshop中的乘法(: - Yetispapa
1
只有当图像是纯色(不透明)时,此方法才有效。如果您的图像具有透明度,则只需将其放在白色背景前面,然后尝试此方法。 - Peter

1
我发现使用以下代码就可以实现屏幕效果,至少在我的项目中效果很好:
glDepthFun(GL_LEQUAL);
我不确定为什么这样可以实现效果,如果有人知道,请分享一下。

1

如果您想开启编程之旅,最好的方法是先购买《红皮书》,并仔细阅读其中关于材质和混合模式的章节。该书提供了非常全面和清晰的解释,介绍了“经典”OpenGL混合功能的工作原理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接