2012-08-01 69 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。