Unity Shader 小白入门(2) 认识 Unity Shader

  1. 关系: 物体 <-- 材质 <-- Shader
  2. Unity对象创建
  • 创建Material 菜单 Assets/Create
    Project面板 右键/Create
  • 创建Shader
    同上
  • 关联Shader到Material
    材质面板 最上方 下拉菜单 选择Shader
  • 调解属性
    材质面板中 颜色、纹理、浮点数、滑动条、向量等
  1. Unity Shader 类型
    Standard Surface Shader 包含标准光照模型 表面着色器 基于物理的渲染方法
    Unlit Shader 不包含光照 但包含雾效 基本的顶点/片元着色器
    Image Effect Shader 实现屏幕后处理效果
    Compute Shader GPU并行性 与常规渲染流水线无关的计算
  2. Unity Shader Insptector 显示相关信息
    Default Maps 指定默认纹理
    Render queue 渲染队列
    Disable batching 是否关闭批处理
    Properties 属性列表
  3. ShaderLab语言
  • 专门为Unity Shader服务的说明性语言,是高层级的渲染抽象层,开发者不再需要和很多文件与设置打交道
  • 使用花括号嵌套的语义 来描述Unity Shader的结构
  • 结构中包含渲染所需的数据
  • Properties语句块 定义了Shader所需的属性
  • 材质面板 显示Shader的属性
  1. Unity Shader 的基础结构
Shader "ShaderName"	{
		Properties  {
        	//属性
		}
		SubShader {
			//显卡A使用的子着色器
}
		SubShader{
			//显卡B使用的子着色器
}
		Fallback "VertexLit"
}

Unity会把结构编译成真正的代码和shader文件,开发者只需些Unity Shader
6.Unity Shader的详细结构

  • 指定Unity Shader的名字
    Shader "Custom/MyShader" { }
    材质面板下拉列表 Shader位置 Shader->Custom->MyShader
  • Properties 语义块
    材质和Unity Shader的桥梁 —— 目的: 定义的属性将会出现在材质面板中
Properties{
_Name ("display name", PropertyType) = DefaultValue  //注意后面没有分号结尾
// ...以此类推
}

属性在Properties语义块中声明后,可以更方便地在材质面板中调整。

  • 材质面板上显示属性名 display name
  • 在Shader中访问属性: _Name
  • 属性的数据类型 PropertyType

主要语句形式 : _Name (“display name”, PropertyType) = DefaultValue

单值定义

_Int ("Int", Int) = 2

范围值定义——Range类型会以 Slider形式在材质面板显示

_Range("Range", Range(0.0, 5.0)) = 3.0

Color、Vector型——默认值形式 四维向量

_Color("Color", Color) = (1,1,1,1)
_Vector("Vector", Vector) = (2,3,1,4)

特殊体定义——默认值形式 字符串跟着花括号

_2D("2D",2D) = "" {} //字符串为空
_Cube("Cube", cube) = "white" {} //字符串为纹理名称
  1. SubShader 语义块
    每个Unity Shader有>=1个SubShader
    SubShader定义块
SubShader{
	// (可选的)标签设置
	[Tags]
	
	// (可选的) 状态设置
	[RenderSetup]
	
	Pass  {
	}
	//Other Passes
}
  • Tags
    • 键值对 (Key / Value)—— Key:字符串类型,Value Pair:字符串类型
    • 与渲染引擎沟通,如何渲染对象
    • Tags 结构:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
    • Tags 种类:
      1. )透明渲染:Tags { "Queue" = "Transparent" }指定物体属于哪一个渲染队列,保证透明物体在不透明物体之后被渲染,还可以自定义渲染队列
      2. )着色器分类:Tags { "RenderType" = "Opaque" } 如透明着色器,不透明着色器;用于Shader Replacement 功能
      3. )批处理Tags { "DisableBatching" = "True" } 如顶点动画
      4. )投射阴影 Tags { "ForceNoShadowCasting" = “true” ” } 可设置不受Projector影响,如半透明物体
      5. )精灵对象 Tags { "CanUseSpriteAtlas" = "False" }
      6. )材质面板预览(默认为球形) Tags { "PreviewType" = "Plane" } or skybox
  • RenderSetUp
    • 渲染状态的设置指令,可以设置显卡的状态
    • 常见渲染设置
      1. )Cull 剔除模式 Cull Back | Front | Off
      2. )ZTest 深度测试
      3. )ZWrite 深度写入
      4. )Blend 混合模式
  • Pass
    • 每个Pass定义了一个完整的渲染流程

    • Pass 加多,渲染性能下降,使用尽可能少数目的Pass

    • 在Subshader中进行的标签设置,将会用于所有的Pass

    • Pass 语义块

      Pass {
      	[Name]
      	[Tags]
      	[RenderSetup
      	//...}
      
      • 定义Pass 的名称
         Name "MyPassName"
      
      • 可对Pass设置渲染状态
      • 可对Pass设置标签 类型有
      1. ) LightMode 定义该 Pass在 Unity流水线中的角色
        Tags { "LightMode" = ""ForwardBase }
        
      2. ) RequireOptions 当满足于某些条件时才渲染该 Pass
        Tags { "RequireOptions" = "SoftVgetation" }
        
      • 调用其它Unity Shader中的Pass
        UsePass " MyShader/MYPASSNAME "
        
        使用Pass名字时要大写,因为Unity内部会把Pass名称转换成大写字母的表示, 告诉渲染引擎如何渲染物体
  1. Fallback
    当上面所有SubShader在这块显卡上都不能运行时,使用这个低级Shader
    Fallback "name"
    Fallback Off
    Fallback "VertexLit"

中英名词
syntax 语义

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值