简介: 记录几个有意思的马赛克计算方式
版本: Unity2023.3.14f1c1
ASE: 着色器节点编辑器
简述
马萨克其实很好理解,就是像素不足的时候出现的色块,当我们有足够的像素时,我们要实现马赛克的一个主要思路就是把一批像素整合起来使用一个颜色,有了思路实现起来就简单了
实现
简单 UV 拆分
步骤:
- 获取屏幕的 UV 坐标,这个值是 0-1 的
- 把屏幕坐标放大一定的数量,例如 100 倍
- 然后使用 ceil 取整,这个方法就是返回一个大于等于传入数值的整数,例如0.1 返回1, 1.2 返回 2,我们获得了 100 个整数,他们的取值范围是 1 - 100
- 然后用他们再除以 我们的放大数量 100,这样就得到了 100X100 个纯色的色块,他们的取值范围 是 0 - 1。
- 这 100X100个色块就代表了要采样的颜色的 UV 坐标,这个方法采样的应该是每组 uv 右上角 (右下角的)的像素。
如果想采样每个分组的中心,可以在除以100之前在纵横方向上各偏移0.5 即可
这个方法有个缺点,我们是把屏幕uv 横竖进行 100 份平分,所以每一个快的长宽比和原始的屏幕长宽比是一致的。就是说我们的马赛克大部分情况下不会是正方形的,因为大部分的显示设备不会是正方形的。
拆分 UV 为等长宽的分组
这个方法是上一个方法的升级版,做了 uv 拆分组的长宽矫正,例如,高为1,宽为2,则拆分时,宽的拆分数量会是高的两倍,这样拆出来的分组就会是等高宽的
获取长宽比例使用的是 ScreenParams 节点,他可以获取渲染输出的长宽值,其它计算方式和上面的例子一致,不再赘述。
使用像素分组进行计算
在这个方法中,主要是使用屏幕实际宽高来计算。大致思路和前面例子一致。只不过传入的参数不再代表把宽高拆分多少份,而是将多少像素分为一组,即具体拆分多少份由 宽高/传入num 得到
步骤:
- 获取屏幕像素宽高值,然后乘以屏幕 UV,这样便可以起到对像素编号的作用。
- 使用编号后的 结果/传入num 就可以得到分组数
- 对分组数使用 ceil 向上取整
- 使用 宽高/传入num 得到总共能分多少组,这是一个常数.
- 使用 分组数/总组数 便可以得到 对应的纯色坐标块。这些方块颜色取值范围时 0 - 1