[Unity]基于高度的混合纹理Shader

阅读: 评论:0

[Unity]基于高度的混合纹理Shader

[Unity]基于高度的混合纹理Shader

参考自

我们希望沙子会更多的在缝隙里面出现,而石头越高的地方沙子应该要越少,那么就需要知道每一张贴图的深度信息,这里可以把贴图对应的高度图保存在每张贴图的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小时内删除。

标签:纹理   高度   Unity   Shader
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23