文章目录
Unity-shader学习笔记(三)
前面介绍了渲染流水线,那么这里就详细说说每一部分的编写。
9 顶点/片元着色器
9.1 基本结构
Shader "MyShaderName" {
Properties{
//属性
}
SubShader{
//针对显卡A的SubShader
Pass{
//设置渲染状态和标签
......;
//开始CG代码片段
CGPROGRAM
//该代码片段的编译指令,例如:
#pragma vertex vert
#pragma fragment frag
//上面这两句一般是shader已经自建好了的
//CG代码的编写处
......;
ENDCG
//其他设置
}
//其他需要的Pass
}
SubShader{
//针对显卡B的SubShader
}
//上述SubShader都失败后用于回调的Unity Shader
Fallback "VertexLit"
}
根据上述内容,就应该发现,最重要的就是Pass语义块。接下来逐个解读每一部分:
①代码第一行的命名:这个命名非常重要,并不是单单说就直接命名,而是要以"a/b/…/z"的路径形式命名。命好名后,在Material的shader中可以进行选择:a是一级目录,z是最后的目录,也是最重要决定使用的shader。这样命名可以帮助我们更快速的shader。
②Properties属性:这里定义的属性是会直接显示在Material的面板上,例如:
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
上面这个例子就会在Material面板中增加一项名为"Texture"的属性,它有三个部分:Offset(指明使用贴图的起始位置)、Tilling(指明从offset位置处的大小区域,区域的取值范围一般为(-1,1),超过的话部分会按比例生成新的区域拼接上原先的)、未使用贴图时的Material颜色(由"="后面的颜色决定,这里是白色)
(Offset和Tilling较多得用于制作帧序列动画)
③SubShader:shader在执行过程中回一次检测SubShader,直到找到一个可执行的。
④在Pass之前其实还有一个Tags:
Tags{"TagName1" = "Value1""TagName2"="Value2"}
这些Tags会被应用于当前的所有Pass,一共有如下几种Tag:
Queue | 设置渲染队列顺序 |
---|---|
RenderType | 区别渲染对象 |
DisableBatching | 是否要保存模型空间的信息 |
ForceNoShadowCasting | 用于渲染半透明物体时是否接受其他物体的阴影 |
IgnoreProjector | 是否接受贴图投影的影响(非光照照成) |
CanUseSpriteAtlas | 是否启用图集 |
PreviewType | 指明材质面板将如何预览该材质(默认为球形) |
主要介绍其中的Queue、RenderType和PreviewType:
Queue:(实际上Queue的每个option在内部都被解释为固定的数值索引,从上到下以此为:1000,2000,2450,3000,4000;其次天空盒在所有不透明和透明对象之间绘制。)
Background | 最先被调用的渲染,通常用来渲染背景 |
---|---|
Geometry | 默认值,大多数物体使用此队列,用来渲染不透明物体</ |