该原创文章首发于微信公众号:字节流动
旧文中我们用 OpenGL 给小姐姐实现了瘦身和大长腿效果,结果小姐姐眯着眼睛、嘟着嘴说,我需要瘦身和大长腿效果吗?
笔者若有所思地看着她的眼睛和脸庞,终于弄明白了她需要的是什么效果。
言归正传,无论是实现瘦身大长腿效果,还是实现瘦脸大眼效果,其本质上都是对图像中某些区域的像素按照我们设定的规则进行移动,而 OpenGL 的片段着色器天然适合处理像素(纹素)层面的操作。
OpenGL 实现大眼效果
为了更好的展示大眼效果,动图中形变参数设置较大,所以看起来比较夸张。
OpenGL 实现大眼效果,可以参照放大镜的实现原理,即将纹理上一块区域采样后映射到一块相对较大的区域。
本文所实现的大眼效果进行了简化,是在以人眼为中心的圆形区域内进行放大,距离圆心越远,放大的强度越大。
如上图所示,圆内部为发生形变(放大)的区域,红点为不发生形变时的采样点(原始纹理坐标),绿点为发生形变时对应的采样点(纹理坐标发生偏移)。
实现