我需要在我的 OpenGL ES 1.1 代码(没有着色器)中模仿 Photoshop 混合模式(“乘法”、“屏幕”等)。
有一些关于如何使用HLSL 执行此操作的文档:
- http://www.nathanm.com/photoshop-blending-math/(存档)
- http://mouaif.wordpress.com/2009/01/05/photoshop-math-with-glsl-shaders/
我至少需要工作屏幕模式。
我可以查看固定管道上的任何实现吗?
我需要在我的 OpenGL ES 1.1 代码(没有着色器)中模仿 Photoshop 混合模式(“乘法”、“屏幕”等)。
有一些关于如何使用HLSL 执行此操作的文档:
我至少需要工作屏幕模式。
我可以查看固定管道上的任何实现吗?
大多数 Photoshop 混合模式都基于 Porter-Duff 混合模式。
这些要求您的所有图像(纹理、渲染缓冲区)都在预乘颜色空间中。这通常是通过将所有像素值与 alpha 值相乘,然后将它们存储到纹理中来完成的。例如,一个完全透明的像素在非预乘颜色空间中看起来像黑色。如果您不熟悉这种色彩空间,请花一两个小时在网上阅读有关它的信息。这是一个简洁而良好的概念,对于类似 Photoshop 的构图是必需的。
无论如何-一旦您拥有该格式的图像,您就可以使用以下方法启用 SCREEN:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)
OpenGL|ES 管道无法实现完整的 MULTIPLY 模式。如果您只使用完全不透明的像素,您可以使用以下方法伪造它:
glBlendFunc(GL_ZERO, GL_SRC_COLOR)
但是,纹理和帧缓冲区中透明像素的结果将是错误的。
你应该试试这个:
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)
这看起来像在 iPhone / OpenGL ES 上相乘
你最好的起点是拿起一本红皮书,通读关于材料和混合模式的章节。它对“经典”OpenGL 混合函数的工作原理进行了非常全面和清晰的解释。
我发现使用这个:
glDepthFun( GL_LEQUAL);
都需要获得屏幕效果,至少它在我的项目中运行良好。
我不确定为什么会这样,但如果有人知道请分享。