OpenGL texture黑边问题
用OpenGL的粒子系统制作一个动态滤镜时发现纹理被绘制成下面这样的效果:
而我的原图是
可以看到花瓣的周围都黑了一圈
最后发现是混合模式的问题,之前采用的混合模式是
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
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。