Point Sprite Alpha Blending

时间:2017-09-05 19:17:16

标签: android opengl-es alphablending point-sprites

我正在开发一款适用于Android的绘图应用,允许用户使用他们的手指进行绘制。它使用OpenGL ES 2.0使用点精灵技术和FBO进行快速渲染。我有一个问题是将各个点精灵混合在一起,其中透明区域在FBO上正确渲染,但是当精灵重叠时,我可以看到在前一个精灵上渲染的透明区域。以下是目前的情况:

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

这几乎是完美的,但相反白色,主色应该变暗。关于正确混合功能应该达到什么目的的任何想法?

注意:的 我已经知道混合功能如何通过获取源和目标颜色的分数来实现,在我的情况下将它们加在一起,这样就可以将颜色变为白色。所以我想知道我想要实现的只能使用混合功能,还是需要其他东西呢?如果需要,我可以提供片段着色器中的代码,但对我来说它看起来不像片段问题。

1 个答案:

答案 0 :(得分:0)

好的,所以我发现了什么是错的。除了片段着色器之外,它不是混合函数。我有一些逻辑可以无差别地将多余的像素作为混合函数

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

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

最后,我最终保持原始混合功能不变(如上所述)。它运作正常,这是我正在寻找的结果:

enter image description here