1

我正在开发一款适用于 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);

结果是:

在此处输入图像描述

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

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

4

1 回答 1

0

好的,所以我发现了问题所在。毕竟它不是混合功能,而是片段着色器。我有一些逻辑来取消预乘像素,这作为混合功能是多余的

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

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

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

在此处输入图像描述

于 2017-09-07T10:00:35.240 回答