我正在尝试将GIMP divide blend过滤器代码移植到GLSL。我已经能够在各种其他混合模式中做到这一点,但由于某些原因,这就是不起作用。
下面是C gimp代码(基于SVG):
if (layA == 0.0 || inCa / layCa > inA / layA)
outCa = layA * inA + layCa * (1 - inA) + inCa * (1 - layA);
else
outCa = inCa * layA * layA / layCa + layCa * (1 - inA) + inCa * (1 - layA));
下面是移植后的代码:
mediump float r;
if (overlay.a == 0.0 || base.r / overlay.r > base.a / overlay.a)
r = overlay.a * base.a + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a);
else
r = base.r * overlay.a * overlay.a / overlay.r + overlay.r * (1.0 - base.a) + base.r * (1.0 - overlay.a);
我对每个通道执行此操作,然后使用vec4合并结果。
我的GLSL代码提供了与GIMP C代码完全不同的结果。除非我已经看了2个小时的代码,并且遗漏了一个错误,否则我认为这一定是一个操作数顺序错误。或者一些与C语言不同的GLSL的东西。
有什么想法吗?
更新:
外观:http://i.imgur.com/EjPhz.jpg应该是什么样子:http://i.imgur.com/bqbFT.png
发布于 2012-08-02 08:53:04
问题出在我的代码中。我将初始值提取为lowp。
https://stackoverflow.com/questions/11766303
复制