unity shader简介与入门

unity的shader,分为两种模式:固定管线和可编程,其中可编程模式又分为两种:

1.vertex shader和fragment shader组合。

2.Surface shader。

其实Surface shader是顶点和片段shader的混合体而已(只不过比第一种写起来方便)。shader无非就是处理顶点和光照数据 ,输出颜色信息,仅似而已。


顶点着色器:产生纹理坐标,雾坐标,光照计算,然后把它们传递给裁剪阶段。

片段着色器:进行纹理查找,决定什么时候执行纹理查找,是否进行纹理查找,及把什么作为纹理坐标,法线计算。


shader基础架构如下:


Shader "基础/基础0"
{
       //-------------------------------【属性】-----------------------------------------
       Properties
       {
              //纹理
              _MainTex("基本纹理",2D)="White"{TexGen ObjectLinear}     
       }
 
       //---------------------------------【子着色器1】----------------------------------
       SubShader
       {
              //----------------通道---------------
              Pass
              {
                     //设置纹理为属性中选择的纹理
                     SetTexture[_MainTex]{combine texture}
              }
 
       }
 
       //---------------------------------【备胎】----------------------------------------
       //备胎设为Unity自带的普通漫反射
       Fallback" Diffuse "
}


从编辑器可以传入shader的数据类型有7种:


name ("display name", Range (min, max)) =number

定义浮点数属性,在检视器中可通过一个标注最大最小值的滑条来修改。


name ("display name", Color) =(number,number,number,number)

定义颜色属性


name ("display name", 2D) = "name" {options }

定义2D纹理属性


name ("display name", Rect) = "name"{ options }

定义长方形(非2次方)纹理属性


name ("display name", Cube) = "name"{ options }

定义立方贴图纹理属性


name ("display name", Float) = number

定义浮点数属性


name ("display name", Vector) =(number,number,number,number)

定义一个四元素的容器(相当于Vector4)属性


使用如下

Shader "基础/基础1"
{
       Properties{
              
              _WaveScale("Wave scale", Range (0.02,0.15)) = 0.07 // 滑动条
              _ReflDistort("Reflection distort", Range (0,1.5)) = 0.5
              _RefrDistort("Refraction distort", Range (0,1.5)) = 0.4
              _RefrColor("Refraction color", Color)  =(.34, .85, .92, 1) // 颜色
              _ReflectionTex("Environment Reflection", 2D) = "" {} // 纹理
              _RefractionTex("Environment Refraction", 2D) = "" {}
              _Fresnel("Fresnel (A) ", 2D) = "" {}
              _BumpMap("Bumpmap (RGB) ", 2D) = "" {}
       }

 
}


纹理属性在本文的第一个示例中就有用到,这里先再贴一遍2D纹理属性的写法:

 

name ("display name", 2D) ="name" { options }

 

需要注意的是,包含在纹理属性的大括号中的选项Options是可选的。可能的选项有如下:

 

TexGen纹理生成类型。纹理的自动生成纹理坐标时的模式,可以是ObjectLinear, EyeLinear,SphereMap, CubeReflect, CubeNormal的其中之一;这些模式和OpenGL纹理生成模式相对应。注意如果使用自定义顶点程序,那么纹理生成将被忽略。

 

LightmapMode 光照贴图模式如果我们给出这个选项,纹理将能被渲染器的光线贴图属性所影响。纹理不能被使用在材质中,而是取自渲染器的设定。这个我们以后会讲到。



打在对象上的完整光照颜色最终是:

 

 FinalColor=

Ambient * RenderSettings ambientsetting + (Light Color * Diffuse + Light Color *Specular) + Emission


 

翻译过来的中文式子便是:

 

最终颜色=环境光反射颜色* 渲染设置环境设置 +(灯光颜色*漫反射颜色+灯光颜色*镜面反射颜色)+自发光

 

知道了这个式子,我们就知道了,在各种光的综合作用下,我们材质最终的颜色是怎么来的了。

需要注意的是:方程式的灯光部分(也就是带括号的部分)对所有打在对象上的光线都是重复使用的。而我们在写Shader的时候常常会将漫反射和环境光光保持一致(所有内置Unity着色器都是如此)。


参考摘录 浅墨的博客:

http://blog.youkuaiyun.com/poem_qianmo/article/details/40955607



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值