【问题标题】:How to make pixels with a certain RGB range transparent如何使具有一定RGB范围的像素透明
【发布时间】:2018-10-16 04:25:06
【问题描述】:

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

我想将某种颜色的阴影(在我的情况下为白色,无论其 alpha 值如何)设置为完全透明。

目前,如果RGB > 0xC8,我通过遍历字节数组并将像素归零来通过 CPU 执行此操作。这在一定程度上可行,但在实时流中这样做显然非常慢(> 1 秒/帧)。

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

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

【问题讨论】:

    标签: java android opengl-es alpha renderscript


    【解决方案1】:

    看来 alpha 测试在这里没有用处

    Alpha 测试的逻辑在片段着色器中实现,因此无需测试 Alpha,只需更改测试以实现对 RGB 值的检查。这里的技术是通用的并且 100% 灵活。您正在寻找的底层操作是片段着色器,它会在颜色键匹配时触发 discard 操作。

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

    【讨论】:

    • 知道了。使用来自stackoverflow.com/questions/12130790/…的代码
    • "并使用混合来避免修改.." 知道从哪里开始吗?我可以通过输出 vec4(0.0) 来隐藏像素,只是不确定如何在此处使用混合
    • 混合通常使用源 alpha 来确定计算的片段颜色(源)与当前帧缓冲区(dst)的权重。标准混合是(SRC_COLOR * SRC_ALPHA) + (DST_COLOR * (1 - SRC_ALPHA)),因此如果您将片段 alpha 设置为零,那么您应该只发出目标颜色(假设启用了混合)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2017-08-01
      相关资源
      最近更新 更多