geometry shader lod_geometry dash_heal geometry(10)

电脑杂谈  发布时间:2017-05-21 13:14:27  来源:网络整理

接下来改变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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...