Unity Shader编程 基础总结
Shader编程一直是一个比较难入门难上手的主题,本篇文章主要是对Unity Shader编程的一些基础和要点做了总结。包括Shader编程相关知识图谱、Shader编程相关数据类型、Shader核心结构体等(后续继续补充)。每个部分相互独立,可以单独参考,亦可作为一个整体参考,希望可以帮到大家。
一、Shader编程知识图谱
(.xmind源文件下载地址:http://www.duzixi.com/doc/ShaderStudy.xmind)
之所以屏幕上能够看到一个模型物体,一个是要有这样的“形”,这个信息保存在网格(Mesh)里,另一方面就是有颜色,也就是材质(Material)材质。
当然还有一个前提,就是这个物体在可视范围之内,也就是Camera(摄像机)。
决定材质如何上色的方式,就是Shader(着色器),Shader编程中涉及到的一些基本概念与这三者紧密相关。
首先,网格的顶点坐标会直接影响像素着色的位置,法线和切线会影响光照阴影的呈现方式,而uv坐标决定了贴图采样的颜色等。
其次,Unity引擎中用脚本对Shader复制的方式是通过Material类(材质)的SetXXXX系列方法来实现的,它是脚本与Shader的重要接口之一。
最后,摄像机的位置决定了视线和世界坐标转视图坐标的矩阵值,而组件属性中渲染路径的选择也会决定Shader渲染所选择的通道。
即使没有编写过Shader,我们都在有意无意的使用Shader。
Unity引擎内置的Shader主要依据用途和呈现效果划分,
普通(Nromal)、透明(Transparent)、自发光(Self Illuminated)、反射(Reflective)这一部分内容官方文档已经解释得很详细了。
此外,粒子(Particle)这个系列的Shader特别值得一提。
为什么粒子特效会如此靓丽炫酷,带来视觉效果呢?
其实粒子材质,即Shader和贴图发挥了很大的作用。
Shader中的颜色模型是大家熟知的RGBA模型,单一颜色光的取值范围在0~1之间。
值越大,说明光越强,也就越亮;反之越暗。(0,0,0,1)为黑色,(1,1,1,1)为白色。
这决定了两种基本的颜色叠加模式:加法(Additive)和乘法(Multiply)。
前者越叠加越亮,后者越叠加越暗(可在Particle的内置Shader中找到)。
一个立体的3D模型,在一定的光照情况下,会是什么样子?
画面对“光”的呈现,是靠“影”来完成的。而英文中的“影”就是shade,是指有影的东西,按照英文语法习惯就是shader了。
所以着色器(Shader)的出发点和本元,应该是如何更好的产生阴影。
在计算机中,阴影的计算是靠光照模型完成的。
光照模型有很多,最基本的是以下两种:
- Lambert
- Blinn-Phong
有了基本的Shader编程知识之后,就可以尝试自己动手写Shader了。
Shader编程中比较麻烦的一点是,同一个变量在不同的语法阶段表示的方式不同,常用变量类型对照如下:
硬件平台 | CPU | (Inspector面板设置) | GPU |
变量类型 | C#脚本语言 | ShaderLab 属性 | Cg语言 |
纹理贴图 | Texture | 2D | sampler2D |
颜色 | Color | Color | fixed4 / half4 |
3D贴图 | Cubemap | Cube | sampleCUBE |
4元素向量 | Vector4 | Vector | float4 |
浮点数 | float | Float | float |
浮点范围 | float | Range | float |
矩形纹理 | Texture | Rect | sampleRect |
Cg语言中颜色类型使用4维向量表示的,根据精度选择,可选用fixed4或者half4等。
三、Shader核心结构体
(1)顶点着色器输入结构体
结构体也可以自定义,但是必须有位置信息
成员类型 | 成员名 | 结构体名: | appdata_base | appdata_tan | appdata_full | appdata_img |
float4 | vertex | 位置 | 1 | 1 | 1 | 1 |
float3 | normal | 法线 | 1 | 1 | 1 | |
float4 | tangent | 切线 | 1 | 1 | ||
fixed4 | color | 顶点颜色 | 1 | |||
float4 | texcoord | 纹理坐标0 | 1 | 1 | 1 | 1 |
fixed4 | texcoord1 | 纹理坐标1 | 1 |
(2)表面着色器输出结构体
SurfaceOutput | ||
half3 | Abedo | 反射光 |
half3 | Normal | 法线 |
half3 | Emission | 自发光 |
half | Specular | 高光 |
half | Alpha | 透明度 |
Shader编程参考资料整理如下:
【1】Unity 官方文档: Manual -> Graphics -> Graphics Reference -> Shader Reference
【2】Unity内建Shader下载地址:http://unity3d.com/unity/download/archive
【3】Nvidia开发者入口:https://developer.nvidia.com
【4】AMD开发者入口:http://developer.amd.com/tools-and-sdks/