什么是shader(着色器)
Shader是可编程图形管线的算法片段。主要分为两类 Vertex(顶点) Shader和
Fragment(片段) Shader。
什么是渲染管线(生产流水线)
渲染管线也称渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。
一个流水线是一序列可以并行和按照固定顺序进行的阶段。每个阶段都从他的前一阶段接受输出,然后把输出发给随后的阶段。整个流水线处理大量的顶点、集合图元和片段。
Culling Depth Test:裁剪和深度测试,有些面不会被看到,就为了减少计算机压力,将看不到的面进行裁剪。直接剔除。计算机没有无限远的概念,摄像机最近能看到什么地方叫做近切面。存在远切面。 超过这个范围则会进行相应的剔除。
Shader 和材质、贴图之间的关系
Shader(着色器)时加上就是一小段程序,将输入的顶点数据以指定的方式和输出的贴图或者颜色等组合起来,然后输出。绘图的硬件根据这个输出将图像绘制到屏幕上。 将输入的贴图或者颜色,加上相应的shader,shader对应的参数设置,打包在一起形成一个Material(材质)。
总结: 贴图相当于原材料,shader是生产过程中的方式方法,材质是最终形成的商品。
Shader三大主流编程语言
HLSL:基于DirectX
GLSL:基于OpenGL
CG:两个都能使用
着色器编写方式
作为表面着色器(unity默认使用)
作为顶点和片元着色器
作为固定函数着色器
ShaderLab 语法
// 有色顶点光照
Shader "Simple colored lighting"
{// 单个颜色属性Properties {_Color ("Main Color", Color) = (1,.5,.5,1)}// 定义一个子着色器SubShader{// 子着色器中的单个通道Pass{// 使用固定函数每顶点光照Material{Diffuse [_Color]}Lighting On}}
}
Shader “name”{}:定义着色器,着色器以指定的name(名称)显示,也可以是路径。花括号内可选填写属性(Properties ),子着色器,回退等。
Properties {} :花括号内定义属性代码块,这些属性将会出现在材质面板。
数字和滑动条:
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
颜色和矢量:(颜色四个值为RGBA)
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
纹理:
name ("display name", 2D) = "defaulttexture" {} //2D纹理
name ("display name", Cube) = "defaulttexture" {} //立方体贴图
name ("display name", 3D) = "defaulttexture" {} //3D(体积)属性
属性的(name)名字通常由下划线开始。显示的名字(display name)是出现在面板上的名字。逗号后面是属性类型(Int, Float, Range(min,max),Color,vector,2D,Cube,3D)
属性特性:
[HideInInspector] - 不在材质检视面板中显示属性值。
[NoScaleOffset] - 对于具有此特性的纹理属性,材质检视面板不会显示纹理平铺/偏移字段。
[Normal] - 表示纹理属性需要法线贴图。
[HDR] - 表示纹理属性需要高动态范围 (HDR) 纹理。
[Gamma] - 表示在 UI 中将浮点/矢量属性指定为 sRGB 值(就像颜色一样),并且可能需要根据使用的颜色空间进行转换。请参阅着色器程序中的属性。
[PerRendererData] - 表示纹理属性将以 MaterialPropertyBlock 的形式来自每渲染器数据。材质检视面板会更改这些属性的纹理字段 UI。
Fallback(回退):
Shader "example" {// 此处为属性和子着色器...Fallback "otherexample"}
如果没有着色器能在此设备的硬件上运行,尝试使用另一个着色器。
Fallback Off
没有子着色器可以在设备硬件上运行,不会回退,也不会警告。、
SubShader
每个UnityShader文件可以包含多个SubShader语义块,但至少要有一个。Unity会扫描所有的SubShader语义块,选择第一个能在平台上运行的SubShader.
SubShader
{//可选的
Tags { "Queue" = "Transparent" }
//状态设置 可选的
Cull Back Pass{}//或更多Pass
}状态设置
状态名称 设置指令 解释
Cull Cull Back|Front|Off 设置剔除模式,提出背面/正面/关闭
ZTest ZTest Less Greater|LEqual|GEqual|Equal|NoEqual|Always 设置深度测试时使用的函数
ZWrite ZWrite On|Off 开启/关闭深度写入
Blend Blend SrcFactor DstFactor 开启并设置混合模式
渲染状态会应用到所有的Pass(渲染通道),如果不想某些物体双面渲染,可以在Pass语义块中进行单独设置。
SubShader标签(Tags,键值对类型)
结构:Tags{“TagName1”= “Value1” “Tagname2”=Value2}
作用:告诉unity渲染引擎,怎样以及何时渲染对象。
标签类型:
·Queue:控制渲染顺序,指定该物体属于哪一个渲染队列,通过这种方式可以保证所有的透明物体可以在所有不透明物体后面被渲染。(可以自定义渲染队列)
·RenderType:对着色器进行分类,例如这只一个不透明的着色器,后者是以个透明的着色器等,可以用于着色器替换功能。
·DisableBatching: 是否对SubShader使用批处理。
·ForceNoShadowCasting:控制使用该SubShader的物体是否会投射阴影。
·IgnoreProjector:如果为”True”则不会受到Projector的影响。
·CanUseSpriteAtlas:如果着色器用于精灵,则将标签设置为“ False”,并且在将它们打包为地图集时将不起作用。
·PreviewType:知名材质面板将如何预览该材质,默认情况下,材质将显示为一个球星,我们可以通过把该标签的值预设为”Plane”,”SkyBox”来改变预览类型。
Pass语义块:
·我们可以在Pass语义块中定义Pass的名称: Name”MyPassName”通过此名称我们可以在其他shader中调用UsePass”MyShader/MYPASSNAME”(unity会把所有Pass名字转化称成大写)
·Pass也有标签,与SubShader不同,但也是用来告诉unity如何渲染物体的。
·LightMode:定义该Pass在Unity中渲染流水线角色。
·RequireOptions:用于指定满足某些条件时才渲染该Pass,值为一个由空格分隔的字符串。
·GrabPass:该Pass负责抓取屏幕并将结果储存在一张纹理中。