void vert (inout appdata_full v) {
float4 sn = mul(transpose(_Object2World) , _SnowDirection);
if(dot(v.normal, sn.xyz) >= lerp(1,-1, (_Snow * 2) / 3)) {
v.vertex.xyz = (sn.xyz v.normal) * _SnowDepth * _Snow;
}
}
和surf的原理差不多,系统会输入一个当前的顶点的,我们根据需要计算并填上新的作为返回即可。上面第一行中使用transpose方法输出原矩阵的转置矩阵,在这里_Object2World是Unity ShaderLab的内建,它表示将当前模型转换到世界坐标中的矩阵,将其与积雪方向做矩阵乘积得到积雪方向在物体的世界空间中的投影(把积雪方向转换到世界坐标中)。之后我们计算了这个世界坐标中实际的积雪方向和当前点的法线的点积,并将结果与使用积雪等级的2/3进行比较lerp后的阈比较。这样,当前点如果和积雪方向一致,并且积雪较为完整的话,将改变该点的模型顶点高度。
加入模型更改前后的效果对比如下图,加入模型调整的右图表现要更为丰满真实。
image
这节就到这里吧。本节中实现的Shader可以在这里找到完整版本进行参考,希望大家周末愉快~
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-48390-11.html
希望双方透露更多细节