18

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

有一些关于如何使用HLSL 执行此操作的文档:

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

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

4

4 回答 4

19

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

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

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

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

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

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

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

于 2009-05-03T23:29:22.843 回答
11

你应该试试这个:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

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

于 2010-04-01T19:52:58.907 回答
1

你最好的起点是拿起一本红皮书,通读关于材料和混合模式的章节。它对“经典”OpenGL 混合函数的工作原理进行了非常全面和清晰的解释。

于 2009-05-03T22:58:54.727 回答
1

我发现使用这个:

glDepthFun( GL_LEQUAL);

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

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

于 2011-03-24T17:01:30.283 回答