1. GPUImageTwoInputFilter 核心机制解析
在Android美颜相机开发中,GPUImageTwoInputFilter扮演着关键角色。这个特殊的滤镜类允许同时处理两个输入纹理,为复杂图像效果提供了基础支持。与单输入滤镜不同,双输入滤镜的核心在于纹理混合机制——通过OpenGL ES的帧缓冲对象(FBO)和多重纹理采样,实现两个图像源的像素级合成。
1.1 双纹理输入原理
GPUImageTwoInputFilter继承自GPUImageFilter,通过重写onInit()方法额外创建了一个纹理单元。关键代码片段如下:
java复制@Override
public void onInit() {
super.onInit();
secondTextureCoordinateAttribute = GLES20.glGetAttribLocation(getProgram(), "inputTextureCoordinate2");
secondInputTextureUniform = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture2");
}
实际运行时,第一个输入纹理绑定到GL_TEXTURE0,第二个输入纹理绑定到GL_TEXTURE1。在片段着色器中通过采样器2D变量同时访问两个纹理:
glsl复制uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
1.2 纹理混合策略
双输入滤镜的核心价值在于混合算法。常见的混合模式包括:
- 叠加混合(Blend):通过mix()函数按比例混合
- 遮罩混合(Mask):使用第二个纹理的alpha通道控制显示
- 差值混合(Difference):abs(texture1 - texture2)
- 乘法混合(Multiply):texture1 * texture2
以下是一个典型的混合着色器示例:
glsl复制void main() {
vec4 textureColor = texture2D(inputImageTex
