【渲染】Unity制作暴风眼效果( 二 )

< 0)return false;return true;}//光球float4 lightSphere(float3 p, float3 dir){float3 planeNormal = -dir;float dis = 0;float3 o = float3(0, _Bottom, 0);if (!rayCastPlane(p, dir, o, planeNormal, dis)){return 0;}float3 castP = p + dir * dis;float t = length(castP - o) / _Radius;float glow = (0.7 - saturate(t - 0.3)) / 0.7;if (glow < 0||glow >1)return 0;return lerp(float4(_LightColor.rgb, 0), _LightColor, glow);}
效果如下:

【渲染】Unity制作暴风眼效果

文章插图
光球
第四步:加上闪电
我们再加上一道从天上劈下来的闪电!实现的方法也很简单,首先确定绘制闪电平面的uv,我们以视线方向,对绘制闪电的平面做相交检测:
【【渲染】Unity制作暴风眼效果】//闪电float4 lightning(float3 p,float3 dir){//闪电的平面的法线float3 planeNormal = -normalize(float3(dir.x, 0, dir.z));float dis = 0;//相交检测if (!rayCastPlane(p, dir, float3(0, 0, 0), planeNormal,dis)){return 0;}float3 castP = p + dir*dis;if (castP.y < _Bottom || castP.y>_Top)return 0;fixed uvDir = 1;//判断交点在原点的左右,用来保证uv0~1if (cross(castP, planeNormal).y < 0){uvDir = -1;}float projDis = length(castP.xz);float lightWidth = 10;if (projDis > lightWidth){return 0;}//计算绘制闪电的平面的uvfloat2 st = float2(((length(castP.xz)*uvDir / lightWidth)+1)/2, ((castP.y - _Bottom) / (_Top - _Bottom))*6);
确定好uv后,我们再使用FBM对uv进行扭曲
float lightningFBM(float2 st) {float value = http://www.kingceram.com/post/0.0;float amplitude = .2;float frequency = 0.;for (int k = 0; k < 6; k++) {value += amplitude * tex2Dlod(_Noise, float4(st, 0, 0));st *= 2.;amplitude *= .1;}return value;}float4 lightning(float3 p,float3 dir){... ...//对uv的x进行fbmst.x += lightningFBM(st + _Time.z)*2*st.x;st.x *= st.x;//将0~1变为0~1~0st.x = (0.5 - abs(st.x - 0.5)) * 2 * 5 - 4;... ...}
最后,根据uv进行采样,uv两边颜色浅,中间深:
//闪电float4 lightning(float3 p,float3 dir){... ...return lerp(float4(_LightColor.rgb,0), _LightColor, saturate(st.x));}
至此,所有效果都已完成 。
闪电
结语
虽说大体上效果已经完成,但是性能爆炸,许多细节处都可以优化,如果后面有时间的话我会进行优化并继续更新 。同时也希望各位大佬可以多多交流学习 。
最后送上项目链接,文章写的不是很好,最好配合代码食用:
参考:
-BETA
The Book of :
GPU Pro 7——实时体积云(翻译,附Unity工程)_刘一码的博客-CSDN博客