第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > UnityShader入门精要-3.3 UnityShader的结构

UnityShader入门精要-3.3 UnityShader的结构

时间:2020-09-02 18:57:44

相关推荐

UnityShader入门精要-3.3 UnityShader的结构

一个UnityShader的基础结构如下所示:

Shader "ShaderName"{Properties{//属性 }SubShader{//显卡A使用的子着色器 }SubShader{//显卡B使用的子着色器 }Fallback "VertexLit"}

Unity在背后根据使用的平台来吧这些结构编译成真正的代码和Shader文件,开发者只需要和UnityShader打交道即可。(Unity编写Shader的语言是ShaderLab)

属性:在Shader中访问它们需要使用每个属性的名字,这些属性的名字通常由一个下划线开始,还需要为属性指定它的类型,还需要指定一个默认值,当第一次把该Shader赋给某个材质的时候,材质面板上显示的就是这些默认值。

属性类型:

需要注意的是,上述的标签仅可以在SubShader中声明,而不可以在Pass块中声明。Pass块虽然也可以定义标签,但这些标签不同于SubShader的标签类型。这是我们下面要讲到的:

Pass语义块

Pass语义块包含的语义定义如下:

Pass{[Name][Tags][RenderSetup]//Other code}

首先可以在Pass中定义该Pass的名称,例如:

Name "MyPassName"

通过这个名称可以使用ShaderLab的UsePass命令来直接使用其他的UnityShader中的Pass。例如:

UsePass "MyShader/MYPASSNAME"

这样可以提高代码的复用性。需要注意的是由于Unity内部会把素有的Pass的名称转换成大写字母表示,因此在使用UsePass命令时必须使用大写形式的名字。

其次,我们可以对Pass设置渲染状态。SubShader的状态设置同样适用于Pass.除了上面提到的状态设置外,在Pass中我们还可以使用固定管线的着色器命令。

Pass同样可以设置标签,但它的标签不同于SubShader的标签,这些标签也是用于告诉渲染引擎我们希望怎么样来渲染该物体。下表给出了Pass中使用的标签类型。

除了上面普通的Pass定义外,UnityShader还支持一些特殊的Pass,以便进行代码服用或实现更复杂的效果。

UsePass : 如上文所说,可以使用该命令来服用其他UnityShader中的Pass;GrabPass : 该Pass负责抓取屏幕并将结果存储在一张纹理中,以用于后续的Pass处理;

最后留一条路: Fallback

紧跟在各个SubShader语义块后面的,可以是一个Fallback命令。他用于告诉Unity,"如果上面所有的SubShader在这块显卡上都不能运行,那么就使用这个最低级的Shader吧!"

它的语义如下:

Fallback "name"//或者Falllback off

如上所述,我们可以通过一个字符串来告诉Unity这个“最低级的UnityShader”是谁。我们也可以任性的关闭Fallback功能,但一旦你这么做,你的意思大概就是:“如果一块显卡跑不了上面所有的Shader,那就不要管他了!”

下面给出一个使用Fallback的例子:

Fallback "VertexLit"

事实上,Fallback还会影响阴影的投射。在渲染阴影纹理时,Unity会在每个UnityShader中寻找一个阴影投射的Pass,通常情况下,我们不需要自己专门实现一个Pass, 这是因为Fallback使用 的内置Shader中包含了这样一个通用的Pass。因此,为每个UnityShaer正确的设置Fallback是非常重要的。

除了上述语义,还有一些不常用到的语义。例如,如果我们不满足于Unity内置的属性类型,想要自定义材质面板的编辑界面,就可以使用CustomEditor语义来扩展编辑界面。我们还可以使用Category语义来对UnityShader中的命令进行分组。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。