参考自
我们希望沙子会更多的在缝隙里面出现,而石头越高的地方沙子应该要越少,那么就需要知道每一张贴图的深度信息,这里可以把贴图对应的高度图保存在每张贴图的alpha通道。通过对比每张贴图的高度差,就可以知道应该显示哪张贴图了。
用一个高度混合函数封装核心算法
//高度混合函数inline half4 Blend(half depth1,half depth2,half depth3,half depth4,fixed4 control){half4 blend;//获取混合后的高度通道blend.r = depth1*control.r;blend.g = depth2*control.g;blend.b = depth3*control.b;blend.a = depth4*control.a;//所有的高度取最大值half ma = max(blend.r,max(blend.g,max(blend.b,blend.a)));//用原来的高度混合减去偏移后的高度混合,乘以个遮罩防止溢出blend = max(blend - ma + _weight ,0) * control;//标准化输出return blend/(blend.r + blend.g + blend.b + blend.a);}
加入光照和法线,得到最终混合纹理图
//得到混合多通道half4 blend = Blend(Lay1.a,Lay2.a,Lay3.a,Lay4.a,control);//混合法线合并fixed4 MegeNormal = normal1*blend.r+normal2*blend.g+normal3*blend.b+normal4*blend.a;//贴图切线法线转换到世界空间法线fixed3 worldNormal = NormalCompute(MegeNormal,i.TtoW0,i.TtoW1,i.TtoW2);//半兰伯特fixed4 diffusecolor = max(0,dot(worldNormal,worldLightDir)*0.5+0.5)* _LightColor0;//高光fixed4 Specularcolor = pow(max(0,dot(worldNormal,halfDir)),_Gloss*512)*_Specular;//存储颜色half4 Albedo;//纹理颜色混合高度混合通道Albedo = Lay1*blend.r+Lay2*blend.g +Lay3*blend.b +Lay4*blend.a;//纹理颜色乘光照Albedo*= diffusecolor+Specularcolor+ambient;// apply fogUNITY_APPLY_FOG(i.fogCoord, col);return Albedo;
本文发布于:2024-02-04 22:07:54,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170717501460038.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |