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的主要内容,如果未能解决你的问题,请参考以下文章