Unity Shader | 基础

MeshFilter

存储一个Mesh(网格,模型的网格,模型的三角面顶点信息)

MeshRenderer

用于渲染一个物体的外观,数据来源于MeshFilter

Material

材质包含两部分,贴图和Shader

OpenGL DirectX

直接与显卡交互图形渲染库,可以理解为应用程序与显卡之间的桥梁,为应用程序提供一些渲染接口,用于渲染。

Shader

Shader可以理解为是一种渲染命令,由opengl或DX进行解析,用于控制图形的渲染。

GLSL/HLSL/CG

shader编程语言,GLSL面向OpenGL,HLSL面向DirectX,CG是Nvidia公司出的,跨平台的shader编程语言。

ShaderLab

我们在Unitiy中写Shader用的语言是ShaderLab,可以理解为Unity为了方便使用者写Shader而创造的一种新的Shader语言,最后其实都会在底层被翻译成GLSL或HLSL或CG。

Unity中的Shader分类

Shader的中文名叫做着色器

  • 表面着色器,Surface Shader
  • 顶点/片元着色器,Vertex/Fragment Shader
  • 固定功能着色器,Fixed function Shader (在现代硬件上基本已被弃用)

表面着色器可以理解为是对顶点/片元着色器的一种封装,它帮我们处理了很多渲染上比较麻烦的事情。而顶点/片元着色器就相对更灵活一些,也就是说很多东西要自己处理,相对来说要写的代码更多一些。进一步讲,使用顶点/片元着色器能实现的效果,使用表面着色器并不一定能实现,或者说,并不一定那么方便地实现。

Unity Shader 结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Shader "iMoeGirl/MyShader" {  // Shader 名字
Properties {
// 这里定义一些属性,可以显示在UI面板上用于调节
}

SubShader {
// 子 Shader,可以写多个,显卡运行时,
// 从第一个SubShader开始,如果第一个里面的效果都支持,则使用第一个,
// 如果发现这个SubShader里面某些效果不支持,则自动运行下一个SubShader
}

// 如果发现所有的SubShader都不支持,则使用Fallback,相当于后备方案
Fallback "VertexLit"
}

Unity Shader 属性类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Shader "iMoeGirl/MyShader" {  // Shader 名字

// 这里定义一些属性,可以显示在UI面板上用于调节
Properties {
// 属性名("Inspector面板上显示出来的属性名", 属性类型) = 默认值
_Color("颜色类型", Color) = (1,1,1,1)
_Vector("向量类型", Vector) = (1, 2, 3, 4)
_Int("整型", Int) = 11111
_Float("浮点型", Float) = 12.11
_Range("范围类型", Range(100, 1000)) = 128
_Tex2D("贴图类型", 2D) = "white"{}
_Cube("立方体贴图类型", Cube) = "white"{}
_Tex3D("3D纹理", 3D) = "white"{}
}

// 子 Shader,可以写多个,显卡运行时,
// 从第一个SubShader开始,如果第一个里面的效果都支持,则使用第一个,
// 如果发现这个SubShader里面某些效果不支持,则自动运行下一个SubShader
SubShader {

// 至少有一个Pass,相当于一个方法
Pass {
// 在Pass块里写Shader代码

CGPROGRAM
// 使用 CG语言编写Shader
ENDCG
}
}

// 如果发现所有的SubShader都不支持,则使用Fallback,相当于后备方案
Fallback "VertexLit"
}
分享到