一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1)

这篇具有很好参考价值的文章主要介绍了一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据
一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据
一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据
一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据
一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

| 淡蓝紫色(200,191,231) | 深苔藓色(55,64,24) |

黑色(0,0,0) 白色(255,255,255)
灰色-50%(127,127,127) 灰色-50%(127,127,127)(反色就是它本身)
深红色(136,0,21) 浅蓝绿色(119,255,234)
红色(237,28,36) 蓝绿色(18,227,219)
橙色(255,127,39) 暗青蓝色(0,128,216)
黄色(255,242,0) 靛蓝色(0,13,255)
绿色(34,177,76) 暗玫红色(221,78,179)
青绿(0,162,232) 鲜橙色(255,93,23)
靛青(63,72,204) 棕黄色(192,183,51)
紫色(163,73,164) 草绿色(92,182,91)

这样片段着色器就很简单了:

        #version 300 es
        precision mediump float;
        //纹理坐标
        in vec2 vTextCoord;
        //输入的yuv三个纹理
        uniform sampler2D yTexture;//采样器
        uniform sampler2D uTexture;//采样器
        uniform sampler2D vTexture;//采样器
        out vec4 FragColor;
        void main() {
           //采样到的yuv向量数据
           vec3 yuv;
           //yuv转化得到的rgb向量数据
           vec3 rgb;
           //分别取yuv各个分量的采样纹理
           yuv.x = texture(yTexture, vTextCoord).r;
           //直接将uv置为0.0即可(0.5-0.5)
           yuv.y = 0.0;
           yuv.z = 0.0;
           rgb = mat3(
                    1.0, 1.0, 1.0,
                    0.0, -0.183, 1.816,
                    1.540, -0.459, 0.0
            ) * yuv;  
            //取反色
            FragColor = vec4(vec3(1.0 - rgb.r, 1.0 - rgb.g, 1.0 - rgb.b), 1.0);

         };

只要最后赋值的一行改为以下即可:

 FragColor = vec4(vec3(1.0 - rgb.r, 1.0 - rgb.g, 1.0 - rgb.b), 1.0);

一行代码功夫,一切都”反了“。

白银

白银级别难度当然有所提升,主要是不同区域的片段的处理方式不一样了。

灰度反色交叉滤镜
        #version 300 es
        precision mediump float;
        //纹理坐标
        in vec2 vTextCoord;
        //输入的yuv三个纹理
        uniform sampler2D yTexture;//采样器
        uniform sampler2D uTexture;//采样器
        uniform sampler2D vTexture;//采样器
        out vec4 FragColor;

        void main() {
           //采样到的yuv向量数据
           vec3 yuv;
           //yuv转化得到的rgb向量数据
           vec3 rgb;
           //分别取yuv各个分量的采样纹理(r表示?)
           yuv.x = texture(yTexture, vTextCoord).r;
           yuv.y = texture(uTexture, vTextCoord).g - 0.5;
           yuv.z = texture(vTexture, vTextCoord).b - 0.5;
           rgb = mat3(
                    1.0, 1.0, 1.0,
                    0.0, -0.183, 1.816,
                    1.540, -0.459, 0.0
            ) * yuv;
            //根据不同的纹理坐标区域,赋值不同颜色值给当前当前片段颜色值
            if (vTextCoord.x < 0.5 && vTextCoord.y < 0.5) {
                //左上角区域,反色滤镜
                FragColor = vec4(vec3(1.0 - rgb.r, 1.0 - rgb.g, 1.0 - rgb.b), 1.0);
            } else if (vTextCoord.x > 0.5 && vTextCoord.y > 0.5) {
                //右下角区域,灰度滤镜
                float gray = rgb.r * 0.2125 + rgb.g * 0.7154 + rgb.b * 0.0721;
                FragColor = vec4(gray, gray, gray, 1.0);
            } else {
                FragColor = vec4(rgb, 1.0);        
            }
         };

代码一出来,其实也是so easy~关键点就是对于纹理坐标所在区域的判断,如果处于左上角,即x<0.5,y<0.5,则使用反色效果。如果处于右下角,即x>0.5,y>0.5,则使用灰度效果。其余区域不做额外处理

又是几行代码的功夫,就戴上了”有色眼镜“~

黄金

黄金级别对于刚接触的童鞋来说可能是一个小门槛,因为这里开始当前片段采样的纹素可能并非是片段本身对应的纹理坐标了,而是根据需要采样自己想要的纹理坐标位置的颜色值

二分屏

二分屏,顾名思义,即将一个画面分为2个重复的画面在平均分的屏幕位置上渲染。这里的二分屏为了保证图像不变形,所以每个分屏都采样原来纹理图片的中间一半的区域。如下图所示,左边是被渲染的图元,右边是被采样的纹理:

一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据

该图显示的是针对片段在第一个分屏的情况,因为之前讲过纹理映射就是相当于将图元的顶点和纹理的顶点一一对上。

从这个图我们可以得出一个通用结论,假如当前片段坐标为(x,y),当y小于0.5的时候,则采样纹理图片对应位置为y+0.25的纹素

那么对于下方的分屏,就可以顺藤摸瓜推出以下结论:

当y大于0.5的时候,则采样纹理图片对应位置为y-0.25的纹素。

上片段着色器代码:

#version 300 es

precision mediump float;
//纹理坐标
in vec2 vTextCoord;
//输入的yuv三个纹理
uniform sampler2D yTexture;//采样器
uniform sampler2D uTexture;//采样器
uniform sampler2D vTexture;//采样器
out vec4 FragColor;
void main() {
    //采样到的yuv向量数据
    vec3 yuv;
    //yuv转化得到的rgb向量数据
    vec3 rgb;

    vec2 uv = vTextCoord.xy;
    float y;
    //关键点,对渲染图元不同位置的点采样纹理的不同位置
    if (uv.y >= 0.0 && uv.y <= 0.5) {
        //当渲染图元的点位于上半部分的时候,采样比其纵坐标大于0.25部分
        uv.y = uv.y + 0.25;
    }else{
        //当渲染图元的点位于下半部分的时候,采样比其纵坐标小于0.25部分
        uv.y = uv.y - 0.25;
    }
    //分别取yuv各个分量的采样纹理
    yuv.x = texture(yTexture, uv).r;
    yuv.y = texture(uTexture, uv).g - 0.5;
    yuv.z = texture(vTexture, uv).b - 0.5;
    rgb = mat3(
            1.0, 1.0, 1.0,
            0.0, -0.183, 1.816,
            1.540, -0.459, 0.0
    ) * yuv;
    FragColor = vec4(rgb, 1.0);
 };

四分屏

四分屏就更好玩了,但是原理和二分屏是一样的。

如下图,左边是被渲染的图元,右边是被采样的纹理,像之前所说的,可以将纹理和图元的顶点一一对上,比如四分屏的第一个格子和纹理的对应关系如下图所示:

一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据

所以对于第一个分屏,假如此时需要渲染的片段为(x,y),则可以推出采样的通用关系:

当x<0.5,y<0.5的时候,采样(x*2,y*2)的纹素。

那么以此类推,就可以推出:

当x>0.5,y<0.5的时候,采样((x-0.5)*2,y*2)的纹素。

当x<0.5,y>0.5的时候,采样(x*2,(y-0.5)*2)的纹素。

当x>0.5,y>0.5的时候,采样((x-0.5)*2,(y-0.5)*2)的纹素。

片段着色器代码:

#version 300 es

precision mediump float;
//纹理坐标
in vec2 vTextCoord;
//输入的yuv三个纹理
uniform sampler2D yTexture;//采样器
uniform sampler2D uTexture;//采样器
uniform sampler2D vTexture;//采样器
out vec4 FragColor;
void main() {
    //采样到的yuv向量数据
    vec3 yuv;
    //yuv转化得到的rgb向量数据
    vec3 rgb;

    vec2 uv = vTextCoord.xy;
    if (uv.x <= 0.5) {
        //当x小于0.5的时候,采样2倍x坐标的纹素颜色
        uv.x = uv.x * 2.0;
    }else{
        //当x大于0.5的时候,采样2倍x坐标减0.5的纹素颜色
        uv.x = (uv.x - 0.5) * 2.0;
    }

     if (uv.y <= 0.5) {
           //当y小于0.5的时候,采样2倍y坐标的纹素颜色  
           uv.y = uv.y * 2.0;
     }else{
           //当y大于0.5的时候,采样2倍y坐标减0.5的纹素颜色
           uv.y = (uv.y - 0.5) * 2.0;
     }
    //分别取yuv各个分量的采样纹理
    yuv.x = texture(yTexture, uv).r;
    yuv.y = texture(uTexture, uv).g - 0.5;
    yuv.z = texture(vTexture, uv).b - 0.5;
    rgb = mat3(
            1.0, 1.0, 1.0,
            0.0, -0.183, 1.816,
            1.540, -0.459, 0.0
    ) * yuv;
    FragColor = vec4(rgb, 1.0);
 };

这么一看也没什么神奇的,你说呢?

总结

本文详细叙述了几种常见的滤镜效果实现原理,让广大的程序员也有机会体验做一把画家艺术家的快感,当然段位仅仅进行到了黄金级别未免显得太菜鸡了吧,所以下一篇文章才是真正冲击王者宝座的时机。

欢迎点赞加关注,让我们一起早日上王者段位~

一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据

项目代码

opengl-es-study-demo 不断更新中,欢迎各位来star~

参考:

OpenGL ES 案例11:分屏滤镜
反色百科

系列文章目录

体系化学习系列博文,请看音视频系统学习的浪漫马车之总目录

实践项目: 介绍一个自己刚出炉的安卓音视频播放录制开源项目

相关专栏:

C/C++基础与进阶之路

音视频理论基础系列专栏

音视频开发实战系列专栏

轻松入门OpenGL系列
一看就懂的OpenGL ES教程——图形渲染管线的那些事
一看就懂的OpenGL ES教程——再谈OpenGL工作机制
一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(一)
一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(二)
一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(三)
一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(四)
一看就懂的OpenGL ES教程——这或许是你遇过最难画的三角形(五)
一看就懂的OpenGL ES教程——缓冲对象优化程序(一)
一看就懂的OpenGL ES教程——缓冲对象优化程序(二)
一看就懂的OpenGL ES教程——临摹画手的浪漫之纹理映射(理论篇)
一看就懂的OpenGL ES教程——临摹画手的浪漫之纹理映射(实践篇)
一看就懂的OpenGL ES教程——渲染宫崎骏动漫重拾童年

作者:半岛铁盒里的猫
链接:https://juejin.cn/post/7168042219163779108

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。文章来源地址https://www.toymoban.com/news/detail-853349.html

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1),程序员,elasticsearch,音视频,大数据
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

到了这里,关于一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 一看就懂的装箱拆箱案例

    在C#中,装箱(Boxing)和拆箱(Unboxing)是值类型与引用类型之间相互转换的过程。 当一个值类型(如整数、结构体或枚举等)需要转换为对象(System.Object)或接口类型时,系统会自动创建一个新的对象实例,并将该值类型变量的值复制到新创建的对象中。这个过程就称为装

    2024年02月02日
    浏览(33)
  • Google Chrome谷歌浏览器安装最新版Elasticsearch插件 图文教程 【一看就懂】

    我们在虚拟机安装了Elasticsearch后,往往还需要再安装一个可视化界面以便于使用。本文就教您如何在Google Chrome谷歌浏览器安装最新版Elasticsearch(es)插件。 | 1 如图所示,点击设置 进入如下界面,点击扩展程序 开启开发者模式后点击Chrome网上应用商店 如图所示搜索插件El

    2024年02月07日
    浏览(54)
  • python文件操作(一看就懂)

    现在我们接着上文讲,如果没有看过我上篇文章的萌新朋友们可以先去看看,不然一会儿容易读的你满脸问号。python字符编码 现在我们来思考一个问题,我们在PyCharm里敲字符,这个字符应当先存到内存中去,而内存里都存的是unicode格式的二进制,如果我们现在就把他存到硬

    2024年02月03日
    浏览(31)
  • 插入排序超详解释,一看就懂

    目录 一、插入排序的相关概念 1、基本思想 2、基本操作:有序插入 二、插入排序的种类 三、直接插入排序 1、直接插入排序的过程:顺序查找法查找插入位置 2、使用“哨兵”直接插入排序 四、 直接插入排序算法描述 五、折半插入排序 1、查找插入位置时采用折半查找法,

    2024年01月25日
    浏览(33)
  • 【数据结构】插入排序详细图解(一看就懂)

      💯 博客内容:【数据结构】插入排序详细图解(一看就懂) 😀 作  者:陈大大陈 🦉所属专栏:数据结构笔记 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,

    2024年02月07日
    浏览(39)
  • C# for循环案例1 (一看就懂)

     效果:  用f10可以清楚的看到程序执行的每一步,  #region for循环 /*   语法:     for(表达式1;表达式2;表达式3) {    循环体; } for(表达式1;表达式2;表达式3)   表达式1 定义循环的次数,可以理解为循环变量。表达式2 执行的条件。 表达式3,改变循环的条件,使循环条件不

    2023年04月11日
    浏览(37)
  • 微信小程序实现倒计时功能,一看就懂,直接用

    结构完整,直接用就可以

    2024年02月01日
    浏览(51)
  • java三层架构,有图有案例有代码,一看就懂!!!

    三层架构 三层结构解释: 视图层:主要是用于与用户进行交互,比如接收用户输入的内容将返回结果向用户展示等。 业务逻辑层:实现每个功能的特定的逻辑方法。 数据访问层:主要是与数据库进行连接,然后对数据库进行增删改查工作。 结构一: 包的层级结构: 三层结

    2024年02月03日
    浏览(36)
  • 如何在android运行lua脚本(最简单的讲解,一看就懂)

    1.打开 android studio 2.引入luaj-jse-3.0.1.jar包(百度自行下载) 3.新建assets文件夹 4.在assets文件夹下新建一个 main.lua文件,内容如下 5.MainActivity.java 内容如下 5.运行程序

    2024年02月11日
    浏览(26)
  • 【Pandas】四个例子掌握用Python进行数据分析!一看就懂!

    本文选取了四个经典案例,主要聚焦Pandas在数据分析中的简单应用,结合代码学习利用Python进行数据分析过程(●ˇ∀ˇ●)。在每个例题开始前,我们将会标注出本例题涉及的重要知识点,并在重要处添加解释和代码注释,共读者参考。 如果你遇到任何问题,欢迎在评论区一起

    2024年02月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包