2012-09-19 101 views
1

我打算做一个简单的绘图工具,它支持Photoshop中的多个图层和所有混合模式。Photoshop“混合模式”与OpenGL

我正在考虑在GPU上进行混合(将每个图层放入一个纹理并绘制两个三角形来渲染每个图层)。但我不确定,如果可以通过OpenGL的blendFunc/blendEquation等实现所有blend modes

另一个选择是将所有纹理+混合模式标志传递给一个片段着色器,并按照我的意愿混合它们,但添加/删除某些图层(sampler2D)时,我将不得不重新编译FS。

那么你怎么看?可能吗?有没有更好的方法来使用GPU进行混合?所以我现在应该关心它,还是应该全部使用CPU并关心未来的增强功能?

顺便说一句。这将是使用WebGL的JavaScript程序,但我认为这并不重要。

+2

*如果可以用OpenGL的blendFunc/blendEquation等实现所有的混合模式*不可能实现所有的混合模式。硬件帧缓冲混合在它可以执行的操作中受到一定的限制。 – Tim

+0

谢谢蒂姆,我认为有些混合模式是不可能的,但我不确定。所以我只会在CPU上实现。 –

+1

如果有帮助,我的开源框架在这里:https://github.com/BradLarson/GPUImage有很多这些混合模式作为OpenGL ES着色器,它们应该很容易移植到WebGL。我将Adobe自己的参考规范用于混合计算,因此它们应该与Photoshop的行为紧密匹配。只需查看各种混合类实现的顶部即可查看我使用的着色器代码。 –

回答

1

当然可以。但它需要在共享者中完成。

加载两张图片(实际上可以更多),渲染三角形。但是,只需使用着色器探测两个纹理并将这些值与依赖于当前混合模式(作为统一提供)的方程混合即可。

PS不要忘记关闭mipmap和过滤。

+0

是的,我知道,但有些事情我不喜欢那个解决方案。我将不得不为每一层设置不同的“采样器”。添加图层时,我必须制作新的FS程序。当两层有不同的尺寸时可能会有问题。这就是为什么我想用“多个图纸”来实现framebuffer。 –

+0

好的。所以使用多通解决方案。渲染到纹理而不是渲染到渲染缓冲区。当你完成了所有图层的渲染,然后渲染为普通纹理。这样,无论有多少层,你只需要一个FS。 –

+0

是的,但有一个问题 - 我希望能够使用Photoshop中的所有混合模式将所有这些纹理混合在一起。 –