使用 GPUImage for Android 加载和应用自定义 GLSL 文件(例如你的 transition
文件)的方法如下:
1. 准备 GLSL 文件
确保你的 GLSL 文件已经调整为 GPUImage 的格式。对于你的自定义 GLSL 文件,GPUImage 期望包含以下结构:
-
顶点着色器:
GPUImage 默认使用标准顶点着色器,你无需更改。内容如下:attribute vec4 position; attribute vec4 inputTextureCoordinate; varying vec2 textureCoordinate; void main() { gl_Position = position; textureCoordinate = inputTextureCoordinate.xy; }
-
片段着色器:
调整你的 GLSL 文件以适配 GPUImage 的getFromColor
和getToColor
的实现。precision mediump float; varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; // 当前纹理 uniform sampler2D inputImageTexture2; // 下一个纹理 uniform float progress; // 过渡进度 uniform float dots; // 参数 dots uniform vec2 center; // 参数中心点 const float SQRT_2 = 1.414213562373; vec4 getFromColor(vec2 uv) { return texture2D(inputImageTexture, uv); } vec4 getToColor(vec2 uv) { return texture2D(inputImageTexture2, uv); } vec4 transition(vec2 uv) { bool nextImage = distance(fract(uv * dots), vec2(0.5, 0.5)) < (progress / distance(uv, center)); return nextImage ? getToColor(uv) : getFromColor(uv); } void main() { gl_FragColor = transition(textureCoordinate); }
将片段着色器保存为一个 .glsl
文件,例如:assets/shaders/transition.glsl
。
2. 在 GPUImage 中使用自定义着色器
2.1 添加 GPUImage 库
在项目的 build.gradle
文件中添加 GPUImage 的依赖:
implementation 'jp.co.cyberagent.android:gpuimage:2.1.0'
2.2 创建自定义滤镜
创建一个类来加载自定义片段着色器:
class CustomTransitionFilter(context: Context) : GPUImageFilter(NO_FILTER_VERTEX_SHADER, loadShaderFromAssets(context)) {
private var progressLocation: Int = 0
private var dotsLocation: Int = 0<