GPUImage for Android 如何使用这个 glsl文件

server/2024/12/18 9:56:15/

使用 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 的 getFromColorgetToColor 的实现。

    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 = 0private var dotsLocation: Int = 0private var centerLocation: Int = 0override fun onInit() {super.onInit()// 获取 Uniform 参数的位置progressLocation = GLES20.glGetUniformLocation(program, "progress")dotsLocation = GLES20.glGetUniformLocation(program, "dots")centerLocation = GLES20.glGetUniformLocation(program, "center")}override fun onInitialized() {super.onInitialized()// 初始化 Uniform 参数setProgress(0f)setDots(20f)setCenter(floatArrayOf(0.5f, 0.5f))}fun setProgress(progress: Float) {setFloat(progressLocation, progress)}fun setDots(dots: Float) {setFloat(dotsLocation, dots)}fun setCenter(center: FloatArray) {setFloatVec2(centerLocation, center)}private fun loadShaderFromAssets(context: Context): String {return context.assets.open("shaders/transition.glsl").bufferedReader().use { it.readText() }}
}

2.3 应用滤镜并显示效果

将滤镜应用到 GPUImageViewGPUImage 上:

val gpuImageView = findViewById<GPUImageView>(R.id.gpuImageView)// 初始化 GPUImage 和自定义滤镜
val gpuImage = GPUImage(this)
val customFilter = CustomTransitionFilter(this)// 加载两张图片作为纹理
gpuImage.setImage(BitmapFactory.decodeResource(resources, R.drawable.image1))
customFilter.setProgress(0f)  // 起始过渡进度// 应用自定义滤镜
gpuImage.setFilter(customFilter)// 动态更新过渡进度
val animator = ValueAnimator.ofFloat(0f, 1f).apply {duration = 2000addUpdateListener { animation ->val progress = animation.animatedValue as FloatcustomFilter.setProgress(progress)gpuImageView.requestRender() // 刷新视图}
}
animator.start()

3. 完整布局文件

确保你在 XML 文件中定义了 GPUImageView

<com.example.gpuimage.GPUImageViewandroid:id="@+id/gpuImageView"android:layout_width="match_parent"android:layout_height="match_parent" />

4. 动态参数设置

  • 如果需要动态调整 dotscenter 参数,可以通过暴露方法 setDots()setCenter() 实现。
  • 例如:
    customFilter.setDots(30f)
    customFilter.setCenter(floatArrayOf(0.3f, 0.7f))
    

总结

以上步骤说明了如何在 GPUImage 中加载并使用你的自定义 GLSL 文件。核心流程包括:

  1. 准备兼容的 GLSL 文件。
  2. 使用 GPUImage 创建自定义滤镜。
  3. 通过动画动态调整 progress 等 Uniform 参数,完成过渡效果。

如果需要进一步扩展或调试代码,请随时告诉我!


http://www.ppmy.cn/server/151139.html

相关文章

电气CAD制图软件概述及主要电气CAD软件介绍

一、电气CAD制图软件概述 电气CAD制图软件&#xff0c;即电气计算机辅助设计软件&#xff0c;是一种用于电气系统设计的专业软件。这类软件能够通过计算机帮助电气工程师完成从简单的电路设计到复杂的电气系统设计等各种任务。常用的电气CAD制图软件主要有AutoCAD, EPLAN,SEE E…

8、笔记本品牌分类介绍:LG - 计算机硬件品牌系列文章

LG笔记本品牌以其高性能和先进技术而闻名&#xff0c;‌提供多种型号以满足不同用户的需求。‌ LG笔记本产品线包括多种类型&#xff0c;‌以满足不同用户的需求。‌其中&#xff0c;‌LG Gram Pro系列以其超薄设计和高性能配置受到关注。‌该系列笔记本采用16:10的OLED显示屏&…

一二三物联网 | 工业技改盛事,共绘产业升级新篇章

虽已初冬轻寒&#xff0c;却似春意融融。2024年12月3日至4日&#xff0c;一场聚焦技改提级、促进产业升级的盛会——山东省“技能兴鲁”职业技能大赛第二届技改提级职业技能竞赛暨德州市工业企业技改供需对接会在德州市成功举办。会上隆重举行了德州市技改入企公益诊断活动启动…

Spring web应⽤分层(模块结构)

大家好我是小帅&#xff0c;今天我们来学习web开发的应用分层 文章目录 1.应⽤分层是什么2.如何分层(三层架构)3 .应⽤分层的好处 1.应⽤分层是什么 ⽬前我们程序的代码有点"杂乱", 然⽽当前只是"⼀点点功能"的开发.代码会更加的杂乱⽆章&#xff0c;这个…

《外国服务区加油站模型:功能与美观的完美结合 caotu66.com》

这个外国服务区加油站模型在设计上独具特色&#xff0c;兼具实用性和美观性。 从整体布局来看&#xff0c;加油站位于服务区的显眼位置。加油站的顶棚采用了现代风格的设计&#xff0c;顶棚的颜色主要是黄色和蓝色&#xff0c;色彩鲜明且具有辨识度。顶棚下方有多个加油柱&…

文件上传—阿里云OSS对象存储

目录 一、OSS简介 二、OSS基本使用 1. 注册账号 2. 基本配置 (1) 开通OSS (2) 创建存储空间 (3) 修改权限 (4) 配置完成&#xff0c;上传一张图片&#xff0c;检验是否成功。 (5) 创建AccessKey 三、Java项目集成OSS 1. 导入依赖 2. Result.java代码&#xff1a; …

如何评估呼叫中心大模型呼入机器人的使用效果?(转)

如何评估呼叫中心大模型呼入机器人的使用效果&#xff1f;(转) 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 评估呼叫中心大模型呼入机器人的使用效果是一个多维度、综合性的任务&#xff0c;需要综合考虑多…

qt对话框小结

qt有一些封装好的对话框 现在小结一下 QMessageBox: 用于显示简单的消息。 QFileDialog: 用于文件和目录的选择。 QColorDialog: 用于颜色选择。 QFontDialog: 用于字体选择。 QInputDialog: 用于获取用户输入。 QProgressDialog: 用于显示操作进度。 QPrintDialog: 用…