开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1908

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1652|回复: 33

[海莉zhe] 【每日一记】Unity3D 实战练习-Surface Shader (四)【小白篇】

[复制链接]  [移动端链接]
排名
961
昨日变化
2

57

主题

191

帖子

2219

积分

Rank: 9Rank: 9Rank: 9

UID
76890
好友
50
蛮牛币
3179
威望
0
注册时间
2015-3-4
在线时间
767 小时
最后登录
2017-10-23

专栏作家

发表于 2017-9-12 21:40:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 海莉zhe 于 2017-9-12 21:36 编辑

   
        之前的文章里面有写到顶点着色器,今天和大家一起简单学习一下表面着色器;通俗来讲,表面着色器实际上就是封装了CG语言,隐藏了很多光照处理的细节,它的设计初衷是为了让用户使用一些指令(#pragma)就可以完成很多事情,并且封装了很多常用光照模型和函数。

      1.基本定义:
          两个结构体:
            表面着色器(Surface Shader) 的标准输出结构(Input),这个结构体是允许我们自定义,它可以包含一些纹理坐标和其他提前定义的变量,例如

          view direction(float3 viewDir)
          world space position(worldPos)
          world space reflection vector(float worldRefl)
          这些变量只有真正的使用的时候才会被计算的。


          表面着色器(Surface Shader) 的标准输出结构(SurfaceOutput),我们无法自定义这个结构体变量。

           struct SurfaceOutput
         {
               half3 Albedo;      //反射率 -对光源的反射率,它是通过在Fragment Shader 计算颜色叠加,和一些变量(如vertex lights)相乘后,叠到最后的颜色上;
               half3 Normal;     //法线-对应的法线方向,只要是受影响的计算都会受到影响。
               half3 Emission;  //自发光-用于增强物体自身的亮度,使之看起来可以自己发光。
               half  Speculer;    // 镜面-高光反射中的指数部分的系数,影响一些高光反射的计算,也就是在光照模型会使用到(如果你没有光照函数等函数-包含Unity 内置的光照函数,这个变量设置也是没有用的)
               half Gloss;      //光泽-高光反射中的强度系数
               half Alpha;        //透明-可以理解为透明通道
         }


         2.表面着色器使用 #prama surface surfaceFunction lightModel[optionalparams]指令,以声明它是一个表面着色器。

           2.0 surfaceFunction:表示Cg函数中有表面着色器(surface shader)代码,例如格式 void surf(Input IN,inout SurfaceOutput o) ,Input  是自己
定义的结构,Input 结构应该包含所有纹理坐标(texture coordinates)和表面函数(surfaceFunction)所需要的额外必需变量。

           2.1 lightMode: 在光照模式中,内置的是Lambert(diffuse)和 BlinnPhong(specular).

           2.2 optionalparams:包含很多可用的指令类型,包括开启、关闭一些状态,设置生成的Pass 类型,指定可选函数等,除了上述的函数,我们还可以自定义函数:vertex:VertexFunction 和 finalcolor:ColorFunction


          3.下面我们写一个可以调节颜色、凹凸纹理、边缘光照和细节纹理处理的Shader哈!


            3.0 FirstSurface.shader 代码如下:

            
[C#] 纯文本查看 复制代码
Shader "Custom/FirstSurface"
{
        Properties 
        {
                _MainTex ("【主纹理】Texture", 2D) = "white" {}
                _BumpMap ("【凹凸纹理】Bumpmap", 2D) = "bump" {}
                _Detail ("【细节纹理】Detail", 2D) = "gray" {}
                _ColorTint ("【色泽】Tint", Color) = (0.5, 0.3, 0.6, 0.3)
                _RimColor ("【边缘颜色】Rim Color", Color) = (0.2,0.2,0.1,0.0)
                _RimPower ("【边缘颜色强度】Rim Power", Range(0.5,8.0)) = 3.0
        }

        //--------------------------------【子着色器】----------------------------------
        SubShader 
        {
                //-----------子着色器标签----------
                Tags { "RenderType" = "Opaque" }

                //-------------------开始CG着色器编程语言段----------------- 
                CGPROGRAM

                //1.光照模式声明:使用兰伯特光照模式+自定义颜色函数
                #pragma surface surf Lambert finalcolor:setcolor

                //2.输入结构  
                struct Input 
                {
                        
                        float2 uv_MainTex;//主纹理的uv值
                        float2 uv_BumpMap;//凹凸纹理的uv值
                        float2 uv_Detail;//细节纹理的uv值 
                        float3 viewDir;//当前坐标的视角方向
                };


                sampler2D _MainTex;
                sampler2D _BumpMap;
                sampler2D _Detail;
                fixed4 _ColorTint;
                float4 _RimColor;
                float _RimPower;

                //3.自定义颜色函数setcolor函数
                void setcolor (Input IN, SurfaceOutput o, inout fixed4 color)
                {
                        color *= _ColorTint;
                }

                //4.表面着色函数的编写
                void surf (Input IN, inout SurfaceOutput o) 
                {
                        //先从主纹理获取rgb颜色值
                        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;   
                        //设置细节纹理
                                o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2; 
                        //从凹凸纹理获取法线值
                        o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
                        //从_RimColor参数获取自发光颜色
                        half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
                        o.Emission = _RimColor.rgb * pow (rim, _RimPower);
                }

                //-------------------结束CG着色器编程语言段------------------
                ENDCG
        } 

        //“回滚”为普通漫反射  
        Fallback "Diffuse"
}


                   3.1 最后直接看效果图!

                         1.png


本帖被以下淘专辑推荐:


回复

使用道具 举报

4四处流浪
442/500
排名
7135
昨日变化
77

3

主题

160

帖子

442

积分

Rank: 4

UID
146845
好友
1
蛮牛币
646
威望
0
注册时间
2016-4-26
在线时间
143 小时
最后登录
2017-10-23
发表于 2017-9-13 06:29:53 | 显示全部楼层
谢谢楼主 支持一下

回复 支持 反对

使用道具 举报

5熟悉之中
751/1000
排名
8884
昨日变化
122

2

主题

547

帖子

751

积分

Rank: 5Rank: 5

UID
241666
好友
0
蛮牛币
2889
威望
0
注册时间
2017-9-6
在线时间
108 小时
最后登录
2017-10-24
发表于 2017-9-13 07:03:41 来自Mobile--- | 显示全部楼层
感谢分享代码

回复

使用道具 举报

6蛮牛粉丝
1071/1500
排名
2646
昨日变化
10

0

主题

419

帖子

1071

积分

Rank: 6Rank: 6Rank: 6

UID
170014
好友
0
蛮牛币
3647
威望
0
注册时间
2016-9-21
在线时间
224 小时
最后登录
2017-10-23

迈向小康

QQ
发表于 2017-9-13 08:43:12 | 显示全部楼层
地板支持

回复

使用道具 举报

3偶尔光临
205/300
排名
11010
昨日变化
163

0

主题

56

帖子

205

积分

Rank: 3Rank: 3Rank: 3

UID
233213
好友
0
蛮牛币
121
威望
0
注册时间
2017-7-20
在线时间
85 小时
最后登录
2017-10-23
发表于 2017-9-13 09:06:48 | 显示全部楼层
6666666666666666

回复 支持 反对

使用道具 举报

4四处流浪
384/500
排名
6726
昨日变化
55

1

主题

176

帖子

384

积分

Rank: 4

UID
233607
好友
1
蛮牛币
332
威望
0
注册时间
2017-7-22
在线时间
61 小时
最后登录
2017-10-23
发表于 2017-9-13 12:29:13 | 显示全部楼层
厉害                  

回复 支持 反对

使用道具 举报

4四处流浪
384/500
排名
6726
昨日变化
55

1

主题

176

帖子

384

积分

Rank: 4

UID
233607
好友
1
蛮牛币
332
威望
0
注册时间
2017-7-22
在线时间
61 小时
最后登录
2017-10-23
发表于 2017-9-13 13:01:39 | 显示全部楼层
[发帖际遇]: 2695648715 在论坛发帖时没有注意,被小偷偷去了 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
712/1000
排名
4394
昨日变化
22

0

主题

244

帖子

712

积分

Rank: 5Rank: 5

UID
201920
好友
0
蛮牛币
337
威望
0
注册时间
2017-1-14
在线时间
214 小时
最后登录
2017-10-23
发表于 2017-9-14 08:26:50 | 显示全部楼层
6666666666666

回复

使用道具 举报

5熟悉之中
825/1000
排名
1982
昨日变化
1

0

主题

67

帖子

825

积分

Rank: 5Rank: 5

UID
182722
好友
0
蛮牛币
1764
威望
0
注册时间
2016-11-10
在线时间
208 小时
最后登录
2017-10-22
发表于 2017-9-14 09:48:42 | 显示全部楼层
签到。。。。。。
[发帖际遇]: 1325756104 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
17344
昨日变化
5

0

主题

29

帖子

87

积分

Rank: 2Rank: 2

UID
209237
好友
0
蛮牛币
118
威望
0
注册时间
2017-3-1
在线时间
34 小时
最后登录
2017-10-17
发表于 2017-9-14 10:30:38 | 显示全部楼层
感谢大佬。666666
[发帖际遇]: liyushuang 在论坛发帖时没有注意,被小偷偷去了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

3偶尔光临
218/300
排名
9492
昨日变化
134

0

主题

69

帖子

218

积分

Rank: 3Rank: 3Rank: 3

UID
139869
好友
0
蛮牛币
230
威望
0
注册时间
2016-3-14
在线时间
67 小时
最后登录
2017-10-23
发表于 2017-9-14 10:44:07 | 显示全部楼层
thank u for share
[发帖际遇]: julyjess 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
816/1000
排名
6221
昨日变化
53

6

主题

322

帖子

816

积分

Rank: 5Rank: 5

UID
168159
好友
2
蛮牛币
3432
威望
0
注册时间
2016-9-12
在线时间
330 小时
最后登录
2017-10-23

迈向小康

发表于 2017-9-14 10:53:15 | 显示全部楼层
test12580在论坛发帖时没有注意,被小偷偷去了 1 蛮牛币.
[发帖际遇]: ceshi12580 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

3偶尔光临
183/300
排名
8492
昨日变化
106

2

主题

20

帖子

183

积分

Rank: 3Rank: 3Rank: 3

UID
159585
好友
0
蛮牛币
162
威望
0
注册时间
2016-7-30
在线时间
61 小时
最后登录
2017-10-23
发表于 2017-9-14 12:25:33 | 显示全部楼层
学习学习

回复

使用道具 举报

3偶尔光临
174/300
排名
9749
昨日变化
127

2

主题

40

帖子

174

积分

Rank: 3Rank: 3Rank: 3

UID
230741
好友
0
蛮牛币
279
威望
0
注册时间
2017-7-7
在线时间
54 小时
最后登录
2017-10-23
发表于 2017-9-14 14:35:23 | 显示全部楼层
给楼主点赞!!

回复

使用道具 举报

排名
2619
昨日变化

5

主题

54

帖子

781

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
146655
好友
1
蛮牛币
1057
威望
0
注册时间
2016-4-25
在线时间
290 小时
最后登录
2017-10-17
发表于 2017-9-14 14:55:10 | 显示全部楼层
感谢分享  ! 抓紧学习一波 !

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表