本文主要是介绍[Shader]法线扰动的各种实现方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
想利用法线扰动做一个下雨时地面漫水的效果。
1、纹理采样
截了镇魔曲的shader,镇魔曲代码大致如下
half2 posOffset1;
posOffset1.x = (worldPos.x + worldPos.y);
posOffset1.y = worldPos.z;
half2 uvOffset1;
uvOffset1 = ((posOffset1 * half2(0.0048, 0.0048)) + (half2(0.022, 0.0273) * half2(_Time.y,_Time.y)));
half2 posOffset2;
posOffset2.x = worldPos.x;
posOffset2.y = (worldPos.z + worldPos.y);
half2 uvOffset2;
uvOffset2 = ((posOffset2 * half2(0.00378, 0.00378)) - (half2(0.033, 0.0184) * half2(_Time.y,_Time.y)));
half3 distNormal1;
distNormal1 = UnpackScaleNormalCustom(tex2D(_DistBumpMap, uvOffset1), _DistBumpScale);
//texture (sam_other0_0, uvOffset1, 0.0);
//local_122_12 = distNormal1;
half3 distNormal2;
distNormal2 = UnpackScaleNormalCustom(tex2D(_DistBumpMap, uvOffset2), _DistBumpScale);
//texture (sam_other0_0, uvOffset2, 0.0);
//local_129_11 = distNormal2;
//half3 tmpvar_52;
//tmpvar_52 = (((
// (distNormal1 * half3(2.0, 2.0, 2.0))
//- half3(1.0, 1.0, 1.0)) * (
// (distNormal2 * half3(2.0, 2.0, 2.0))
//- half3(1.0, 1.0, 1.0))));// * weather_intensity.yyyy);
//half3 distnormal=tmpvar_52;
//distnormal.y = 0.0;
//distnormal.x = tmpvar_52.x;
//distnormal.z = tmpvar_52.y;
用了两次纹理采样。里面的因子在实际调试时扩大了10倍感觉效果更好。原代码是不含注释的,//注释掉了一些操作,降低运算量。
原镇魔曲的法线扰动纹理图不对称,在我们的游戏中会因为UV断开导致一小裂缝,所以我把纹理图对称复制了一下。
2、纹理采样在手机上比较耗,我又想弄一种近似的数学方法供低画质用,
每个像素点的法向扰动由(sin(sand+time),10,cos(sand+time))再nomralize实现,这样可以按时间上下波动。
对于sand,用worldPos.xyz累加的运算过于规律;
用wordPos.xyz*int%int的方式又过于随机;
最后采用了worldPos.x*orgNormal.x+worldPos.z,因为在平地上y波动不大,所以没有加入y,最后sand有一定的水波状。
这篇关于[Shader]法线扰动的各种实现方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!