Shader简介及基础结构
一、什么是Shader?
Shader是运行在图形处理单元(GPU)上的程序。
二、Unity中的Shader的三种基本类型
1. 固定功能着色器:使用固定功能为固定渲染管线做具体表现,功能较简单,兼容比较老机器,逐渐落伍不作为重点。
2. 表面着色器:在Unity中,表面着色器的关键代码是使用Cg/HLSL语言编写的,然后嵌套在ShaderLab的结构代码中使用。使用表面着色器,用户仅需要编写最关键的表面函数,其余将有Unity自动生成,包括适配各种光源,渲染实时阴影以及集成到前向/延迟渲染管线中等。
3. 顶点片段着色器:顶点片段着色器运行于具有可编程渲染管线的硬件上,它包括顶点着色器Vertex Programs和片段着色器Fragment Programs。在使用顶点着色器或片段着色器进行渲染时,图形硬件的固定功能管线会关闭,具体来说就是编写的顶点程序会替换掉固定管线中标准的3D变换,光照,纹理坐标生成等功能,片段程序会替换掉SetTexture命令中的纹理混合模式。
三、Shader中代码涉及的一些知识点
1.API
Direct3D是微软树立的API规范,目前只在Windows平台使用。
OpneGL是Linux树立的API规范,主要使用在移动端IOS和安卓。
所以在这部分可以通过开发游戏的方向去深入研究对应API来优化性能。
2. Shader Lab
Unity作为很好的跨平台开发引擎,通过ShaderLab作为说明性语言来编写Shader,然后再根据不同的平台生成出对应语言的Shader。
3. Shader的三种语言
HLSL语言,支持Direct3D编写着色器。
Cg语言,英伟达和微软合作产物,支持Direct3D和OpenGL。
GLSL语言,支持OpenGL编写着色器。
四、Shader的基本结构
1. Shader命名和路径
2. Properties这里面的属性是都公开到编辑器中,可以在材质中编辑的变量。
3. SubShader 子着色器列表 子着色器可以有一个也可以有多个。
4. FallBack 回滚/降级操作 如果子着色器出现显卡不支持,回退到某个或者默认材质执行。
五、Properties语义块中支持的属性类型
属性中的变量类型:浮点数,整数,颜色和四维向量,2D纹理属性,矩形纹理属性,立方体纹理属性,3D纹理属性。
说明:_Int(“Int”,Int) = 2
第一个是参与代码计算的属性名字,第二个是公开到编辑器中看到的,也就是材质球上的变量名,第三个是这个变量的类型。
举例:_Angle(“角度”,Range(0,90)) = 45
这句的意思就是我生成了一个叫Angle的变量,在材质球上看到的属性叫角度,它的浮点数区间在0-90之间,默认给了45.
六、子着色器中的标签Tag
1. Tag{“标签1”=”value1” “key2”=”value2”}
2. 标签的类型
Queue 渲染队列
RenderType 渲染类型
Disable Batching 禁用批处理标签
ForceNoShadowCasting 控制投影标签
IgnoreProjector 忽略投影标签
CanUseSpriteAtlas 使用精灵图集标签
PreviewType 预览类型标签
3. 通道标签
七、顶点着色器和片段着色器的计算
其主要过程就是不同属性计算的过程,主要是计算机图形学的算法,通常包括,空间位置,法向量,纹理坐标,顶点颜色,变换矩阵,光照参数,颜色等。
八、参考资料
Unity Shader 入门精要
shader的三大着色器
Unity3D的Shader基础结构
Shader 知识点
shader基本结构