【Unity Shader入门】1、文件结构分析

Shader文件的基本结构

//Shader的引用名
Shader "Custom/LST" {
    //属性定义
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	//子着色器
    SubShader{ ... }
    SubShader{ ... }
	SubShader{ ... }
    //回滚
	FallBack "Diffuse"
}

1、Shader的引用名

Unity的Shader文件是通过Shader这个关键字开始的,用户可以像目录一样组织Shader的命名。Shader的文件名和引用名不必一样。如下图:
材质对应的shader路径

2、属性定义-Properties {}

properties一般定义在着色器的起始部分,我们可以在Shader书写的时候定义多种多样的属性,而使用Shader的时候可以直接在材质检视面板(Material Inspector)里编辑这些属性,取不同的值或者纹理。

_Name("Display Name", type) = defaultValue[{options}]
  • _Name - 属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容。

  • Display Name - 这个字符串将显示在Unity的材质编辑器中作为Shader的使用者可读的内容。

  • type - 这个属性的类型,可能的type所表示的内容有以下几种:

类型
表示的内容
Color
一种颜色,由RGBA(红绿蓝和透明度)四个量来定义
2D
一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来
Rect
一个非2阶数大小的贴图
Cube
即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样
Range(min, max)
一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等)
Float
任意一个浮点数
Vector
一个四维数
  • defaultValue 定义了这个属性的默认值,通过输入一个符合格式的默认值来指定对应属性的初始值(某些效果可能需要某些特定的参数值来达到需要的效果,虽然这些值可以在之后在进行调整,但是如果默认就指定为想要的值的话就省去了一个个调整的时间,方便很多)。
    • Color - 以0~1定义的rgba颜色,比如(1,1,1,1);
    • 2D/Rect/Cube - 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或;者“white”,“black”,“gray”,“bump”中的一个;
    • Float,Range - 某个指定的浮点数;
    • Vector - 一个4维数,写为 (x,y,z,w);
  • option,它只对2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个,这些都是OpenGL中TexGen的模式。

使用参考:

  • name (“display name”, Range (min, max)) =number
    定义浮点数属性,在检视器中可通过一个标注最大最小值的滑条来修改。

  • name (“display name”, Color) =(number,number,number,number)
    定义颜色属性

  • name (“display name”, 2D) = “name” {options }
    定义2D纹理属性

  • name (“display name”, Rect) = “name”{ options }
    定义长方形(非2次方)纹理属性

  • name (“display name”, Cube) = “name”{ options }
    定义立方贴图纹理属性

  • name (“display name”, Float) = number
    定义浮点数属性

  • name (“display name”, Vector) =(number,number,number,number)
    定义一个四元素的容器(相当于Vector4)属性

Shader "Custom/LST"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
	    _Color("Color", Color) = (1,1,1,1)
		_Range("Range", Range(0, 5)) = 1
		_Rect("Rect", Rect) = "white"{}
		_Cube("Cube", Cube) = "white"{}
		_Float("Float", Float) = 0.1
		_Vector("Vector", Vector) = (0.5,0.5,0.5,0.5)
	}
	SubShader{ ... }
	FallBack "Diffuse"
}

上面代码中,效果如下图:
在这里插入图片描述

3、SubShader{ … }

SubShader{
   //可选的
   [Tags]
   //可选的
   [RenderSetup]
   Pass{...}
}

SubShader,是为了能让开发者针对不同性能的显卡编写不同的Shader,因为现实中并不是每个人都用相同的显卡。由于显卡千差万别,为了能让用户编写的游戏最大化地在各种各样的GPU上运行,尽可能地呈现最好的效果.就用SubShader来组织具体的实现,使Unity在运行时会针对实际的运行环境。从上到下选出最优的SubShader实现来呈现开发者的作品。
从理论上来说,SubShader的数量是没有限制的,但实际操作中为了减少文件的大小.一般写两三个SubShader就行了,即针对目前最流行的一代显卡写一个,针对老旧的显卡写一个。

3.1 标签 Tags[可选的]

SubShader 使用的标签 —— 告诉unity引擎或其他用户,如何认证这个 SubShader

Tags{ "标签1"="值1" "标签2"="值2" } //键值对,多个之间用的是空格
SubShader 的标签
说明
Queue
决定对象被渲染的次序 Background(1000)、Geometry默认值(2000)、AlphaTest(2450)、Transparent(3000)、Overlay(4000)、(具体看308页)
RenderType
渲染类型,可以用于着色器替换功能(shader replacement)
DisableBatching
禁用批处理,可选值 True、False、LODFading
ForceNoShadowCasting
强制不投射阴影,如果为True,由该子着色器渲染的对象不会投射阴影
IgnoreProjecttor
忽略投影,例如不想在半透明物体上显示其他物体的阴影
CanUseSpriteAtlas
如果该着色器用于精灵对象上,如果设置为False,那么打包图集之后,着色器不起作用
PreviewType
材质属性面板上预览窗口显示的类型,默认材质球,也可以是 Plane、Skybox

3.2 状态RenderSetup[可选的]

ShaderLab提供了一系列渲染状态的设置指令,这些指令可以设置显卡的各种状态,例如是否开启混合/深度测试等。

常见的渲染状态设置选项
状态名称
设置指令
解析
Cull
Cull Back/Front/Off
设置剔除背面/正面/关闭剔除
ZTest
ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always
设置速度测试时使用的函数
Blend
Blend Srcfactor DstFactor
开启并设置混合模式

当在SubShader块中设置了上述渲染状态时,将会应用到所有的Pass。如果我们不想这样(例如在双面渲染中,我们希望在第一个Pass中剔除正面来对背面进行渲染,在第二个Pass中剔除背面来对正面进行渲染),可以在Pass语义块中单独进行上面的设置。

3.3 Pass块

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

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

Name "LSTPassName"

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

UsePass "LSTShader/LSTPassName"

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

3.3.2 Tags

Pass同样可以设置标签,但它的标签不同于SubShader的标签。这些标签也是用于告诉渲染引擎我们希望怎样来渲染物体。

Pass的标签类型
标签类型
说明
例子
LightMode
定义该Pass在Unity的渲染流水线中的角色
Tags{“LightMode”=“FoewardBase”}
RequireOptions
用于指定当满足某些条件时才渲染该Pass,它的值是一个由空格分隔的字符串。
Tags{“RequireOptions”=“SoftVegetation”}
3.3.3 RenderSetup

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

4、回滚

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

Fallback "name"
//或者
Fallback off

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值