1

我正在尝试将 GIMP 划分混合过滤器代码移植到 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

4

1 回答 1

1

问题出在我的代码中。我将初始值提取为lowp。

于 2012-08-02T08:53:03.773 回答