天天看点

U3D Shader笔记(1)UnityShader组织形式UniyShader的形态

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"
}
           

继续阅读