【图形学】11 UnityShader入门(三)

来源:《UNITY SHADER入门精要》

1、Shader的基本结构

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

①Shader的名字

  第一句是:Shader "Name",来定义 Shader 的名字,通过添加“/”来控制 Unity Shader 在材质面板 中的位置。

②Properties属性

Properties{
	Name ("display name", PropertyType) = DefaultValue
}

  以上展示的是一个通常的 Properties 写法:标识符(Name)、显示的名字(display name)、类型(PropertyTpe)、默认值(DefaultValue)。

属性类型默认值的定义语法例子
Intnumbeer_Int("Int",Int)=2
Floatnumber_Float("Float",Float)=1.5
Range(min,max)number_Range("Range",Range(0.0,5.0))=3.0
Color(number,number,number,number)_Color("Color",Color)=(1,1,1,1)
Vector(number,number,number,number)_Vector("Vector",Vector)=(2,3,6,1)
2D“defaulttexture”{}_2D("2D",2D)=""{}
Cube“defaulttexture”{}_Cube("Cube",Cube)="white"
3D“defaulttexture”{}_3D("3D",3D)="black"{}

③SubShader

  每个Shader文件应当包含一个或多个SubShader语义块,当Unity需要加载这个Unity Shader时,Unity会扫描所有的SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader。如果都不支特的话,Unity就会使用Fallback语义指定的Inity Shader。
  Unity提供这种语义的原因在于,提供不同的显卡支持,不同的显卡具有不同的能力。例如,一些旧的显卡仅能支持一定数目的操作指令,而一些更高级的显卡可以支持更多的指令数,那么我们希望在旧的显卡上使用计算复杂度较低的着色器,而在高级的显卡上使用计算复杂度较高的着色器,以便提供更出色的画面。
  SubSader的语义块中包含的定义通常如下:

SubShader{
	[Tags]					
	[RenderSetup]	
	Pass{
		//要执行的渲染操作
	}
}

  每一个Pass定义了一次完整的渲染流程,如果Pass的数目过多,往往会造成渲染性能的下降。所以,在渲染进程中,可以使用尽量少的 Pass。
  [RenderSetup]和[Tags] 其实也可以在 Pass 中生命,但是,如果我们已经在SubShader中声明过了 [RenderSetup]和[Tags] ,则会应用到其下的所有 Pass。

SubShader状态设置(RenderSetup)

|状态名称|设置指令|解释|
|–|–|
|Cull|Cull Back | Front |Off|设置裁剪模式|
|ZTest|ZTest Less Greater | LEqual | GEqual | Equal | NotEqual | Always |设置深度测试时使用的函数|
|ZWrite|ZWrite On | Off|开启/关闭深度写入|
|Blend|Blend SrcFactor DstFactor|开启并设置混合模式|

SubShader的标签

  其定义的结构如下:

Tags{"TagName1" = "Value1" "TagName2" = "Vlaue2" }

  SubShader的标签(Tags)是一个键值对

Pass语句块

  其结构定义如下:

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

a.[Name]
  首先,先定义 Pass 的标识符:Name "PassName"
  a.通过这个标识符,我们可以使用 ShaderLab 中的 UsePass "File/PASSNAME" 来使用其他 Shader 中定义的Pass需要注意的是,由于Unity内部会把所有Pass的名称转换成大写字母的表示,因此,在使用UsePass命令时必须使用大写形式的名字。

b.[Tags]:之后细究
c.[RanderSetup]:SubRender中也有,之后再会学习。

④Fallback

  Fallback放在 SubShader 的最后面,它用于告诉 Unity,如果之前的SubShader在显卡上都不能运行,那么就是用这个最低级的 Shader。
  所以,Fallback算是一个最后的手段:Fallback "name",或者,不能运行之前的Subshader,就 Fallback Off,什么都不加载了,

2、表面着色器(Surface Shader)

  **表面着色器(Surface Shader)**是 Unity 自己创造的一种着色器代码类型 它相当于是更上一层的着色器。它需要的代码量很少,但实际上,它任然把它转换成对应多个Pass的 顶点/片元着色器。
  它建立于 顶点/片元着色器之上,它存在的价值在于,Unity会自动为我们处理许多光照的细节。示例如下:

Shader "Custom/Simple Surface Shader"
	SubShader{
		Tags { "RenderType" = "Opaque" }
		CGPROGRAM
		#pragma surface surf Lambert
		struct Input{
			float4 color : COLOR;
		};
		void surf (Input IN, inout SurfaceOutput o){
			o.Albedo = 1;
		}
		ENDCG
	}
	Fallback "Diffuse"

  上述程序可以看出,表面着色器被定义在 SubShader 的 CGPROGRAMENDCG中,而不是 Pass 中。因为 表面着色器 不需要开发者关心使用多少个 Pass 或者每个 Pass 如何渲染等问题。

3、顶点/片元着色器

  **顶点/片元着色器(Vertex/Fragment Shader)**更加复杂,灵活性也更高。它是写在 Pass 语句之内的,而不是 SubShader 中的。

4、固定函数着色器

  对于一些比较老旧的设备,它们不支持可编程管线渲染着色器,所以我们就只能**固定函数着色器(Fixed Function Shader)**完成渲染。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值