是的,您所要做的就是设置 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
,例如 .