U3D Shader笔记(1)UnityShader组织形式
UniyShader的形态
surface shaders
vertex and fragment shaders
fixed function shaders
Shaderlab基本结构
shader "name"{
[Properties]
SubShaders
[FallBack]
}
Properties
可以在材质监视面板上显示的属性
_Name(“Display Name”, type) = defaultBalue[{options}]
_Name
属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
Display Name
这个字符串将显示在Unity的材质编辑器中作为Shader的使用者可读的内容
type
这个属性的类型,可能的type所表示的内容有以下几种
COLOR | 颜色,由RGBA(红绿蓝和透明度)四个量来定义 |
---|---|
2D | 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来 |
Cube | 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样 |
Rect | 一个非2阶数大小的贴图 |
Range(min, max) | 一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等) |
Float | 任意一个浮点数 |
Vector | 一个四维数 |
defaultValue
定义了这个属性的默认值,通过输入一个符合格式的默认值来指定对应属性的初始值(某些效果可能需要某些特定的参数值来达到需要的效果,虽然这些值可以在之后在进行调整,但是如果默认就指定为想要的值的话就省去了一个个调整的时间,方便很多)
COLOR | 以0~1定义的rgba颜色,比如(1,1,1,1) |
---|---|
2D,Rect,Cube | 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者"white",“black”,“gray”,"bump"中的一个 |
Float ,Range(min, max) | 某个指定的浮点数 |
Vector | 一个4维数,写为 (x,y,z,w) |
{option}
它只对2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个,这些都是OpenGL中TexGen的模式
属性案例代码:
Properties { Property [Property …] }
定义属性块,其中可包含多个属性,其定义如下:
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)属性
SubShader
为GPU编写的shder片段,可以有并必须有一个subshader,当有多个subshader显卡会选择一个subshader执行。由于硬件不同,所以会有多个subshader,当这个shader文件执行时会按顺序检测每个subshader是否能被良好的执行,如果可以则执行这个subshader,如果不能则检测下一个。
FallBack
如果我们定义的subshader在当前硬件都无法执行,则执行fallback所制定的着色器,往往时系统的比较简单的。
Unlit | 不发光。只是一个纹理,不被任何光照影响 |
---|---|
VertexLit | 顶点光照 |
Diffuse | 漫发射 |
Normal mapped | 法线贴图,比漫反射更加昂贵:增加了一个或多个纹理(法线贴图)和几个着色器结构 |
Specular | 高光。增加了高光计算 |
Normal Mapped Specular | 高光法线贴图。比高光昂贵一点 |
Parallax Normal mapped | 视差法线贴图。增加了视差法线贴图计算 |
Parallax Normal Mapped Specular | 视差高光法线贴图。增加了视差法线贴图和镜面高光计算 |
Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", float) = 0.0
}
SubShader {
}
FallBack "Diffuse"
}