2012-07-17 129 views
4

我想實現下面的混合:平滑的色彩混合

Image drawn in Paper iPad App by FiftyThree

這是我目前有:

enter image description here

我已經啓用混合和我指定的混合功能:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

我可以看到紙應用程序中繪製的圖像由一個小圓圈組成,該小圓圈在前後具有相同的紋理並對顏色和阿爾法具有一些混合效果。

我該如何達到預期效果?

UPDATE:

我想的情況是,兩個紋理的相交區域越來越alpha通道要被修改(無論添加劑或其他自定義功能),而紋理不被繪製在相交區域。該區域的其餘部分繪製了其餘的紋理。像這樣:

enter image description here

我並不完全確定如何實現這一結果,雖然。

回答

1

你不應該爲此混合(並且它不會按照你想要的方式工作)。

我覺得只要你定義的屏幕空間的紋理座標,它應該是兩個獨立的圓之間的無縫。如果你不這樣做

float texcoord = gl_FragCoord/vec2(xresolution_in_pixels, yresolution_in_pixels);` 
gl_FragColor = glTexture2D(papertexture, texcoord); 

要做到這一點,而不是使用一個紋理通過頂點着色器座標過去了,只是用片段的位置來樣紋理,加上或減去一些縮放有權訪問GLSL,您可以使用模板緩衝區來執行某些操作。只需將所有圓圈繪製到模板緩衝區中,將組合區域用作模板蒙版,然後繪製全屏四邊形紋理。顏色將無縫存放在所有圈子的聯合處。

+0

嗯 - 我不認爲我完全理解解決方案:(假設我要創建。 iOS應用,以支持OpenGL ES 1.1,我不得不堅持模板緩衝,因爲我沒有獲得GLSL。 其次,我想要做的是避免顯示爲重疊的邊緣,但相反,如果你畫的話,它會表現得像一個平滑的中風,如何繪製全屏四邊形的紋理來解決這個問題? – kajham 2012-07-18 00:17:27

+0

它似乎是兩個紋理的交集具有已添加到相交區域中的像素數據的加法或平均值,但在相交區域上沒有繪製紋理。相反,剩餘的紋理繪製在不相交的區域。 – kajham 2012-07-18 01:12:20

+1

@kajham:模板緩衝區的目的是在希望紋理化的整個區域上創建一個遮罩。當您使用模板緩衝區時,每次繪製一個形狀時,其覆蓋的每個像素都將在模板緩衝區中進行標記。然後,一旦你繪製了所有的圓圈,模板緩衝區將包含所有圓圈交集的輪廓。然後,您可以使用此輪廓來遮罩包含紋理的全屏四邊形。繪製完這個四邊形後,只會繪製模板覆蓋的區域。 – Tim 2012-07-18 04:13:20

1

您可以使用alpha的最大混合來達到此效果。或手動(混合關閉)與着色器(OpenGL ES 2.0的):

#extension GL_EXT_shader_framebuffer_fetch : require 
precision highp float; 

uniform sampler2D texture; 
uniform vec4  color; 

varying vec2 texCoords; 

void main() { 
    float res_a =gl_LastFragData[0].a; 
    float a = texture2D(texture, texCoords).a; 
    res_a = max(a, res_a); 
    gl_FragColor = vec4(color.rgb * res_a, res_a); 
} 

結果:

enter image description here