OpenGL texture黑边问题

用OpenGL的粒子系统制作一个动态滤镜时发现纹理被绘制成下面这样的效果:

OpenGL texture黑边问题_第1张图片 而我的原图是可以看到花瓣的周围都黑了一圈


最后发现是混合模式的问题,之前采用的混合模式是

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);    

在改成下面的混合模式后,问题解决:

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

这里介绍一下这两种混合模式:

前一种是传统的alpha通道混合,这种模式下颜色和alpha值是分立的,rgb决定颜色,alpha决定..(英文是决定how solid it is 水平有限找不到准确的中文来表达)

在数学上表达式是:blend(source, dest) = (source.rgb * source.a) + (dest.rgb * (1 – source.a)).  要注意的是这种模式下,透明只跟alpha有关,跟rgb值无关,一个透明的颜色,不透明的颜色有相同的rgb值,只要alpha=0即可。

后一种是alpha预乘的混合(Premultiplied Alpha Blending),这种模式下rgb与alpha是联系在一起的,数学上的表达式是

blend(source, dest) = source.rgb + (dest.rgb * (1 – source.a))。在这种模式下,透明的表示是rgb值都为0.


这里贴出老外的解释

  • http://www.youtube.com/watch?v=dU9AXzCabiM
  • http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx






你可能感兴趣的:(OpenGL)