Ios OpenGL中的平滑颜色混合

Ios OpenGL中的平滑颜色混合,ios,opengl-es,blending,Ios,Opengl Es,Blending,当一个顶点的纹理与另一个顶点合并时,我尝试实现以下混合: 以下是我目前拥有的: 我已启用混合,并将混合功能指定为: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 我可以看到,在纸上应用程序中绘制的图像是由一个小圆圈组成的,该圆圈前后融合了相同的纹理,并对颜色和alpha产生了一些混合效果 如何达到预期效果 更新: 我认为正在发生的是,两个纹理的相交区域正在得到要修改的alpha通道(加法或其他一些自定义函数),而纹理没有在相交区域中绘制。

当一个顶点的纹理与另一个顶点合并时,我尝试实现以下混合:

以下是我目前拥有的:

我已启用混合,并将混合功能指定为:

    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
我可以看到,在纸上应用程序中绘制的图像是由一个小圆圈组成的,该圆圈前后融合了相同的纹理,并对颜色和alpha产生了一些混合效果

如何达到预期效果

更新:

我认为正在发生的是,两个纹理的相交区域正在得到要修改的alpha通道(加法或其他一些自定义函数),而纹理没有在相交区域中绘制。区域的其余部分绘制了纹理的其余部分。像这样:


不过,我不完全确定如何实现这个结果。

你不应该需要混合(而且它不会按照你想要的方式工作)

我认为只要你在屏幕空间中定义你的纹理坐标,它应该在两个独立的圆之间无缝连接

为此,不要使用通过顶点着色器的纹理坐标,只需使用片段的位置对纹理进行采样,加上或减去一些缩放:

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

如果您没有访问GLSL的权限,则可以使用模具缓冲区进行操作。只需将所有圆绘制到模具缓冲区中,将组合区域用作模具遮罩,然后绘制纹理的全屏四边形。颜色将无缝地沉积在所有圆圈的联合处。

您可以通过alpha的最大混合来实现此效果。或使用着色器(OpenGL ES 2.0)手动(混合):

结果:


嗯-我想我不完全理解解决方案:(.考虑到我正在创建一个支持openGL ES 1.1的iOS应用程序,我必须坚持使用模具缓冲区,因为我没有访问GLSL的权限。其次,我要做的是避免边缘显示为重叠,而是显示为平滑笔划,就像你画画一样。绘制纹理的全屏四边形如何解决这个问题是问题吗?似乎两个纹理的交集对交集区域中已经存在的像素数据具有相加或平均alpha,但在交集区域上没有绘制纹理。相反,纹理的剩余部分绘制在非交集区域。@kajham:模具缓冲区的目的是创建覆盖整个区域的遮罩,您希望对其进行纹理处理。当您使用模具缓冲区时,每次绘制形状时,它覆盖的每个像素都将在模具缓冲区中进行标记。然后,一旦您绘制了所有圆,模具缓冲区将包含所有圆的交点的轮廓。然后,您可以使用此轮廓来询问包含纹理的全屏四边形。绘制此四边形后,将只绘制模具覆盖的区域。非常感谢!这完全有意义。我能够使用模具缓冲区确保不在已绘制的区域上绘制。这有助于确保我没有重叠纹理。1我还没有弄清楚的是如何改变已经绘制的纹理的alpha。这在openGL ES 1.1中可能吗?在我看来,这是在纸质应用程序(上面的屏幕截图)中使用像素着色器完成的。
#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);
}