前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >马赛克效果(shader)

马赛克效果(shader)

作者头像
异名
发布于 2020-06-08 10:56:42
发布于 2020-06-08 10:56:42
2.1K00
代码可运行
举报
文章被收录于专栏:异名异名
运行总次数:0
代码可运行

马赛克是一种常用的图像处理手段,因为这种模糊效果看上去有一个个的小格子组,便形象的称这种画面为马赛克。当画面上的马赛克格子小到一定程度的时候,画面呈现出来的风格也叫像素风

demo

实现思路

核心思路就是把图片划分成M * N个小格子,格子内取同一个颜色。我们前面经常用到texture(texture, v_uv0)这个函数,它的作用就是把纹理贴图按uv进行取样,输出一个vec4类型的颜色值,在实现马赛克效果的时候我们改为按M * N个点来取样,也就是要找出每个格子的中心点,然后传入texture函数,这样一来问题就变成了,如何计算每个格子的中心点

从水平方向说起,每个格子的x轴中心坐标等于当前格子的x轴位置加上格子宽度的一半。格子数量x_count通过外部传入,每个格子的宽为block_w = 1.0 / x_count,每个格子的x轴位置等于当前格子的序号乘上格子的宽度,格子的序号为block_x_idx = floor(v_uv0.x / block_w),当前格子的位置为block_x_idx * block_w,当前格子的中心点位置为block_w * (block_x_idx + 0.5)。同理可以得到格子中心点的垂直方向的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vec2 getUvMapPos() {
  float block_w = 1.0 / x_count;
  float block_x_idx = floor(v_uv0.x / block_w);

  float block_h = 1.0 / y_count;
  float block_y_idx = floor(v_uv0.y / block_h);

  return vec2(block_w * (block_x_idx + 0.5), block_h * (block_y_idx + 0.5));
}

有了映射的坐标,我们就可以直接进行颜色取样和赋值,为了便于控制,我们还可以加上一个宏开关:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void main () {
  vec4 o = vec4(1, 1, 1, 1);
  vec2 realPos = v_uv0;

  #if USE_MASAIC
    realPos = getUvMapPos();
  #endif

  o *= texture(texture, realPos);
  o *= v_color;

  gl_FragColor = o;
}

后面可以通过更改传进来的垂直和水平方向的格子数量来控制马赛克的大小,效果如下:

demo

效果预览

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 异名 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用 OpenGL ES 给视频播放器做个字符画滤镜
最后不少朋友问,OpenGL ES 入门后怎么学习写一些滤镜 ?怎么学习 shader ?
字节流动
2021/02/24
7000
利用 OpenGL ES 给视频播放器做个字符画滤镜
OpenGL ES GLSL马赛克滤镜实现(3)
01 — 矩形马赛克滤镜GLSL 算法解析 片元着色器代码实现: precision mediump float; varying vec2 TextureCoordsVarying; unifor
CC老师
2019/07/30
1.3K0
OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克
通过一个给定的六边形把原纹理分割成若干块(一般选择六边形的中心点的纹素)。原理和矩形马赛克是一样的,只是当前像素点隶属的六边形计算会有一些难度。
用户8893176
2021/08/09
9190
OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克
水波扩散效果(shader)
水波扩散是一个比较好看的交互效果,特别是在某些以水为故事发生场景的游戏中,扩散的水波会让场景更加栩栩如生
异名
2020/06/09
2.5K0
Flutter & GLSL - 肆 | 从条纹到马赛克
之前我们实现过黑色到红色的渐变效果,让像素颜色的 r 值根据坐标从 0~1 均匀变化即可。现在想要实现如下的 渐变条纹 ,该怎么办呢?条纹可以指定个数,如下是 10 个条纹从黑到红的渐变效果:
张风捷特烈
2024/02/20
2510
Flutter & GLSL - 肆 | 从条纹到马赛克
开源 2D 实时水面反射效果,源码详解!
引言:插件 Easy NavMesh、BenchMark 性能检测的作者孙二喵,从开发者王师傅的论坛分享中获得启发,实现了 2D 实时水面反射效果,Demo 免费开源。
张晓衡
2023/02/23
7090
开源 2D 实时水面反射效果,源码详解!
在 iOS 上用 Shader 实现 图片 转 字符画 效果~~
那天在朋友圈问了一下如何通过 OpenGL Shader 实现同样效果,没想到引来了大神的关注。
音视频开发进阶
2020/07/07
1.1K0
在 iOS 上用 Shader 实现 图片 转 字符画 效果~~
滤镜之LUT
滤镜基本是相机或者图像处理软件中的标配功能,它能对图像实现各种特殊效果,比如iPhone中的滤镜功能:
雪月清
2020/06/23
2K0
圆形头像(shader)
可以使用一张圆的图片,然后配合mask的反向遮罩来实现,但是这种实现的效果会有锯齿,所以一般会写一个shader。异名上篇文章中追光效果中那个shader刚好直接就可以使用了,这系列的定位是常用功能集锦,圆形头像又是高频应用,因此异名就再单独拿出来再水一篇,方面后面查看使用。
异名
2020/06/09
2.2K0
[ - OpenGLES3.0 - ] 第三集 主线 - shader着色器与图片特效
precision 表示精度 lowp低、mediump中、highp高 很容易想到,精度越↑,效果越↑,但着色器速度↓ in vec2 vTexCoord; 表示接受顶点的输入的vTexCoord变量 uniform 统一变量,在着色器执行期间它的值是不变的 sampler2D 类型:2D纹理
张风捷特烈
2020/04/30
1.5K0
融球效果(shader)
元球也叫融球,它能够让两个球体产生“黏糊糊”的效果,是流体、融合等效果的实现基础,异名这次实现的demo是一个固定的大圆,然后手指控制一个游离态的小圆,它们靠近的时候会产生融合的效果
异名
2020/06/09
1.4K0
追光效果
追光效果是在舞台全场黑暗的情况下用光柱来突出角色或其他特殊物体,还可以通过操控光源来跟随人物移动。追光效果主要用来突出角色主体以及主体和环境的关系,在游戏中可以用来营造沉浸式氛围以及聚焦玩家视线焦点
异名
2020/06/09
7970
用 Shader 写个完美的波浪~
根据我多年喝奶茶的经验,像这种效果用 Shader 做就再简单不过了,最终的效果如下:
陈皮皮
2020/09/10
1.9K0
高斯模糊 Shader
高斯模糊(Gaussian Blur),也叫高斯平滑,是一种生活中比较常见的图像处理效果。
陈皮皮
2020/07/10
2.2K0
高斯模糊 Shader
Cocos Creator 2.x透明渐变效果实现
之前写了个透明过渡动画实现是基于Cocos Creator 1.x的,鉴于现在大多数开发者都使用2.x了,并且2.x与1.x中shader的使用方式有很大的不同,这里就把这个效果移植到2.x中。(cocos creator 1.x透明渐变效果实现)
用户1428723
2020/08/06
2.4K0
Flutter & GLSL - 伍 | 图形区域控制
有时我们需要通过着色器来表现图形,那如何通过坐标控制颜色值的输出,得到基本图形呢?之前一直强调:
张风捷特烈
2024/02/22
2360
Flutter & GLSL - 伍 | 图形区域控制
别人用 Shader 画了个圆,你却只能画椭圆?
由于主流的 Shader 编程网站,如 ShaderToy, gl-transitions 都是基于 GLSL 开发 Shader ,加上 MSL 和 GLSL 语法上差别不大,后面系列文章将以 GLSL 为主来介绍 Shader 编程。
字节流动
2023/09/04
8140
[ - OpenGLES3.0 - ] 第四集 视频接入OpenGLES3.0实现特效
@张风捷特烈 2020.12.08 未允禁转 我的公众号:编程之王 联系我--邮箱:1981462002@qq.com -- 微信: ~ END ~
张风捷特烈
2020/12/09
1.7K0
[ - OpenGLES3.0 - ]  第四集  视频接入OpenGLES3.0实现特效
镜面光泽效果
镜面上扫过一道光泽是UI里面很常用的一种特效,通常用来强调某个物体或者凸显物体的“稀有”价值,比如卡片中扫过一道光芒等
异名
2020/06/09
5750
Depix马赛克_马赛克是什么意思啊
笔者本来只是翻了翻微信的公众号,突然发现很多公众号都提高了一个叫做Depix的项目,据说是马赛克的克星,于是好奇的到Github上下载了试试效果,公众号推送相关消息如下: 最近,一个名为 Depix 的 GitHub 项目爆火,上线三天 star 量已经高达 6.9k。项目作者 Sipke Mellema 是一名信息安全顾问。
全栈程序员站长
2022/08/03
7770
Depix马赛克_马赛克是什么意思啊
相关推荐
利用 OpenGL ES 给视频播放器做个字符画滤镜
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验