# 什么是shader?
Shader,中文对应即着色器,是一种较为短小的程序片段,用于告诉图形硬件如何计算和输出图像,过去由汇编语言来编写,现在也可以使用高级语言来编写。一句话概括:Shader是可编程的图形管线的算法片段。
主要分为两类,Vertex Shader和Fragment Shader
# 渲染管线
渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。一个流水线是一序列可以并行和按照固定顺序进行的阶段。每个阶段都从它的前一阶段接收输入,然后把输出发给随后的阶段。就像一个在同一时间内,不同阶段不同的汽车一起制造的装配线,传统的图形硬件流水线已流水的方式处理大量的顶点、几何图形和片段。
# Shader、材质、贴图的关系
Shader实际上就是一段层序,它负责将输入的顶点数据以指定的方式和输入的贴图或颜色等组合起来,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后我们便可以将材质赋予三维物体来进行渲染(输出)了。
材质好比是引擎最终使用的商品,Shader好比是生产这种商品的加工方法,而贴图就是原材料
每个物体除了形体外,都具备“固有颜色”、“质感”、“光学性质”,这三种属性决定了该物体在视觉上的自身物理外观,以及在光线下呈现出的各种质感。
# 三大主流的高级编程语言
HLSL、GLSL、CG
shader language 的发展方向是设计出在便携性方面可以和C++、JAVA相比的高级语言,赋予程序员灵活而方便的编程方式,并尽可能的控制渲染过程,同时利用图形硬件的并行性,提高算法的效率。
Shader language目前主要有3种语言:基于OpenGL的OpenGL Shading Language简称GLSL、基于DirectX的Gigh Level Shading language 简称HLSL 还有NVIDIA公司的C for Graphic 简称CG语言。
简而言之:GLSL用于OpenGL,在Linux、Unix、Android、MacOS上使用,语言风格与HLSL、CG不同
HLSL用于D3Dx,在Windos、XBox等平台使用
CG是Nvidia与微软共同开发的面向显卡的语言,风格与HLSL相同,既可在D3D使用也可在OpenGL上使用,是高于HLSL和GLSL的语言。
# Unity Shader的基本结构
- as surface shaders (是Vertex and fragment shaders的一种包装,Unity推荐使用)
- as vertex and fragment shaders
- as fixed function shaders (固定管线Shaders)
请阅读ShaderLab Syntax
// 大小写不敏感
shader “name”{
[Properties]{ // 属性、
_Color ("Color",Color) = (1,1,1,1) // 颜色、贴图等,可在Unity面板编辑
}
SubShaders // 至少一个,可以多个,硬件会检测shader的支持程度执行
[FallBack] // 硬件不能运行以上subshader时的回落
}
- Unlit:不发光、只是一个纹理,不被光照影响,最节省资源,常用于渲染UI
- VertexLit:定点光照
- Diffuse:漫反射
- Normal Mapped:法线贴图,比漫反射昂贵,增加了一个或更多纹理(法线贴图)和几个着色器结构(可以弥补材料细节)要叫凹凸贴图
- Specular:高光,增加了特殊高光的计算
- Normal Mapped Specular:高光法线贴图,比高光更昂贵
- Parallax Normal Mapped:视差法线贴图,增加了视差法线贴图计算
- Parax Normal Mapped Specular:视差高光法线贴图,添加了视差法线贴图和镜面高光计算