2012-08-01 43 views
1

我正在尝试将GIMP divide blend filter代码移植到GLSL。我已经能够为各种其他混合模式做到这一点,但由于某种原因,这只是不工作。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

+0

如果使用'highp float',你会得到不同的答案吗? – 2012-08-01 21:32:55

+0

不,这是一样的。 – 2012-08-01 21:35:17

+0

图片胜过千言万语,你能发布预期结果和你得到什么吗? – rotoglup 2012-08-01 21:59:57

回答

1

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