当前位置: 首页 > news >正文

渐变过渡的相册(shader)

相册是一个大家比较熟悉的场景,一般我们是实现的都是那种跑马灯式的轮播相册,这里异名给大家提供一个利用shader实现图片渐变过渡的相册思路

demo

实现思路

拆分一下功能点,主要有两个:一个是实现图片的渐变,一个是实现图片的切换

图片的渐变可以理解为随着时间的变化,在某一方向上的局部的像素点的透明度变化。demo中实现的效果是一个水平滚轴式的切换,水平平移在数学上的实现其实就是一个简单的关于时间变化的垂直直线x = time,我们只需要把每个像素点的x坐标和这个垂直直线做比较,在左边的透明度设为0,在右边的透明度设为1,然后再通过平滑取样就能够有渐变过渡的效果:

void main () {
  vec4 color = vec4(1, 1, 1, 1);
  color *= texture(texture, v_uv0);
  color *= v_color;

  #if USE_TRAMSFORM
    color.a = smoothstep(0.0, u_fade_radius, u_fade_radius + v_uv0.x - u_time);
  #endif

  gl_FragColor = color;
}

实现了图片的渐变,接下来就是图片的切换,所有的图片其实都在一个队列当中,我们在渐变完成之后只需要把最上面的的那张图片放到最下面,就能够让这个相册一直在循环播放,在这个过程中我们再加上一些图片的状态处理就能够是实现demo中的渐变相册效果了

isTransforming: boolean = false;
bgTramsform() {
  if (this.isTransforming) return;
  this.isTransforming = true;

  let time = 0.0;
  let node = this.switchNodeList[0];
  let material = node.getComponent(cc.Sprite).getMaterial(0);
  material.setProperty('u_fade_radius', this.fadeRadius);
  material.setProperty('u_time', time);
  material.define('USE_TRAMSFORM', true, 0, true);

  let timer = setInterval(() => {
    time += 0.03;
    material.setProperty('u_time', time);
    if (time > 1.0 + this.fadeRadius) {
      this.switchNodeList.shift();
      this.switchNodeList.push(node);
      this.switchNodeList.forEach((node, idx) => node.zIndex = this.switchNodeList.length - idx)
      material.define('USE_TRAMSFORM', false, 0, true);
      this.isTransforming = false;
      timer && clearInterval(timer);
    }
  }, 30);
}
demo

效果预览

源码获取请点击查看原文????

推荐阅读:

音视频面试基础题

移动端技术交流喊你入群啦~~~

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~


相关文章:

  • 【C++11新特性】 C++11 智能指针之shared_ptr
  • 【C++11新特性】 C++11智能指针之weak_ptr
  • 5 个 IDEA 必备插件,让效率成为习惯
  • 【C++11新特性】 C++11智能指针之 unique_ptr
  • 关于JVM,你必须知道的那些玩意儿
  • OpenGL ES 实现动态(水波纹)涟漪效果
  • 盘点Android常用Hook技术
  • 推荐一款强大的 Android OpenGL ES 调试工具
  • MediaCodec 解码后数据对齐导致的绿边问题
  • JNI编程如何巧妙获取JNIEnv
  • 最新 Android 面试点梳理,我收藏了你呢?
  • 三年Android开发,跳槽腾讯音乐,历经三面终获Offer,定级T2-1(超全面试题+学习经验总结)...
  • 「Android音视频编码那点破事」序章
  • Android短文:理解插值器和估值器
  • 用户调研:音视频方面的书籍,哪些内容才是你需要的?
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android 控件背景颜色处理
  • Angularjs之国际化
  • Codepen 每日精选(2018-3-25)
  • Docker容器管理
  • Flex布局到底解决了什么问题
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • java多线程
  • Js基础知识(四) - js运行原理与机制
  • Less 日常用法
  • nginx 负载服务器优化
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 反思总结然后整装待发
  • 给初学者:JavaScript 中数组操作注意点
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 入手阿里云新服务器的部署NODE
  • 深入浅出webpack学习(1)--核心概念
  • 怎么把视频里的音乐提取出来
  • 《天龙八部3D》Unity技术方案揭秘
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​【已解决】npm install​卡主不动的情况
  • ​如何在iOS手机上查看应用日志
  • #Lua:Lua调用C++生成的DLL库
  • #微信小程序:微信小程序常见的配置传旨
  • (Forward) Music Player: From UI Proposal to Code
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)JPA - JQPL 实现增删改查
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)jQuery 基础
  • ..回顾17,展望18
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net中wcf服务生成及调用
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @staticmethod和@classmethod的作用与区别
  • [AIGC] 开源流程引擎哪个好,如何选型?