新年好,快和你的女神比个心吧

213 阅读3分钟

祝福语

大家新年好!
新的一年,祝大家,身体健康,一夜暴富。

比心效果图

灵感来源

之前偶然刷抖音,看到有抖音博主在朋友圈靠截图和移动朋友圈九张图的位置,完成了一个比心的图。中间是他的女票吧,然后周边是他自己的比心图,外围是粉色背景。真的是创意满满。我也想给我的女票整一个,但是我觉得这么整就很费劲,不如敲两行代码来的实在。刚开始的时候想的是用照片做的,就是中间是对象,外围是自己比心的图。然后我就想到了用web的css来做,这么做确实没毛病,也最省事。不过我想我还是把周围换成视频好一点,然后做个app给她吧。

思路

因为不可能使用多个视频播放器,那就用opengl做吧,把相机的纹理贴在爱心的位置,中间位置贴对象的照片的纹理。

我之前恰好搞过多分屏的fragment shader.而我只需要稍作修改就可写出这样的效果。

多分屏

#define N 4.0
vec2 tri(vec2 x){
    return mod(x,1.0/N)*N;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord/iResolution.xy;
    fragColor= texture(iChannel0,tri(uv));
}

多分屏在线的演示地址:www.shadertoy.com/view/7sscDX
原理见:juejin.cn/post/705923…

一点点修改

81宫格图

将N改为9.0,便得到了81宫格图

爱心数组

根据抖音的效果图,我把粉色区域用0表示,相机区域用1表示,对象的视频/照片区域用2表示

则可以得到这样的一个数组:

000 000 000
001 101 100
011 111 110 
111 222 111
111 222 111
011 222 110
001 111 100
000 111 000
000 010 000

根据坐标位置计算显示哪部分

坐标范围[0,1],从左到右递增,从下到上递增。每一个都是1/N,坐标* N转为整数。就是从左到右【或者从下到上】第几个宫格。对应数组的位置。

image.png

fragment shader

/*
000 000 000
001 101 100
011 111 110 
111 222 111
111 222 111
011 222 110
001 111 100
000 111 000
000 010 000
*/

#define N 9
#define CN N/3
#define PINK vec3(0.945,0.62,0.761)
int picMap[N*N] =int[](
0,0,0,0,0,0,0,0,0,
0,0,1,1,0,1,1,0,0,
0,1,1,1,1,1,1,1,0,
1,1,1,2,2,2,1,1,1,
1,1,1,2,2,2,1,1,1,
0,1,1,2,2,2,1,1,0,
0,0,1,1,1,1,1,0,0,
0,0,0,1,1,1,0,0,0,
0,0,0,0,1,0,0,0,0);



/*
it will devide image to N*N parts.
*/
vec2 tri(vec2 x,float devide){
    return mod(x,1.0/devide)*devide;
}

/*
 make picture more brightly
*/
vec4 whitening(vec4 inputColor,float fractor){
    return log(inputColor*(fractor-1.0)+1.0)/log(fractor);
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord/iResolution.xy;
    int xindex = int(uv.x*float(N));
    int yindex = (N-1) - int(uv.y*float(N));
    int value = picMap[yindex*N+xindex];
    fragColor = mix(whitening(texture(iChannel0,tri(uv,float(N))),4.0),vec4(PINK,1.0),smoothstep(float(value),0.8,1.0));
    fragColor = mix(whitening(texture(iChannel1,tri(uv,float(N))),5.0),fragColor,step(float(value),1.0));
}

在线效果

www.shadertoy.com/view/7sScDw