2017-09-05 88 views
1

我正在研究Android的绘画应用程序,允许用户使用他们的手指进行绘制。它使用OpenGL ES 2.0使用点精灵技术以及FBO进行快速渲染。我有一个问题将各个点精灵混合在一起,其中透明区域在FBO上正确呈现,但是当精灵重叠时,我可以看到在前一个精灵中呈现的透明区域。下面是它的外观现在:Point Sprite Alpha Blending

enter image description here

这是这种混合式:

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

如果我改变绘图颜色设置为白色或黑色的它完美的作品:

enter image description here

我也试过这种混合功能:

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_DST_ALPHA); 

导致此:

enter image description here

这几乎是完美的,而是以白色为主色调变暗应该。关于什么是正确的混合功能应该是实现这一点的任何想法?

注: 我的融合功能是如何工作的,采取的源和目标颜色的分数,并在我的情况下加在一起是很有意义的颜色会去对白色的想法。所以我想知道我想实现的功能只能用混合功能完成,还是需要其他功能?如有必要,我可以从片段着色器提供代码,但对我来说,它看起来不像片段问题。

回答

0

好吧,我发现了什么是错的。这是不是终究但片段着色器的混合功能..我有一些逻辑unpremultiply这是多余的,因为混合功能

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

已经处理了预乘图像中的像素。除此之外,我在片段着色器中有一些代码将图像转换为灰度,然后将灰度转换为透明,并且我的颜色乘法是错误的。

最后我结束了原来的混合功能不变(如上)。它正常工作,这里是我正在寻找的结果:

enter image description here