2

我已经编写了自己的 ARGB 图像叠加代码,它经过优化以尽可能快地“可能”。然而,它并没有我希望的那么快。此外,此过程被多次调用并使用大量 CPU。

我想用 GPU 来做图像叠加。我认为这可能会极大地提高速度,同时最大限度地减少 CPU 使用率。

如何使用 GPU 覆盖图像?根据我的研究,我可以使用帧缓冲区来绘制屏幕。但是,我不是 100% 确定如何进行设置。本质上,我将位图从 java 传递到 JNI,然后获取需要将图像覆盖到的位图像素。要叠加的图像数量可以从 2 到 12 不等。这些是大图像。

UPDATE1:
到目前为止,这就是我所拥有的。我认为这是朝着正确方向迈出的一步。

GLuint arraybuffer;
glGenBuffers(GL_ARRAY_BUFFER, &arraybuffer);
glBindBuffer(GL_ARRAY_BUFFER, arraybuffer);

// draw into the array buffer the images
...

// read the buffer pixels from OpenGL
glReadPixels(0, 0, outputWidth, outputHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
4

1 回答 1

2

是的,您所要做的就是设置 OpenGL 上下文。这在 Android 文档中非常简单。没有秘密!

使用 OpenGL ES 显示图形

然后,设置你的帧缓冲区:

在此处查看此链接: Android OpenGL ES Framebuffer objects-rendering depth-buffer to texture

这里的所有功能都与 Android的GLES20中的功能几乎相同。有些方法的名称略有不同,但您可以肯定地找到所有方法。

当您到达绘图形状部分时。你必须编写你的顶点和片段着色器。顶点着色器可能与示例中的相同。除了您需要处理您的 VBO(vertexBuffer在 Android 的示例中)。您必须给出顶点(您正在绘制的坐标)和 UV(您的纹理的坐标),以便将纹理绘制到命运图像中(一个 VBO 用于顶点,另一个 VBO 用于 UV)。

片段着色器是您正在寻找的部分。它将由 GPU 为覆盖过程的每个像素执行。这可以通过以下方式完成:

叠加的片段着色器

precision mediump float;
uniform float opacity;          // if you want to apply opacity
uniform sampler2D myTexture;    // the image you are drawing overlay
uniform sampler2D myBackground; // the destiny texture ID
varying vec2 texturePoint;      // here is a coordinate (U,V) coming from the VBO
                                // this one must come from the vertex shader.

void main()
{
    vec2 texturePointBG = gl_FragCoord.xy / textureSize( myBackground, 0 );
    vec4 A = texture2D( myTexture, texturePoint );
    vec4 B = texture2D( myBackground, texturePointBG );

    // this is one of the most traditional formula for overlay
    // http://en.wikipedia.org/wiki/Blend_modes
    gl_FragColor = vec4(
        B.x < 0.5 ? ( 2.0 * B.x * A.x ) : ( 1.0 - 2.0 * ( 1.0 - B.x ) * ( 1.0 - A.x ) ),
        B.y < 0.5 ? ( 2.0 * B.y * A.y ) : ( 1.0 - 2.0 * ( 1.0 - B.y ) * ( 1.0 - A.y ) ),
        B.z < 0.5 ? ( 2.0 * B.z * A.z ) : ( 1.0 - 2.0 * ( 1.0 - B.z ) * ( 1.0 - A.z ) ),
        A.a
    );

    gl_FragColor.a *= opacity; // if you want!
}

您可以在 Android 文档中了解如何设置统一变量...这样您就可以提供一些额外的参数opacity,例如 .

于 2013-11-02T04:51:03.757 回答