TA-Shader-文件 【浅墨Unity3D Shader编程】之七 暗黑城堡篇(中)
发布于
2017-8-31
2228
9
TA资源类型
TA资源类型: 算法思路 
shader资源类型: shader代码 
适用引擎: unity 
资源介绍: -

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

x
五、写Shdaer实战



上面都是些概念,下面我们将进行一些实战的Shader书写,将学到的这些概念用到实际当中去。
本次我们将讲解9个表面SurfaceShader的写法,从最基本的Surface Shader,循序渐进,一点一点加功能,到最后的稍微有点复杂的“凹凸纹理+颜色可调+边缘光照+细节纹理“表面Shader的写法。本期的全部Shader的合照如下:
SouthEast.jpg



在材质界面菜单中的显示:
SouthEast.jpg



OK,下面开始讲解,从最基本的开始。





1.最基本的Surface Shader

先看一个使用内建光照模式的最基本的Surface Shader应该怎么写:

[cpp] view plain copy


  • Shader "浅墨Shader编程/Volume6/24.最基本的SurfaceShader"
  • {
  •     //--------------------------------【子着色器】----------------------------------
  •     SubShader
  •     {
  •         //-----------子着色器标签----------
  •         Tags { "RenderType" = "Opaque" }
  •         //-------------------开始CG着色器编程语言段-----------------
  •         CGPROGRAM
  •         //【1】光照模式声明:使用兰伯特光照模式
  •         #pragma surface surf Lambert
  •         //【2】输入结构
  •         struct Input
  •         {
  •             //四元素的颜色值(RGBA)
  •             float4 color : COLOR;
  •         };
  •         //【3】表面着色函数的编写
  •         void surf (Input IN, inout SurfaceOutput o)
  •         {
  •             //反射率
  •             o.Albedo = float3(0.5,0.8,0.3);//(0.5,0.8,0.3)分别对应于RGB分量
  •             //而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
  •         }
  •         //-------------------结束CG着色器编程语言段------------------
  •         ENDCG
  •     }
  •     //“备胎”为普通漫反射
  •     Fallback "Diffuse"
  • }





可以发现,一个最基本的Surface Shader,至少需要有光照模式的声明、输入结构和表面着色函数的编写这三部分。


另外,主要注意其中的surf函数的写法,就是把上文讲到的Surface Output结构体中需要用到的成员变量拿来赋值:

[cpp] view plain copy


  • //【2】表面着色函数的编写
  • void surf (Input IN, inout SurfaceOutput o)
  • {
  •        //反射率
  •        o.Albedo= float3(0.5,0.8,0.3);//(0.5,0.8,0.3)分别对应于RGB分量
  •        //而o.Albedo = 0.6;等效于写o.Albedo =float3(0.6,0.6,0.6);
  • }




注释中已经写得很明白,且之前也已经讲过,o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
来个举一反三,则o.Albedo =1;等效于写o.Albedo= float3(1,1,1);

我们将此Shader编译后赋给材质,得到如下效果:




而在场景中的实测效果为:








2.颜色可调

在最基本的Surface Shader的基础上,加上一点代码,就成了这里的可调颜色的Surface Shader:

[cpp] view plain copy


  • Shader "浅墨Shader编程/Volume6/25.颜色可调的SurfaceShader"
  • {
  •     //--------------------------------【属性】---------------------------------------
  •     Properties
  •     {
  •         _Color ("【主颜色】Main Color", Color) = (0.1,0.3,0.9,1)
  •     }
  •     //--------------------------------【子着色器】----------------------------------
  •     SubShader
  •     {
  •         //-----------子着色器标签----------
  •         Tags { "RenderType"="Opaque" }
  •         //-------------------开始CG着色器编程语言段-----------------
  •         CGPROGRAM
  •         //【1】光照模式声明:使用兰伯特光照模式
  •         #pragma surface surf Lambert
  •         //变量声明
  •         float4 _Color;
  •         //【2】输入结构
  •         struct Input
  •         {
  •             //四元素的颜色值(RGBA)
  •             float4 color : COLOR;
  •         };
  •         //【3】表面着色函数的编写
  •         void surf (Input IN, inout SurfaceOutput o)
  •         {
  •             //反射率
  •             o.Albedo = _Color.rgb;
  •             //透明值
  •             o.Alpha = _Color.a;
  •         }
  •         //-------------------结束CG着色器编程语言段------------------
  •         ENDCG
  •     }
  •     //“备胎”为普通漫反射
  •     FallBack "Diffuse"
  • }




我们将此Shader编译后赋给材质,得到如下效果,和之前的固定功能Shader一样,可以自由调节颜色:




其在场景中的实测效果为:










3.基本纹理载入


再来看看如何实现一个基本的纹理载入Surface Shader:

[cpp] view plain copy


  • Shader "浅墨Shader编程/Volume6/26.基本纹理载入"
  • {
  •     //--------------------------------【属性】----------------------------------------
  •     Properties
  •     {
  •         _MainTex ("【主纹理】Texture", 2D) = "white" {}
  •     }
  •     //--------------------------------【子着色器】----------------------------------
  •     SubShader
  •     {
  •         //-----------子着色器标签----------
  •         Tags { "RenderType" = "Opaque" }
  •         //-------------------开始CG着色器编程语言段-----------------
  •         CGPROGRAM
  •         //【1】光照模式声明:使用兰伯特光照模式
  •         #pragma surface surf Lambert
  •         //【2】输入结构
  •         struct Input
  •         {
  •             //纹理的uv值
  •             float2 uv_MainTex;
  •         };
  •         //变量声明
  •         sampler2D _MainTex;
  •         //【3】表面着色函数的编写
  •         void surf (Input IN, inout SurfaceOutput o)
  •         {
  •             //从纹理获取rgb颜色值
  •             o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
  •         }
  •         //-------------------结束CG着色器编程语言段------------------
  •         ENDCG
  •     }
  •     //“备胎”为普通漫反射
  •     Fallback "Diffuse"
  • }




我们将此Shader编译后赋给材质,得到如下效果:



场景中的实测效果图为:

本帖被以下画板推荐:

还没有设置签名!您可以在此展示你的链接,或者个人主页!

使用道具 举报 登录

回复 <
qq_刘洋_Lc4  发表于 2018-1-8 15:01:24  
2#
厉害了~
回复 收起回复
使用道具
ltmz1111  发表于 2018-1-14 14:28:42  
3#
元素那么大,我想来看看!
回复 收起回复
使用道具
炽炎红尘  发表于 2018-10-18 10:20:55  
4#
请选择您此刻的心情图片并写下今天最想说的话!
回复 收起回复
使用道具
An.w  发表于 2018-10-18 10:29:52  
5#
感谢分享
回复 收起回复
使用道具
zxg4456721  发表于 2018-10-18 16:11:22  
7#
好作品。
回复 收起回复
使用道具
残破の羽翼  发表于 2018-10-23 21:40:11  
8#
66666666
回复 收起回复
使用道具
tff3388414  发表于 2018-10-24 10:15:26  
9#
       
天下武功出少林,世界资源入元素
回复 收起回复
使用道具
tim_chen  发表于 2018-11-22 13:41:20  
10#
下午好
回复 收起回复
使用道具

快来发表你宝贵的意见吧!

大芸彩 实名

通过了实名认证的内容创造者

  

  • 价格:260元素币

  • 主题
    22
    精华
    4
    超神
    0
    扩散
    288
    微金
    2471
    智慧
    11
    余额
    0
    在线时间
    651 小时

    学徒法袍 长枪 火元素

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