ShaderJoy —— “跳动的❤️”的原理解析【GLSL】

本文深入解析ShaderToy算法,通过GLSL实现‘跳动的❤️’效果。关键在于计算d的函数和使用smoothstep进行hermite插值,调整颜色渐变,最终通过d-r得到心形并修正位置。通过增加‘心跳’动画,使效果更加生动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考了ShaderToy的算法 ,对其原理进行了简单分析,并对代码进行精简

绘制❤️形

先看看关键代码

 float r = length(p);
 float a = atan(p.x,p.y)/3.141593;
 float h = abs(a);
 float d = (13.0*h - 22.0*h*h + 10.0*h*h*h)/(6.0-5.0*h);
    
 // Red
 vec3 hcol = vec3(1.0, 0.0, 0.0);
   
 // Draw Heart 
 vec3 col = mix( u_bgColor.xyz, hcol, clamp( d-r, 0., 1.));


其中,p 是片元坐标 x,y 从 [0,1] 域换算到 [-1,1] 的 vec2 形式,u_bgColor 是白色的背景,a 的含义不用解释了,值得一提的是a的范围是 [-1/2, 1/2] ,需要对它取绝对值,原因是 a 为负数的话,计算出的 d 也为负数,那么会被 mix 函数所忽略的(所以我们常常使用 clamp 来截断),如图(颜色越浅表示 d 值越小,反之亦然):

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaderJoy

您的打赏是我继续写博客的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值