我需要在我的OpenGL ES 1.1代码(不带着色器)中模仿Photoshop混合模式(“乘法”,“屏幕”等)。
有一些文档介绍如何使用 HLSL执行此操作:
我至少需要工作屏幕模式。
我可以看一下固定管道上的任何实现吗?
答案 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);
都需要获得屏幕效果,至少它在我的项目中效果很好。
我不确定为什么会这样,但如果有人知道请分享。