突然认识到了自己的局限,于是不做人辣打算把图形编程放在比底层 API 更实用的基础上,比如 Unity 的 SRP。
还是喜欢看文字,所以跟的是这个系列。走完基础后可能直接跳到 SRP 部分。由于是笔记,内容可能比较细碎。
Unity 版本:2022.3.7f1c1。
基础部分主要是编辑器的基本使用和简单的脚本编写。
upd: FUCK the capitalism, FUCK YOU John Riccitiello.
1 GameObject 和脚本
通过在 Unity 里搭建一个可动的钟表模型来熟悉基础的操作和脚本编写。
1.1 界面和基础操作
设置里可以更改外置的代码编辑器。改成了 VS Code。
线性颜色空间,暂时不清楚作用。总不会是 Gamma 选项下的颜色不能做线性运算吧。后面看一下会不会影响观感。
1.2 钟表模型
使用 Unity 内置的基础 mesh 来搭一个钟表。
可以发现 Unity 在构建 GameObject 的时候采用了组件结构,使用它们来实现变换、网格、渲染、碰撞等功能。
通过创建材质并在 Mesh Renderer 组件中启用,可以自定义一个 mesh 的材质。目前通过这种方法来改变物体颜色。
注意层级结构中上一级的位移会被附加给从属的对象。
1.3 脚本
VS Code 对 Unity 的支持还是不太到位,里面的 Unity 插件好像是上个月才发布的。
如果想在编辑器里看到脚本里的私有成员,需要在声明时加上 [SerializeField]
将其序列化;如果不希望看到某个公共成员,可以使用 [HideInInspector]
。将代码中的成员与场景中的对象绑定在一起的数据似乎是由编辑器维护的。
Awake()
等 Unity 事件的函数没必要指定可见性,Unity 会在 .NET 环境之外唤醒这些函数。但最好还是要符合编码规范。
编写好的脚本需要作为组件附加到对应的对象上。
实际的代码逻辑很简单:获取系统时间然后换算成对应的角度,再用角度去设置模型的旋转即可。
2 函数图像
通过画一条函数曲线学习脚本、预制件(Prefab)和着色器的配合,还会稍微接触 URP 和 Render Graph。
2.1 预制件
可以把对象从 Hierarchy 拖到 Project 窗口里创建一个预制件,同时场景中的对象会成为预制件的一个实例(图标变成蓝色)。
实例拥有的属性如果覆盖了预制件的,会在 Inspector 里用粗体标出来。
2.2 脚本
记得把预制件绑定到脚本对应的成员上。
使用 [Range(left, right)]
配合 SerializeField
修饰可以使 Unity 在 Inspector 里将某个数值显示为可以配置的滑动条。
可以通过 point.SetParent(this.transform, false)
设置组件的父节点,并且不根据父节点保持世界空间下的位置、旋转等属性。
C# 的对象拷贝还不太明白。
2.3 表面着色器
基于世界空间下的位置来修改物体颜色。表面着色器只适用于默认渲染管线。
SubShader 使用 CG 和 HLSL 混合语法。在着色器里也可以通过特定语法将一些属性反射到编辑器中。
使用表面着色器需要通过材质,即将表面着色器附加到一个材质球上,然后将对象或预制件的材质改为该材质球。
2.4 URP 和 Shader Graph
使用 URP 需要安装对应的包,并在项目设置中启用对应的渲染管线。启用后原始的材质球都会坏掉,变成品红色。
在当前版本的 Unity 中 URP 资产在 “Create/Rendering/URP Asset” 下,而 Shader Graph 就在次级菜单里。
在 Shader Graph 里连线比写 shader 简单很多,也更直观。代价也显而易见:没有那么灵活,编译要点时间。
2.5 动画
C# 的列表对象声明和定义是分开的,Type[] x;
之后需要 x = new Type[size];
。另外,对象属性的获取和赋值会走拷贝,因此属性的成员不能像公共域一样直接修改。
3 更复杂的函数图像
主要是玩三角函数,以及一些 C# 语法糖。
3.1 函数库
这次使用 C# 的 static 类,这种类不能被实例化,也不能包含需要实例化的成员,而且无法被继承,很适合作为某种函数集合。
C# 的一个语法糖:
1 | float f(x) => switch type { |
3.2 委托
C# 的函数指针,写起来像函数声明。
可以进一步使用委托组成函数列表,但这样直接使用用户输入不太安全。
替换成基于枚举类型的函数设置,序列化修饰符会使枚举类型在编辑器中显示为一个下拉列表。此处枚举类型仍然需要转型成整数才能访问函数列表。
3.3 图像
基本上就是用一批几何体带上三角函数画各种东西了。
4 Profiling
性能分析。主要是 Unity 自带的 profiler。
自己也可以画一个显示帧率和内存的 UI,数据从引擎的接口拿。一个有意思的点是画的 UI 别太吃性能了。
5 Compute Shader
没看完。HLSL 感觉还是要找本专门的书看。
已经想快进到 SRP 了。
传送门,以防我又想回来看。
总结
跟着教程就好。有些因为 UI 原因找不到的东西直接跳过(比如 URP 材质的 GPU 实例化),部分拓展的东西可以选做(比如画完球之后再画一个环)。