Unity_Shader学习(二)Shader结构与分类

Shader的结构

一个UnityShader的结构如下所示:

Shader "ShaderName"{
    Properties{
        _value("valueName",valueType) = DefaultValue
    }

    SubShader{
        //SubShader1
    }

    SubShader{
        //SubShader2
    }
    
    Fallback "FallbackType"
}

1.Properties

Properties中定义了使用的属性,一般以下划线开始,常见的有以下几种:

_Float("FloatName",Float) = 1.5
_Range("RangeName",Range(0.0, 1.0) ) = 0.5

_Color("ColorName", Color) = (1,1,1,1)

_2D("TextureName", 2D) = ""{}

_Cube("CubeName", Cube) = "white"{}

_3D("3DName", 3D) = "black"{}

Float是一个浮点数,Range表示一个可选的范围,Color是一个四维数,注意2D,Cube,3D的初始化形式。

2.SubShader

在SubShader中定义了可选的状态,标签和一系列的Pass,但是Pass数目过多会引起渲染性能的下降

SubShader中常见的状态设置有:

剔除设置Cull:分为剔除正面Front,剔除背面Back,关闭剔除Off三个状态

深度测试ZTest:可以设置为不同的深度测试函数

深度写入ZWrite:开启On,关闭Off

混合Blend:设置是否开启混合及混合形式

SubShader中的标签是一个键值对,键值均为字符串类型,常见的标签有:

渲染队列控制Queue

着色器类型RenderType

批处理控制DisableBatching

阴影投射控制ForceNoShadowCasting

3.Pass

Pass定义在SubShader中,其结构为:

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

首先我们可以定义这个Pass块的名字,如:

Name "MyPass"

但是要注意,在unity的内部,会把所有Pass的名字设置为大写形式,所以当我们要使用UsePass命令来使用其他的Pass时,要写为大写的名字,如:

UsePass "MyShader/MYPASS"

在Pass中,也有属于Pass块的标签设置,如:LightMode用于设置光照模型。RequireOptions指定满足某些条件时才渲染该Pass

4.Fallback

如果所有的SubShader都不可用,将使用Fallback中指定的Shader

Shader的分类

1.顶点/片元着色器 Vertex/Fragment Shader

在UnityShader基础中已经大致介绍了这两个处理步骤进行的工作,在后续的学习中我们主要研究这两种Shader。它们相对于表面着色器更加的复杂,但是其灵活性也更高,代码写在Pass块中。

2.表面着色器Surface Shader

表面着色器其实是对顶点/片元着色器更高一层的抽象,它的代码量相对较少,但渲染的代价比较大。在我们使用表面着色器的时候,Unity实际上仍会把它转换成相应的顶点/片元着色器。其代码中无Pass块。

猜你喜欢

转载自blog.csdn.net/qq_37394426/article/details/86553289