您的位置:首页 > 其它

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

2015-07-27 08:03 387 查看

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

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

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

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

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

/article/1324925.html

/article/1383377.html

先上一下我用的素材。








这个是暖羊羊头像的那篇博客里做完的效果。




[code]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中找。

这个是那个头像是一个女孩吃西瓜的效果。



[code]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来学习,毕竟那个版本的教程多而且也方便掌握。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: