Shader编程一直是一个比较难入门难上手的主题,本篇对Unity Shader编程的一些基础和要点进行了总结。
包括Shader编程相关知识图谱、Shader编程相关数据类型、Shader核心结构体等(后续继续补充)。
每个部分相互独立,可以单独参考,亦可作为一个整体参考。
博文首发&持续更新:http://blog.csdn.net/duzixi
(.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)的出发点和本元,应该是如何更好的产生阴影。
在计算机中,阴影的计算是靠光照模型完成的。
光照模型有很多,最基本的是以下两种:
有了基本的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等。
(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 |
透明度 |
【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/