ShaderLab语法基础

本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出

3.1 Shader脚本的组织机构

Shader "Name"
{
	Properties
	{
		//开放到材质面板的属性
	}
	SubShader
	{
		//顶点、片段着色器
		//表面着色器
		//固定函数着色器
		//适配顶级显卡
	}
	SubShader
	{
		//更加精简的版本
		//为了在旧的图形设备上运行
		//适配中级显卡
	}
	SubShader
	{
		//适配入门级显卡
	}
	...
	Fallback "Name" //以上都执行失败,就会跳转到Fallback指定的函数
}

在这里插入图片描述

3.2 Shader名称

在这里插入图片描述

  1. 建立一个新的Shader,修改下路径/名称
  2. 建立一个新的材质,选择要使用的Shader,就可以在材质面板Shader下拉列表里的相应路径的Shader

3.3 Properties

在编写Shader时候会遇到一些需要可调整的变量,贴图等数据。类似函数中的参数。这些变量被设置成开放属性,后续可以在材质面板里面调整,以提供给子着色器使用。
有三大类,格式如下

_Name(“Display Name”, type) = defaultValue[{options}]
_Name:属性的名字,方便获取在开头加下划线,在代码中使用这个名称获取属性
Display Name:在材质面板中显示的名字
type:属性的类型
default:属性的默认值

3.3.1 数值类属性

  1. unity提供了两种数值类型:整数型和浮点型,最终都会转换成浮点型数据
  2. Range是一个介于最大和最小值的浮点型数据,在面板作为滑动条显示

name(“display name”,Float)= number
name(“display name”,Range(min, max))= number

例:

_MyNum(“Float Property”,Float)= 1
_MyRan(“Range Property”,Range(0, 1)= 0.5

3.3.2 颜色和向量类属性

name(“display name”,Color)=(number,number,number,number)
name(“display name”,Vector)=(number1,number2,number3,number4)

例:

_MyCol(“Color Property”,Color)= (1,0,0,1)
_MyVec(“Vector Property”,Vector)= (0,1,0,0)

3.3.3 纹理贴图类属性

name(“display Property”,2D)= “default”{}
name(“display Property”,Cube)= “default”{}
name(“display Property”,3D)= “default”{}

例:

_MyTex(“Texture Property”,2D)= “white”{}
_MyCube(“Cube Property”,Cube)= “”{}
_My3D(“3D Property”,3D)= “”{}

3.4 SubShader

每个Shader都会至少包含一个SubShader,当Unity要渲染一个材质的时候就会调用其中的一个SubShader(会从上往下找到第一个能在当前显卡运行的Shader)

3.4.1 SubShader的标签

类似一些开关, 作用于后面的渲染效果

Tags{“TagName1” = “Value1” “TagName2” = “Value2”}

如上所示: 标签通过键值对进行声明, 没有数量限制

常用标签:
Queue 队列: 确定shader的渲染顺序
RenderType 渲染类型: 划分不同类型, 用于后期进行shader替换或产生摄像机的深度纹理
DisableBatchIng 禁用批处理: 使用批处理时, 几何体会被变换到世界空间, 模型空间会被丢弃(可能会导致部分shader失效), 所以有的时候需要禁用批处理
ForceNoShadowCasting 禁用阴影投射: 有的特效不需要对其它物体产生投影
IgnoreProjector 忽略投射机: 如果不希望物体受到投影机的投射(一般半透明的shader会开启)

详细参考

3.4.2 Pass的渲染状态

可以在Pass外设置:这是针对全局的
也可以在Pass内设置:是针对局部的

Cull Back|From|Off:设置多边形的剔除方式,背面(默认)、正面、不剔除
ZWrite On|Off:是否写入深度缓存(默认On)

详细参考

3.5 Fallback

Fallback “Name”

当前面所有的SubShader都不难在当前显卡上执行,就会执行Fallback定义的Shader

最常用的是执行内置的Diffuse

如果觉得某个Shader肯定可以在当前显卡执行,可以关闭Fallback

Fallback Off

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值