LoginSignup
0
1

More than 3 years have passed since last update.

Unity Shader入门精要----第三章<Unity Shader基础>

Posted at

Unity Shader的基础

3.3 Unity Shader结构

Shader名称

命名: Shader “Custom/MyShader”​

Properties

只是为了让这些属性可以出现在材质面板中。
可以通过カスタムシェーダー GUI - Unity マニュアル对材质面板GUI进行自定义
image-20190725175604319

SubShader

需要包含1个或以上的Subshader语义块。
Pass 的数目过多会造成渲染性能下降。
状态和标签可在SubShader和Pass里同时设置,SubShader中设置的将会作用于所有的Pass

  • 状态设置 image-20190725175632839
  • SubShader标签 键值对(Key/Value Pair)。 建和值都是字符串类型。 结构: Tags { “TagName1” = “Value1” “TagName2” = “Value2” } 以下标签仅可在SubShader中声明 image-20190725175644550
  • Pass 语义块
Pass {
    [Name]
    [Tags]
    [RenderSeteup]
    // Other code
}
  1. Name

UsePass "MyShader/MYPASSNAME"

使用UsePass命令时必须使用大写形式的名字

  1. Tags

image-20190725180359205

  • Fallback

所有的SubShader都不被支持的时候的最终选择。个人感觉类似于Try/Catch里的Finally

Fallback "name"
// Or
Fallback Off

3.4 Unity Shader的形式

Unity可以使用3种形式编写Unity Shader

1. Surface Shader

Unity自创。代码量少,渲染代价比较大。

类似于对顶点/片元Shader的更高一层抽象。

处理了很多光照细节

表面着色器定义在SubShader而非Pass中, 不需要关心使用多少个Pass和Pass中如何渲染

2. Vertex/Fragement

Shader需写在Pass内

灵活性很高,可以控制渲染的实现细节

与Surface Shader相同都是由CG/HLSL编写

3. Fix-function

完全使用ShaderLab语法,而非CG/HLSL

5.2之后所有固定函数Shader都会被编译为Vertex/Fragment Shader

如何进行选择

  • 尽量使用Surface shader或Vertex/Fragment shader
  • 如果和多种光源打交道,表面着色器会更方便,但需注意移动端性能
  • 光照数目非常少,或者有很多自定义的渲染效果,选择顶点/片元着色器

3.6 答疑

  • Unity Shader != 真正的Shader。 Unity Shader提供了一种让开发者同时控制渲染流水线中多个阶段的一种方式。一般情况下,不需要关注渲染引擎底层的实现细节。
  • Unity中CG和HLSL是等价的。
  • 也可以使用GLSL来写,但是平台会受到限制(个人体会,真的不好用)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1