接下来改变Input的内容:
相对于上面的Shader输入来说,加入了一个float3 worldNormal; INTERNAL_DATA,如果SuceOutput中设定了Normal的话,通过worldNormal可以获取当前点在世界中的法线。详细的解说可以参见Unity的Shader文档。接下来可以改变surf函数,实装积雪效果了。
void surf (Input IN, inout SuceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump));
if (dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz) > lerp(1,-1,_Snow)) {
o.Albedo = _SnowColor.rgb;
} else {
o.Albedo = c.rgb;
}
o.Alpha = c.a;
}
和上面相比,加入了一个if…else…的判断。首先看这个条件的不等式的左侧,我们对雪的方向和和输入点的世界法线方向进行点积。WorldNormalVector通过输入的点及这个点的法线,来计算它在世界坐标中的方向;右侧的lerp函数相信只要对插有概念的同学都不难理解:当Snow取最小1时,这个函数将返回1,而Snow取最大时,返回-1。这样我们就可以通过设定Snow的来控制积雪的阈,要是积雪等级Snow是0时,不等式左侧不可能大于右侧,因此完全没有积雪;相反要是_Snow取最大1时,由于左侧必定大于-1,所以全模型积雪。而随着取中间的变化,积雪的情况便会有所不同。
应用这个Shader,并且适当地调节一下积雪等级和颜色,可以得到如下右边的效果。
添加了积雪效果的Shader
更改顶点模型
到现在位置,我们还仅指是在原贴图上进行操作,不管是用法线图使模型看起来凸凹有致,还是加上积雪,所有的计算和颜色的输出都只是“障法”,并没有对模型有任何实质的改动。但是对于积雪效果来说,实际上积雪是附加到石头上面,而不应当简单替换掉原来的颜色。但是具体实施起来,最简单的办法还是直接替换颜色,但是我们可以稍微变更一下模型,使原来的模型在积雪的方向稍微变大一些,这样来达到一种雪是附加到石头上的效果。
我们继续修改之前的Shader,首先我们需要告诉suce shadow我们要改变模型的顶点。首先将#param行改为
#pragma suce surf CustomDiffuse vertex:vert
这告诉Shader我们想要改变模型顶点,并且我们会写一个叫做vert的函数来改变顶点。接下来我们再添加一个参数,在Properties中声明一个_SnowDepth变量,表示积雪的厚度,当然我们也需要在CG段中进行声明:
//In Properties{…}
_SnowDepth ("Snow Depth", Range(0,0.3)) = 0.1
//In CG declare
float _SnowDepth;
接下来实现vert方法,和之前积雪的运算其实比较类,判断点积大小来决定是否需要扩大模型以及确定模型扩大的方向。在CG段中加入以下vert方法
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-48390-10.html
靠发股发财