【Unity Shader入门精要】— Unity Shader基础

内容会持续更新,有错误的地方欢迎指正,谢谢!

引言

Unity Shader是Unity为开发者提供的高层级的渲染抽象层,它让开发者更加轻松地管理着色器代码以及渲染设置(如开启/关闭混合、深度测试、设置渲染状态等)。

Unity Shader的概述

Unity为我们准备的常用的三种Shader文件:
1. Standard Surface Shader:表面着色器(该着色器包含光照模型,使用了PBR的渲染方法)。
2. Unlit Shader:顶点/片元着色器(该着色器不包含光照模型)。
3. Image Effect Shader:实现屏幕后处理效果的基本模板。

Shader的Inspector面板中的部分常用参数解释:
1. Fixed function:Bool类型,固定函数着色器(已经被淘汰,不再使用)。
2. Cast Shadows:Bool类型,是否会有投射阴影。
3. Render queue:Int类型,使用的渲染队列。
4. Ignore projector:Bool类型,是否忽略投影。
5. Disable batching:Bool类型,是否关闭批处理。

ShaderLab

Unity提供的专门为Unity Shader服务的语言——ShaderLab。

Unity Shader的结构

四个结构:
1. Name:Shader "Custom/MyShader",Custom为根目录。
2. Property:属性。
3. SubShader:子着色器。
4. Fallback:回滚。

具体解释:
一个Unity Shader文件可包含多个SubShader语句块,最少要有一个。Unity会选择第一个能够在目标平台上运行的SubShader;如果都不支持的话,就会使用Fallback语义指定的UnityShader。

Pass定义了一次完整的渲染流程。一个SubShader中可以有多个Pass,但Pass数目过多,会造成渲染性能降低,所以,应使用最少数目的Pass。

除了上面普通的Pass,还有一些特殊的Pass:
1. UsePass:使用该命令来复用(调用)其他Unity Shader的Pass;
2. GrabPass:该Pass负责抓取屏幕并将结果存储在一张纹理中,以用于后续的Pass处理。

SubShader可以理解成由Tags(标签:告诉Unity怎样渲染这个对象)和RenderSetup(渲染状态设置:设置显卡的各种状态,例如:是否开启深度测试)和Pass三部分组成。
Tags和RenderSetup可以在Pass外或Pass内声明。Pass外和Pass内的标签的种类是不一样的,渲染状态设置是一样的。标签和状态设置在Pass外声明就是全局性的,在Pass内声明就是局部性的。

Unity Shader的形式

有两种形式:(都可使用Cg/HLSL语言来编写实现)
1. 表面着色器:Unity自创的着色器类型,需要的代码量少,Unity在背后做了不少工作,渲染代价大,小心它在移动平台的性能表现。
2. 顶点/片元着色器:渲染代价小,最常用!

如何决定使用哪种形式:
1. 若想要和多种光源打交道,就使用表面着色器。
2. 若使用的光照数目少,例如就一个平行光,那么就使用顶点/片元着色器。
3. 若你想实现很多自定义的渲染效果,那么也还是使用顶点/片元着色器。

补充的内容

一、Shader不等于Unity Shader。区别:
1. 在Shader中,顶点着色器和片元着色器并不是在同一个着色器文件里的;而在Unity Shader中,顶点着色器和片元着色器在同一个着色器文件里。
2. Shader中无法像Unity Shader这样 通过特定的指令来完成渲染设置,而需要在另外的代码中自行设置。
3. Shader需要编写冗长的代码来设置着色器的输入输出。

二、ShaderLab和Cg/HLSL的关系:
ShaderLab内部嵌套Cg/HLSL语言来编写着色器代码。

三、表面着色器和顶点/片元着色器的本质:
表面着色器会被编译成顶点/片元着色器。所以,可以说,Unity中只有顶点/片元着色器。

你可能感兴趣的:(Unity,Shaders,UnityShader)