点精灵 Alpha 混合

Point Sprite Alpha Blending

我正在为 Android 开发一款允许用户使用手指绘图的绘画应用程序。它是使用 OpenGL ES 2.0 使用点精灵技术以及用于快速渲染的 FBO 构建的。我在将各个点精灵混合在一起时遇到问题,其中透明区域在 FBO 上正确呈现,但是当精灵重叠时,我可以看到在前一个精灵上呈现的透明区域。这是目前的样子:

这是混合方程式:

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

如果我将绘图颜色更改为白色或黑色,效果会很好:

我也试过这个混合功能:

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

结果是:

这几乎是完美的,但主色应该变暗而不是白色。关于正确的混合函数应该是什么来实现这一点有什么想法吗?

注: 我知道混合功能是如何工作的,方法是取源颜色和目标颜色的分数,在我的例子中将它们加在一起,这样颜色会变成白色是有道理的。所以我想知道我想实现的目标是否只能通过混合功能来完成,还是我需要其他东西?如有必要,我可以提供来自片段着色器的代码,但对我来说这不像是片段问题。

好的,我发现出了什么问题。毕竟它不是混合函数,而是片段着色器。我有一些逻辑来取消预乘作为混合函数冗余的像素

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

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

最后,我最终保留了原来的混合函数不变(如上所述)。它工作正常,这是我正在寻找的结果: