MIT 许可证 NuGet

首页 / 为什么选择季节引擎

为什么选择季节引擎

一个带现代特性集的 C# 渲染器,一套 API 横跨六个平台,源码树小到 你能读到你正在调试的那部分。MIT 许可,没有编辑器,没有资产 管线,没有运行时费用。

它存在,是因为一个特定的选项在别处不存在:一个维护中的、纯 C#、 无编辑器的引擎,带当代渲染器。那条线之下是绑定 — 很优秀的绑定 — 你拿到一个设备和一张命令列表,剩下的四万行 自己写。那条线之上是带编辑器的引擎,一个 3D 窗口要花掉你一种 项目格式、一条导入管线和一次大安装。季节引擎是中间的那一层: 渲染器完成了,应用外壳完成了,代码留给你读。

一套 API,四种后端,六个平台

你针对 Season.Controls 和 Season.Rendering 编写代码。后端由目标框架 决定,而不是由你的代码决定。

平台后端目标框架
WindowsDirect3D 12net10.0-windows10.0.19041.0
LinuxVulkannet10.0
AndroidVulkannet10.0-android
iOSMetalnet10.0-ios
macOSMetalnet10.0-maccatalyst
浏览器WebGPUnet10.0-browser

窗口、输入、存储和字体同样如此 — 各自有一个接口和 Season/Platforms 下的逐平台实现。你的 应用项目完全不引用任何平台命名空间。这一边界如何被 强制、目前在哪里泄漏,参见 跨平台隔离。

渲染器是现代,而不是极简

「小引擎」通常意味着前向渲染、一张阴影贴图和一个 Lambert 项。 本引擎交付的,是那些否则你要花一年去做的技术。

  • 带基于图像光照的金属-粗糙度 PBR
  • 带柔和滤波的级联太阳阴影
  • compute 上的地面真值环境光遮蔽
  • 带 SDF 追踪的动态漫反射全局光照
  • 物理天空、空气透视和体积云
  • 带锐化解析的时间抗锯齿
  • HDR 场景颜色、泛光和色调映射
  • 蒙皮动画、GPU 实例化、基于射线的拾取

其中每一项都是一个你可以通过公开的 RenderQuality 和 FrameSchedule API 检查、禁用或替换的 compute 或光栅通道。功能总览列出了 已发布、部分和缺失的内容,全程使用同样的徽章。

整合本身才是产品

这些技术没有一个是秘密,底层的图形 API 绑定是别人的 优秀工作。稀缺的是组装:PBR、glTF 蒙皮、级联阴影、 DDGI、GTAO、TAA、动态天空、MSDF 文本和 2D 精灵全部 协同工作,跑在四种图形 API 上,藏在一个连贯的 API 面 后面。那才是要花数年时间、也正是被提供出来的部分。

许多对象,声明而非绘制

没有 Draw 调用可写。你声明一个控件, 引擎负责批处理、剔除和排序。一个 InstancedModel 就是一个持有一列变换的 控件,所以一片动画单位的田野,就是一个你往里添加的列表。

var crowd = new InstancedModel { ModelName = "Assets/robot.glb" };

for (int i = 0; i < count; i++)
    crowd.Instances.Add(new MeshInstanceTransform
    {
        PosX = x, PosY = 0f, PosZ = z,
        AnimationClip = walk,   // clip index
        AnimationTimeOffset = Random.Shared.NextSingle() * 2f
    });

AddControl(crowd);

这里值得做的对比,是与基于编辑器的引擎中的替代方案。Unity 当然能达到高实体数量 — 通过 DOTS,一种有着自己的内存 模型、你多半要围绕它重构项目的第二种范式。本引擎用普通 C# 就给你那份中有用的一份,无需采纳第二种范式。

这个主张还没有已发布的基准

在数字出现之前,「有用的一份」是诚实的措辞。一个实测的 单位对帧时间数字在清单上,而不在本站上,所以请把上面那段 当作架构论证而不是测量。机制是真实的,并在 实例化中有文档;数量尚未 发布。

每个领域一个实现

大多数引擎在积聚选项。本引擎拒绝选项,而拒绝本身 就是设计。

领域唯一实现刻意缺席的东西
模型与动画glTFFBX、OBJ、专有网格格式
文本MSDF 图集位图字体、第二条光栅化路径
图形 API每平台一个OpenGL 和 WebGL 回退
平台分歧DeviceServices引擎代码里的 #if 森林

好处是:有一条代码路径要理解、有一条要优化、有一条可能 出错。代价是:如果你的资产是 FBX,你就转换它们;如果你的 目标设备没有 Vulkan,就没有可降级的回退。两者都是真实的, 两者都在与其他引擎的对比里。

场景是一个 C# 类

没有场景文件,没有预制体,没有 .meta 附属文件, 也没有 GUID 注册表。一个面板构造它的控件,而一个控件就是 一个带属性的对象。

internal class Island : Panel
{
    internal Island()
    {
        AddControl(new Model
        {
            Name = "Assets/island.glb",
            PosX = 0f, PosY = 0f, PosZ = 0f,
            Width = 40f
        });
    }
}

这个主张比听起来小,好处比听起来大。它意味着你的场景在拉取 请求中做 diff。它意味着一次合并冲突是 C# 里的合并冲突, 而不是二进制资产里的。它意味着你在任何其他 C# 代码里会写的 同一个循环、条件或辅助方法在这里都管用,因为没有另一种 创作语言要跨越。

它的代价,平铺直叙

没有编辑器意味着没有拖拽摆放、没有可视化材质图、没有实时 检查器。定位就是敲数字、构建、看效果。参考应用用一个 应用内对象拾取器回应这一点,它会打印你点到的任何东西的 变换,所以这个循环至少很短 — 但它仍然是一个循环。 如果你的工作主要是视觉摆放,基于编辑器的引擎会胜过 本引擎,与其他引擎的对比也这么说。

小到可以读完

引擎是 232 个 C# 文件,大约 119,000 行,MIT 许可。着色器是 拥有它们的特效类里的内嵌字符串,所以没有着色器构建步骤、 你的构建里没有离线编译器,也无需在一个 .hlsl 文件与调度它的代码之间保持同步。

那个规模才是真正的特性。当环境光遮蔽看起来不对时,你打开 Season/Rendering/Effects/Gtao.cs,读内核, 然后改掉它。你不必提交 issue 然后等发布。类带有很长的 解释性注释 — 魔法数字背后的推理就在数字旁边 — 这也是 本文档大部分内容的来源。

依赖少而刻意: Silk.NET 用于 D3D12 和 Vulkan 绑定,SharpGLTF 用于 glTF 解析,GtkSharp 用于 Linux 窗口,还有一个 MSDF 字体图集 包。没有插件市场可被绑定,也没有遥测需要关闭。

在有趣的层可扩展

内置特效使用的是你也会用的同一个公开 API。TAA、泛光、GTAO 和 DDGI 都是通过 FrameSchedule.RegisterCompute 注册的 ComputeEffect 子类。没有特权内部 路径,所以你写的特效与已发布的那些拥有完全相同的 能力 — 包括读取场景颜色、深度和速度,以及发布一个供帧的 其余部分消费的具名纹理。

实际上,这也让调试很便宜:每张中间纹理都有名字,而一个 Sprite2D 按名字绘制纹理。参见 compute 特效。

以及本地 AI,因为它是同类问题

在桌面应用里内置一个 ONNX 或 GGML 模型,会遇到与内置 渲染器同一类问题:版本漂移、原生依赖,以及一套难以 打包的 CUDA 栈。AI 层的存在,是为了把它变成一个已解决的 构建配置而不是一个研究项目,并且遵循与渲染器相同的 规则 — 如果硬件做不到,特性体面地拒绝而不是崩溃。

本地 AI 层解释了今天有什么可用,并且对 生活在本仓库之外的部分保持诚实。

版本 0.2.0,以及这意味着什么

引擎在 1.0 之前,版本号不是谦虚。API 在版本之间变动, 一些特性是 Windows 优先,而且有几个平台目标的测试比别的 更充分。本站文档明确标注状态,而不是把意图描述成 能力。

已发布 部分 还没有

如果这里的某页没有携带其中之一,那是因为它上面的每样 东西都已发布。

从哪里开始