2012-07-17 81 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