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

时间:2009-05-03 22:47:07

标签: opengl-es photoshop

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

有一些文档介绍如何使用 HLSL执行此操作

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

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

4 个答案:

答案 0 :(得分:15)

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

这些要求所有图像(纹理,渲染缓冲区)都在预乘颜色空间中。这通常通过在将所有像素值存储在纹理中之前将其与alpha值相乘来完成。例如。完全透明的像素在非预乘色彩空间中看起来像黑色。如果你不熟悉这个色彩空间花一两个小时在网上阅读它。这是一个整洁而好的概念,也是类似Photoshop的组合所必需的。

无论如何 - 一旦您以该格式获得图像,您可以使用以下方式启用屏幕:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

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

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

纹理和帧缓冲区中透明像素的结果虽然错误。

答案 1 :(得分:10)

你应该试试这个:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

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

答案 2 :(得分:1)

您最好的起点是拿起Red Book的副本,并阅读有关材料和混合模式的章节。它对“经典”OpenGL混合函数的工作原理有一个非常全面和清晰的解释。

答案 3 :(得分:1)

我发现使用这个:

glDepthFun( GL_LEQUAL);

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

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