Unity Shaders表面着色器

来源:互联网 发布:javascript 构造函数 编辑:程序博客网 时间:2024/05/21 10:44

1、创建基本的表面着色器

在Assets 中创建文件夹 ,命名为 Materials 。 在 Materials 里面 Create 一个 Shader 。再创建一个 Material 。都命名为 BasicDiffuse 。

打开BasicDiffuse.shader 。里面默认已经添加了 基本的漫反射着色器 代码,这个Shader 接受一个 纹理信息 。

把自动创建的 Shader 改名,如下:

Shader "CookBookShaders/BasicDiffuse" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM
#pragma surface surf Lambert


sampler2D _MainTex;


struct Input {
float2 uv_MainTex;
};


void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG

FallBack "Diffuse"
}

选择上面创建的 Material ( BasicDiffuse.mat ) , 在 Inspector 中,点击下拉框,选择上面创建的 Shader ( CookBookShaders/BasicDiffuse ) ,这样就将着色器 赋给了 材质 。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

然后创建一个 Cube ,把 BasisDiffuse.mat 拖到 Cube 上。

Properties 区域 着色器中的属性

在 Shader 中的 Properties ,对应着 同名的变量,这就类似于 Properties 中的是 变量的 名字字符串。Unity 通过读取 Properties 中的属性 来创建对应的编辑器控件,显示在 Inspector 窗口上,让我们很方便的去编辑这个属性的值。


Properties 中属性的格式如下:

_EmissiveColor : 变量名

"Emissive Color" : 编辑器中 Inspector面板上显示的名称

Color : 变量类型

(1,1,1,1) :默认值


转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

我们来添加一个着色器属性

修改默认的 Shader代码,删除默认的 _MainTex 属性

修改 Properties 块如下:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Properties {  
  2.     _EmissiveColor("Emissive Color",Color) = (1,1,1,1) //设置默认值  
  3. }  

返回 Unity 查看,现在能在编辑器中看到 Emissive Color 这个设置



再添加一个 Range 属性

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Properties {  
  2.         _EmissiveColor("Emissive Color",Color) = (1,1,1,1) //设置默认值  
  3.         _EmissivePowValue("EmissivePow Value",Range(0,10)) = 1  
  4.     }  

Range 是一个范围,在编辑器中是一个滑动条



好,已经添加了属性,下面来使用这两个属性。


2.2 、在着色器中使用属性

首先删除原来的代码 ,这句代码中声明了一个变量 _MainTex  ,对应我们之前删除的 _MainTex 属性。我们删掉它  添加我们自己的变量

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sampler2D _MainTex;  

然后下面的 surf 函数中用到 _MainTex 的代码也删除

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. half4 c = tex2D (_MainTex, IN.uv_MainTex);  

对应上面新增的两个属性,添加我们的同名变量。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. float4 _EmissiveColor  
  2. float _EmissivePowValue  


然后在 surf 函数中使用这两个新增的变量

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void surf (Input IN, inout SurfaceOutput o) {  
  2.     float4 c;  
  3.     c=pow(_EmissiveColor,_EmissivePowValue);  
  4.     o.Albedo = c.rgb;  
  5.     o.Alpha = c.a;  
  6. }  


转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

完整的 BasicDiffuse.shader

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Shader "CookBookShaders/BasicDiffuse" {  
  2.     Properties {  
  3.         _EmissiveColor("Emissive Color",Color) = (1,1,1,1) //设置默认值  
  4.         _EmissivePowValue("EmissivePow Value",Range(0,10)) = 1  
  5.     }  
  6.     SubShader {  
  7.         Tags { "RenderType"="Opaque" }  
  8.         LOD 200  
  9.           
  10.         CGPROGRAM  
  11.         #pragma surface surf Lambert  
  12.   
  13.         float4 _EmissiveColor;  
  14.         float _EmissivePowValue;  
  15.   
  16.         struct Input {  
  17.             float2 uv_MainTex;  
  18.         };  
  19.   
  20.         void surf (Input IN, inout SurfaceOutput o) {  
  21.             float4 c;  
  22.             c=pow(_EmissiveColor,_EmissivePowValue);  
  23.             o.Albedo = c.rgb;  
  24.             o.Alpha = c.a;  
  25.         }  
  26.         ENDCG  
  27.     }   
  28.     FallBack "Diffuse"  
  29. }  

Pow :求幂函数,例如 Pow(2,3) = 8 


修改完代码之后,再到 Unity中查看。调解 滑动条,就能看到不同的效果。



在 Shader 中,对指定的 _EmissiveColor 进行了 以 _EmissivePowValue 为指数的求幂。

在编辑器中对 EmissiveColor   指定的值是 0-255 范围的,这个值在 Shader 中被 规格化为 0-1 。

所以随着 EmissivePowValue 的值越来越大,c=pow(_EmissiveColor,_EmissivePowValue); 这个求的值里面的 RGBA 是越来越小,逼近 0 ,所以慢慢得,方块就变成了黑色。




0 0
原创粉丝点击