Unity Shader(ShaderLab)着色器简介

转载请注明出处!
  近期花了一个多月时间把Unity5.x的Shader简单学习了一下,发现Shader实现的渲染机制魅力太大了!而且比以前版本的Shader更加牛逼!
  下面简单介绍一下Unity的Shader:
  尽管Unity Shader翻译过来是Unity着色器,但它并非真正渲染管线的Shader,它与真正意义上的Shader有很大的不同。以前我还不明白Unity的Shader和ShaderLab有什么不同,学习后才知道Unity Shader实际上指的就是一个ShaderLab文件,硬盘上以.shader为后缀的一种文件。Unity Shader可以理解为就是ShaderLab,它是在传统Shader上进行了高度封装。Unity Shader是用ShaderLab语言编写的,但对于表面着色器和顶点/片元着色器,可以在ShaderLab内部嵌套Cg/HLSL语言来编写着色器代码。
  Unity Shader(以下简称Shader)总是跟我们的Material(材质)相关联,也经常使用到Texture(纹理)进行渲染,Shader的渲染过程大体是:根据模型的UV座标以及模型在屏幕的显示面,把颜色或纹理上对应的像素值显示到屏幕上,获取到颜色后还要与Unity中的光照信息进行融合,从而使模型显示出需要的效果。
  学习了Shader以后,我把相关经验总结一下:
  1、Shader是图形学方面的运用,能通过代码来操作计算机绘画,并且能实现各种逼真的显示效果(例如水面、漂浮的雾效等),但是学习Shader前需要了解一下计算机的渲染过程,例如CPU和GPU的通信、渲染流水线等。
  2、Shader中会用到大量的物理方面知识和数学计算,例如物理中的反射与折射的运用、数学矩阵来变换顶点或向量在各种座标系的位置等,Shader本来就是图形学方面的知识,因此需要大体了解基础3D数学(座标系、点和矢量、矩阵和变换、Unity的不同座标空间、法线等等)。
  3、Shader主要是通过顶点/片元着色器来实现渲染过程的。模型是由好多的三角形片面组成的,而顶点着色器主要把模型中的所有三角形的三个顶点进行座标变换,变换到统一座标空间中,并且让计算机知道各个顶点在屏幕的显示位置;而片元着色器就是纹理和颜色中的色素赋值到模型对应的座标上,并且与关照颜色、环境颜色等计算的信息进行融合,然后输出到屏幕中。因为一个顶点着色器的处理过程是与模型的三角形片面数量相关,而片元着色器的处理过程是与模型的像素点数量相关,很明显片元着色器函数的调用次数远远多余顶点着色器函数。顶点和片元着色器都可以处理关于关照方向、视角方向等信息,但是顶点着色器的调用次数远少于片元着色器的调用,因此顶点着色器中处理一些向量数据会造成模型的三角形片元边界出现锯齿现象,而片元着色器中计算量过大又会影响性能,所以使用时可以综合考虑。
  4、Shader的光照主要包含环境光、自发光、反射光、折射光等,而反射光又有很多种,例如漫反射、高光发射、菲涅尔反射等的计算。而光照还涉及到光照衰减、阴影效果的实现等。Unity的渲染路径分为三种:向前渲染路径、定点照明渲染路径、延迟渲染路径。其中Unity5.x版本已经抛弃了顶点照明渲染路径,但是可以兼容以前版本的顶点照明渲染。
  5、Shader中将纹理的颜色赋值到模型上就是一中纹理采样的过程。纹理分为普通纹理、法线纹理、高度纹理、渐变纹理、遮罩纹理,以及更高级的噪声纹理等。而rgba颜色的各个通道的值在Shader中的范围是[0,1]。
  6、Shader实现透明效果就是根据采样的rgba颜色或者自己设定的rgba颜色中a通道的值来实现透明效果,透明效果包括透明度测试和透明度混合。透明度测试是把所有a通道的值低于设定值的片元全部剔除,不显示在屏幕上。不能实现半透明效果;而透明度混合是根据a通道的具体值来实现半透明效果,例如a=1表示完全不透明,a=0表示完全透明。
  7、Shader中可以通过代码来对纹理采样的座标进行改变,从而能达到动画的效果。
  8、Shader与C#的结合使用,可以获取到摄像机捕获的屏幕截图以及深度纹理和法线纹理,从而实现屏幕的后期处理效果,例如:模糊效果、高度雾效、亮度饱和度等等,更高级的是实现素描效果、3D卡通效果等等,效果非常棒。但是在移动平台可能会对性能造成较大的影响。
  9、Unity的表面着色器起始就是在顶点和片元着色器的基础上进一步的抽象和封装,只需要给出相关数据,Unity会在背后自动将数据生成相应的顶点/片元着色器,来实现我们想要的效果。但是表面着色器会牺牲顶点/片元着色器的自由度,无法实现一些自定义的渲染效果,而且往往会对性能造成一定的影响。
 10、Unity的许多性能优化都是跟渲染相关的,例如批处理技术、遮挡剔除技术、减少实时光照和阴影、LOD技术等等。

  最后推荐大家一本教程《Unity Shader入门精要》,16年出版,作者是冯乐乐(一名程序员妹子)。由浅入深的教学,并且都是有案例说明。PS:本人不是托……本来我是不喜欢看书的,但是网上关于Unity5.2以后的Shader教程很少,抱着试试的心理买了这本最新版的书,看着还不错。然后花了一个半月看完了,收获很多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章