【Unity】Shader效果——Snow雪地

 工程链接:

链接:https://pan.baidu.com/s/1GmDZt2wRCIP7AlbM-uGhSw 
提取码:2gm1 

 

鼠标点击地形会出现雪地轮廓,可扩展具体代码Snow脚本,修改射线检测处即可。

Shader可视化编辑器使用插件AmplifyShader

脚本说明:利用Graphics.DrawTexture将Rt参数的RendererTexture贴图修改,修改RT贴图的shader是stamp材质球的shader,输入有_SourceTex(RT图)和_SourceUV(被绘制的小图DrawImg所在RT图空间的[0,1]uv值),Snow脚本是通过射线检测点击到Plane地形就会在它身上绘制一个DrawImg图片,并输出到屏幕。

MySnow Shader说明:HeightToNormal 这是一个Shader函数体,输入的是整个Plane相关的数据,它会根据贴图高度(RT图)生成一个法线(根据高度生成法线),并用这个法线作为最终渲染的法线数据(增加明显的凹凸效果),对应如下框中的区域

 

这Tessellation是细分网格,因为原本的Plane网格顶点数太少了需细分才好看,Android端可以调整它来优化性能。

 这部分是进行一个对顶点偏移朝着法线方向。

 这部分是优化细节,AO环境遮罩增加立体感,Normal法线贴图,Albedo和Color自定义颜色。

 

 这个default贴图是定义Plane初始值高度的,因为整体而言就是控制高度变化来形成雪地效果,其他都是表现优化,你可以设置到10~20左右的值即可(RGBA值)

DrawImg是被绘制的小图也就是鼠标点击到的地方会绘制出的轮廓图,可见是一个圆形四周RGBA高,越往中间越黑(越低数值)的高度图片。

stamp Shader说明:取DrawImg的图片像素值RGBA去叠加到RT图即(Plane图)的RGBA值,最终输出到屏幕上(通过Graphics.DrawTexture)其中SouceTex是RT图(Plane图),MainTex是DrawImg图,可视化里的节点看着很复杂其实就是采样出DrawImg分别在[-1,0]范围和[0,1]范围的RGBA数值,用[0,1]范围的数值进行对RT图相乘(加权),用[-1,0]范围的数值对相乘后的RT图数值相加,并且保持输出的Alpha值还是MainTex(DrawImg图)的Alpha,最终将它绘制到屏幕鼠标点击的位置上。

说说较难理解的部分:

 这里_SourceUV是DrawImg图所在Plane图的相对UV值求法:

Vector4 sourceUV = new Vector4();
        sourceUV.x = rect.x / rt.width;
        sourceUV.y = 1 - rect.y / rt.height;
        sourceUV.z = rect.width / rt.width;
        sourceUV.w = rect.height / rt.height;
        sourceUV.y -= sourceUV.w;

rt为Plane图的renderertexture,其中x,y是rect(DrawImg图)的坐标左下角点,z,w是DrawImg图的宽高值,这xyzw都要除以相应的Plane图宽或高是为了将它们相对Plane图归一化到[0,1]的空间。 其中, 1 - rect.y 和 最后的 -= sourceUV.w 都是因为笛卡尔坐标系空间不同兼容问题,将Y倒转。比如:假设rect和rt一样大,左手坐标系 Y是0.2,但实际是用右手坐标系就需要变为-0.2,也就是 (1-0.2) - 1。

猜你喜欢

转载自blog.csdn.net/qq_39574690/article/details/122886655