如何使具有一定RGB范围的像素点透明

How to make pixels with a certain RGB range transparent

我在 java 字节数组中有一个固定大小 frame buffer(从 YUV 有效转换而来的 1200x720 RGBA)。

我想将某种颜色的阴影(在我的例子中是白色,不管它的 alpha 值如何)设置为完全透明。

目前,我正在通过 CPU 遍历字节数组并将像素置零(如果 RGB > 0xC8)来执行此操作。这有点管用,但在直播中这样做显然非常慢(>1 秒/帧)。

我一直在研究通过 Android 上的 GPU/OpenGL 执行此操作的方法,我看到提到了 Alpha 测试、混合和颜色键控。似乎 alpha 测试在这里没有用,因为它依赖于 alpha 信息而不是 RGB 的值。

知道如何使用 OpenGL/java 在 Android 上执行此操作吗?

您应该创建一个自定义渲染脚本来转换这些像素,您也可以使用它从 yuv 转换,这样您只处理缓冲区中的像素一次

It seems the alpha test is not useful here

alpha 测试的逻辑在片段着色器中实现,因此与其测试 alpha,不如更改测试以实现对 RGB 值的检查。这里的技术是通用的并且 100% 灵活。您正在寻找的基础操作是片段着色器,它在颜色键匹配时触发 discard 操作。

或者,您可以使用相同的条件检查,而不是调用 discard,只需将输出颜色设置为 vec4(0.0),并使用混合来避免修改该片段的帧缓冲区。总的来说,我希望这会更有效率; discard 往往会产生奇怪的性能副作用。