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