【问题标题】:Fastest way to draw [grayscale bitmap * colorValue] additively to screen on Android在 Android 上将 [灰度位图 * colorValue] 添加到屏幕的最快方法
【发布时间】:2011-09-12 21:08:47
【问题描述】:

我想要做的是多个具有 RGB 颜色值的灰度 alpha 位图,然后将生成的 RGB 位图添加到屏幕上,即在我想要的每个像素处:

p_new[r/g/b] = p_old[r/g/b] + colorValue[r/g/b] * grayscaleBitmapValue

我知道我可以构造一个中间 RGB 位图或纹理保持 (colorValue[r/g/b] * grayscaleBitmapValue),但如果可能的话,我宁愿避免这个浪费的步骤,因为每个 alpha 位图都会乘以相当多的不同颜色值的数量。

在 2D 或 OpenGL ES 中最快的方法是什么?

【问题讨论】:

    标签: android graphics opengl-es bitmap alphablending


    【解决方案1】:

    对于 2D 绘图,像这样设置您的 Paint 对象:

    paint.setColorFilter(
        new PorterDuffColorFilter(colorValue, PorterDuff.Mode.MULTIPLY));
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
    

    对于 OpenGL,您的片段着色器可能如下所示:

    varying vec2 texcoord;
    uniform sampler2D texture;
    uniform vec4 multColor;
    void main() {
        gl_FragColor = texture2D(texture, texcoord)*multColor;
    }
    

    ...并调用 glBlendFunc(GL_ONE,GL_ONE) 进行加法混合。

    【讨论】:

    • 我会测试一下。是否支持 Android 设备/硬件所需的所有传输模式和过滤器?它们是硬件加速的还是我自己实现它(我已经有 C/C++ 代码)更好(为了性能)?
    • 使用 Paint 对象绘图不会被硬件加速,但它可以在所有设备上工作。它将与您自己的 C/C++ 代码一样快,甚至更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多