Photoshop 混合模式到没有着色器的 OpenGL ES

Posted

技术标签:

【中文标题】Photoshop 混合模式到没有着色器的 OpenGL ES【英文标题】:Photoshop blending mode to OpenGL ES without shaders 【发布时间】:2010-10-23 12:36:21 【问题描述】:

我需要在我的 OpenGL ES 1.1 代码中模仿 Photoshop 混合模式(“乘法”、“屏幕”等)(没有着色器)。

有一些文档介绍了如何使用 HLSL:

http://www.nathanm.com/photoshop-blending-math/ (archive) http://mouaif.wordpress.com/2009/01/05/photoshop-math-with-glsl-shaders/

我至少需要工作屏幕模式。

我可以看看固定管道上的任何实现吗?

【问题讨论】:

This 页面有很多关于每种混合模式如何工作的详细信息(附图表) 【参考方案1】:

您最好的起点是获取一份Red Book 并通读有关材料和混合模式的章节。它对“经典”OpenGL 混合函数的工作原理进行了非常全面和清晰的解释。

【讨论】:

【参考方案2】:

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

这些要求您的所有图像(纹理、渲染缓冲区)都在预乘颜色空间中。这通常是通过将所有像素值与 alpha 值相乘,然后将它们存储在纹理中来完成的。例如。在非预乘颜色空间中,完全透明的像素看起来像黑色。如果您不熟悉这种色彩空间,请花一两个小时在网上阅读有关它的信息。这是一个简洁而良好的概念,对于类似 Photoshop 的构图是必需的。

无论如何 - 一旦您拥有该格式的图像,您就可以使用以下方法启用 SCREEN:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

使用 OpenGL|ES 管道无法实现完整的 MULTIPLY 模式。如果你只使用完全不透明的像素,你可以使用:

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

但是,纹理和帧缓冲区中透明像素的结果将是错误的。

【讨论】:

【参考方案3】:

你应该试试这个:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

这看起来像是在 iPhone / OpenGL ES 上相乘

【讨论】:

感谢您的出色回答,看起来与 photoshop 中的乘法完全一样(: 这仅适用于纯色(不透明)图像。如果你有一张透明的图片,你只需要把它放在白色背景前,然后试试这个。【参考方案4】:

我发现使用这个:

glDepthFun( GL_LEQUAL);

都需要获得屏幕效果,至少它在我的项目中运行良好。

我不确定为什么会这样,但如果有人知道,请分享。

【讨论】:

以上是关于Photoshop 混合模式到没有着色器的 OpenGL ES的主要内容,如果未能解决你的问题,请参考以下文章

photoshop图象/模式。

为什么我在GLSL着色器中看到这些混合工件?

在 Photoshop 等 UIImageViews 上设置混合模式

Photoshop的混合模式

基于OpenCV实现Photoshop的17种图层混合

css 颜色着色 - 使用混合模式