第三章-Unity Shader 基础

简介

  • 背景:正常编写和生效shader代码需要比较繁琐的编写步骤
  • 方案:Unity Shader提供了一套解决方案能简化上述步骤,方便用户管理自己的shader代码以及渲染设置
  • Unity Shader:在Unity中指的是一个ShaderLab文件(.shader文件后缀)
  • 导入设置(Import Settings):针对外部文件使用,Unity Shader也有自己的Import Settings,可以配置默认属性(Default Maps配置),例如:默认纹理在这里插入图片描述

ShaderLab

  • 简介:ShaderLab是Unity为开发者提供的高层级的渲染抽象层,是Unity提供用于编写Unity Shader的一种声明性语言(SDL)

Unity Shader的结构

  • shader名字:shaderlab中首行来指定Unity Shader名字,方便材质属性面板中查找

    • 注意:跟shader文件名是2个不同的概念(但系统默认命名规则是以文件名来控制,但也同时支持用户自定义修改Unity Shader中的名字)
      在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • Properties(属性)

    • 单个属性声明:一般包含4个关键信息,包括:属性名、面板显示名字、类型、默认值
      • 语法:AttrName {"dislay name", PropertyType} = DefaultValue
      • AttrName一般以下划线开头(为啥?)
        在这里插入图片描述
        在这里插入图片描述
  • SubShader

    • 每个Unity Shader中可以包含多个SubShader,但至少也需要保留1个
    • 生效逻辑:
      • Unity加载Unity Shader
      • 扫描所有SubShader语义块,选择首个能够在目标平台上运行的SubShader(跨平台、跨软硬件的可定制化)
      • 都不支持则使用Fallback语义指定的Unity Shader(保底机制)
    • 结构
      • Tags(标签):键值对,可以控制渲染顺序、是否批处理等信息(讲道理为何不和RenderSetup整合呢?)
      • RenderSetup(状态):例如Cull(Back|Front|Off)、ZTest(深度测试函数)、ZWrite(开启/关闭深度写入)、Blend(混合)
      • Pass:定义了完整的渲染流程,也会包含渲染状态设置,但跟上述的RenderSetup有区别(全局生效、局部生效)
        • Name
        • Tags
        • RenderSetup
  • Fallback:保底机制

    • 如果其他SubShader都在显卡上跑不起来,就运行我吧

Unity Shader的形式

表面着色器(Surface Shader)
  • 简介:Unity自己创造的一种着色器代码类型,是对Vertext Shader和Fragment Shader的更上一层封装(Unity背后会将Surface Shader转换为Vertext 和 Fragment Shader)
  • 结构
    • 无需通过Pass管理,一般是通过CGPROGRAM和ENDCG之间编写代码(主要是Unity内部会封装好用户无需关心相关的pass处理,只需要按需填充参数)
    • 使用Cg/HLSL语法编写(Unity自己封装),但不一定所有函数都有适配支持;
顶点/片元着色器
  • 应用场景:灵活性更高(但同时也更复杂)
  • 结构
    • 要求写在Pass语义块内(跟Surface Shader有区别)
固定函数着色器(被抛弃的角落)
  • 应用场景:针对老旧设备只能支持固定渲染管线,不支持可编程管线,因此需要提供一套兼容方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值