Bootstrap

Unity-shader学习笔记(三)

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 默认值,大多数物体使用此队列,用来渲染不透明物体</
;