天才的大三暑假修行之旅.表面着色器(二)

来源:互联网 发布:广州男装网络批发 编辑:程序博客网 时间:2024/04/30 05:27

天才的大三暑假修行之旅.表面着色器(二)

肯定很多人看了那么多人讲着色器的文章之后都有一个疑问,这Input结构体是干什么的,到底需不需要定义里面的参数。先后写了几个例子发现然并卵。后来看了这一篇文章:

http://unity3d.9tech.cn/news/2013/1202/39031.html

虽然没怎么讲Input,但是有一句顺带的讲了一下Input的作用。“Input其实是需要我们去定义的结构,这给我们提供了一个机会,可以把所需要参与计算的数据都放到这个Input结构中,传入surf 函数使用”。如果大家要是有什么好的对Input的理解也可以写下留言。

接着就是表面着色器实战了。这里分别是两个大神的uv部分的讲解。而且都是实现水纹。

http://blog.csdn.net/dbtxdxy/article/details/44737133
http://blog.csdn.net/candycat1992/article/details/17754427

先上一下我用的素材。
这里写图片描述
这里写图片描述
这个是暖羊羊头像的那篇博客里做完的效果。
这里写图片描述

Shader "Surface/SSeven" {    Properties {        _MainTex ("MainText", 2D) = "white" {}        _BaseTex("BaseText",2D)="white"{}        _XSpeedOne("XSpeedOne",float)=0        _YSpeedOne("YSpeedOne",float)=0        _XSpeedTwo("XSpeedTwo",float)=0        _YSpeedTwo("YSpeedTwo",float)=0    }    SubShader {        Tags { "RenderType"="Opaque" }        LOD 200        CGPROGRAM        // Physically based Standard lighting model, and enable shadows on all light types        #pragma surface surf Standard fullforwardshadows         // Use shader model 3.0 target, to get nicer looking lighting        #pragma target 3.0        sampler2D _MainTex;        sampler2D _BaseTex;        float _XSpeedOne;        float _YSpeedOne;        float _XSpeedTwo;        float _YSpeedTwo;        struct Input {            float2 uv_MainTex;        };        void surf (Input IN, inout SurfaceOutputStandard o) {            float2 First=IN.uv_MainTex;            float2 Sec=IN.uv_MainTex;            First+=float2(_XSpeedOne*_Time.y,_YSpeedOne*_Time.y);            Sec+=float2(_XSpeedTwo*_Time.y,_YSpeedTwo*_Time.y);            half4 FResult=tex2D(_MainTex,First);            half4 SResult=tex2D(_BaseTex,Sec);            o.Albedo=FResult.rgb*0.5+SResult.rgb*0.5;            o.Alpha=1.0;        }        ENDCG    }     FallBack "Diffuse"}

这里写图片描述

这里我把在哪里设置Shader的截图贴了出来,大家可能直接复制粘贴之后发现在Custom没有,因为我定义为Surface了,在Surface中找。

这个是那个头像是一个女孩吃西瓜的效果。
这里写图片描述

Shader "Surface/SEight" {    Properties {        _MainTex ("Albedo (RGB)", 2D) = "white" {}        _XSpeed("XSpeed",float)=0        _YSpeed("YSpeed",float)=0    }    SubShader {        Tags { "RenderType"="Opaque" }        LOD 200        CGPROGRAM        // Physically based Standard lighting model, and enable shadows on all light types        #pragma surface surf Standard fullforwardshadows        // Use shader model 3.0 target, to get nicer looking lighting        #pragma target 3.0        sampler2D _MainTex;        float _XSpeed;        float _YSpeed;        struct Input {            float2 uv_MainTex;        };        void surf (Input IN, inout SurfaceOutputStandard o) {            float2 Temp=IN.uv_MainTex;            Temp+=float2(_XSpeed*_Time.y,_YSpeed*_Time.y);            o.Albedo = tex2D (_MainTex, Temp).rgb;        }        ENDCG    }     FallBack "Diffuse"}

其实两个人的原理都是产不多的。只不过第一个人用了2张图片来做水的效果,所以显得更加逼真一些。但是效果都不是那么令人满意,为什么呢,因为水有水波,波纹会浮动变化,而两种方法只是进行平移而已。以后再看看有没有更好的实现方法。

再说说编程中遇见的困难,我学习Shader是从Unity5开始的。发现很多地方都有区别。而且上一篇也说了SurfaceOutputStandard与SurfaceOutput不通用。现在教大家一个在Unity5上使用之前Shader的方法。因为新版的支持物理光,这是官网的介绍。所以只要把物理光的定义给删了就变成旧的Shader编辑方式了。

http://docs.unity3d.com/Manual/SL-SurfaceShaders.html

而且UNITY5吧,默认没有标准包的,要去官网下载。本来有一个天空盒子的Shader练习也因此做不了了。所以大家要是学习基础,参考网上教程的话还是用4.X的unity来学习,毕竟那个版本的教程多而且也方便掌握。

0 0
原创粉丝点击