美文网首页
Shader实例跳动心脏

Shader实例跳动心脏

作者: T_a00 | 来源:发表于2016-08-16 10:28 被阅读0次

用Shader来绘制一个跳动的心脏。效果图


代码如下:

Shader"Custom/Heart"{

SubShader{

pass{

CGPROGRAM

#pragmavertexvert

#pragmafragmentfrag

#include"UnityCG.cginc"

//1.心形Shader的渲染需要拿到纹理坐标来进行渲染

//2.位置绑定

struct v2f{

float4 pos:POSITION;

float2 uv:TEXTCOORD0;

};

v2f vert(appdata_full v)

{

v2f o;

//坐标转换

o.pos =mul(UNITY_MATRIX_MVP,v.vertex);

//将心形中心点设置到纹理坐标中央(即(0.5,0.5)=>(0,0)),4为缩放比例

o.uv =4*v.texcoord.xy-fixed2(2,2);

returno;

}

float4 frag(v2f i):COLOR{

//背景颜色亮暗可以通过(1,.0.8,0.7)*(r(0到1之间的值))来达到

//距离中心越远r值越小

//length(q)q向量的的长度

fixed3 background = fixed3(1,0.8,0.7-0.07*i.uv.y)*(1-0.25*length(i.uv));

//控制心跳时间和函数横向长纵向短

//利用时间控制周期

float tt =fmod(_Time.y,1.0)/1.0;

float ss =pow(tt,.2)*.5+.5;

ss -= ss*0.2*sin(tt*6.2831*3.0)*exp(-tt*4.0);

i.uv *=float2(0.5,1.5) +float2(0.5, -0.5)/ss;

//心形函数

float a=abs(atan2(i.uv.y,i.uv.x))/3.141593;

float r =length(i.uv);

//利用函数调节心形函数

float d = (13*a-22*a*a+10*a*a*a)/(6-5*a);

fixed3 hcol =fixed3(1,0,0.3);

//背景颜色与心颜色过渡用Lerpsmoothstep做平滑处理

fixed3 col =lerp(background, hcol,smoothstep(-0.01,0.01, d-r));

return fixed4(col,1);

}

ENDCG

}

}

Fallback"Diffuse"

}

1.心形画法的原理

利用心形函数方程的特性

如图所示  心形曲线上的每个点到原点的距离与每个点到x轴的夹角的弧度制存在着一定的比例

我们可以利用这个来画心。

2. 坐标的设置

根据纹理坐标的性质,通过获取到纹理坐标,然后来设置坐标轴的原点位置以及在显示方面的大小。这里我们是把心形中心点设置到纹理坐标中央(即(0.5,0.5)=>(0,0)),4为缩放比例o.uv =4*v.texcoord.xy-fixed2(2,2);

3.图形的画制

atan2(i.uv.y,i.uv.x)求的是向量所对应的角度。求得的是弧度制的值,除以pi后得到的范围是[0,1];所以上面的函数就是求得平面上的坐标点所对应向量的角度(被映射到[0,1]之间);然后只需要把心形里面和外面渲染成不同的颜色即可。方法是用step方法,这里用smoothstep,使得边缘不那么硬, 然后结合lerp方法,如下:

float a=atan2(i.uv.y,i.uv.x)/3.141593;

float r =length(i.uv);

fixed3 col =lerp(background, hcol,smoothstep(-0.01,0.01, a-r));

这样只是画了半颗心,需要翻转xy轴,并取绝对值,
即可

4.利用函数调节心形

利用下面函数可以来调节心形

曲线如下

//利用函数调节心形函数

float d = (13*a-22*a*a+10*a*a*a)/(6-5*a);

5.心形跳动的算法

原理就是通过一定比例来改变心形的长宽的比例,然后让这种变化呈现一种周期性的变化。

我们这里有了一个接近于心跳规律的函数来控制。

//控制心跳时间和函数横向长纵向短


//利用时间控制周期

float tt =fmod(_Time.y,1.0)/1.0;

float ss =pow(tt,.2)*.5+.5;

ss -= ss*0.2*sin(tt*6.2831*3.0)*exp(-tt*4.0);

i.uv *=float2(0.5,1.5) +float2(0.5, -0.5)/ss;

相关文章

  • Shader实例跳动心脏

    用Shader来绘制一个跳动的心脏。效果图 代码如下: Shader"Custom/Heart"{ SubShad...

  • cocos2d::glprogram分析

    1、glprogram分析 2、实例应用,变暗、变灰shader 可见glprogram提供shader的编译、链...

  • 2019-07-16了解心率

    心率指的是心脏每分钟的跳动频率 心脏跳动往身体输送血液,心率越低相对心脏功能越强 也就是平常需要心脏跳动70下才能...

  • 三行情书——心脏

    一颗心脏疯狂跳动, 只因, 另一颗心脏停止跳动。

  • Power——跳动的心脏(序言)

    Power——跳动的心脏 ——让心脏...

  • 跳动的心脏

    “你有一颗跳动的心脏,你仍旧活着。” 我渴望,渴望未来的日子。能手执奶茶,听手机里传来的歌曲,是我喜欢的人,喜欢的...

  • 跳动的心脏

    一切好像都表现得若无其事,当说出那些伤害对方的话时就好像心被刀割了一般奇痛无比…… 从开始认识到最熟悉的陌...

  • 跳动的心脏

    ———记先天性心脏病患者 我知道天使是爱我的, 她定是更喜欢我 “巧笑倩兮,美目盼兮”的样子, 温...

  • 跳动的心脏

    今天是一周里最累,最紧凑的一天,但是晚上跟一群朋友吃完一顿饭以后,一天的疲惫在不知不觉中消失了,现在舒舒服服赖在床...

  • 让心脏跳动

    生治的艺术,对,生活中有很多的艺术,艺术来源于生治,也高于生活。 读书会与作家李亦凡,京京,两位浑身是知性美的老师...

网友评论

      本文标题:Shader实例跳动心脏

      本文链接:https://www.haomeiwen.com/subject/jbhpsttx.html