我了解的3D游戏引擎和图形开发框架

news2024/11/24 7:42:28

如果你像我一样,没有什么比编写或设计软件更让人兴奋的了。 当我编写代码时,我所获得的巨大快乐促使我开发了跨越许多软件领域的项目。

这些领域之一是为本机应用程序、桌面展示或 Web 创建 3D 图形。 我从未创建过任何 3D 游戏,但很多时候我需要创建 3D 物理模拟或呈现 3D 场景以响应作为输入接收的数据流。

在我决定开发 3D 软件之前,没有人警告过我,决定从什么开始将是一项挑战。 从用于创意场景的过多框架来看,在开始做任何工作之前我必须做很多工作:)。

免责声明:这不是另一个“top X”帖子。 我要谈论的一些技术可能肯定很流行,但这不是重点。 3D 图形场景非常广阔,这更像是我对一些解决方案的方法和经验的记录,而不是对顶级框架的比较。

NSDT在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 

1、游戏引擎

啊,这是我遇到的大多数软件工程师的甜蜜圣杯。

我一生中接触过的大多数开发者对于创建游戏甚至使用游戏都抱有相当模糊的想法。 3D 图形是一整套哲学,其中涉及许多软件工程师所畏惧的东西; 数学。 四元数、矩阵变换、这如何应用于光线投射、照明如何工作(仅举几例)。

理论部分之后,接下来是实践部分:文件格式(PNG、GLTF、导入器)、网格、图形规范(OpenGL、WebGL、Vulkan、Metal)。 然后你有物理引擎、声音引擎、游戏引擎、AI引擎。

幸运的是,我们有游戏引擎来帮助我们摆脱所有这些烦人的事情,减轻开发人员的负担,让我们专注于重要的事情:我们的游戏。 但如果我们不想开发游戏怎么办? 如果我们希望运行 3D 模拟、可视化一些数据、查看一些模型或在简单的 AR 应用程序中工作,该怎么办?

2、AAA级游戏引擎

在游戏开发场景中,你拥有那些能够开箱即用的大型游戏引擎,例如 Unreal Engine、Unity、CryEngine。 这些引擎绝对可以做任何事情。 它们最初设计时就考虑到了构建游戏——这一点也表明了这一点。 一些最好的 AAA 游戏就是用它们构建的。 还有Godot引擎。

不久前,我使用我的 Mac 开始了我的游戏引擎之旅。 我知道多年来,Mac 上的游戏一直是事后才想到的(无论是创作还是游戏),但由于各种原因,不在 Mac 上开发和玩游戏会造成交易破坏。 首先,它显示了一个游戏/游戏引擎是多么的深思熟虑。 其次,我的主要开发机器是Mac,我不打算很快放弃它。 最后,AR 在 iOS 上大放异彩,借助 Metal,macOS 变成了处理野兽。 无论如何,请考虑我在这里的经历是使用 Mac 获得的(尽管事件的性质对读者来说应该没有区别)。

AAA 引擎是有成本的,要么是版税,要么是每月费用。 然而,提到的那些提供了一些非常宽松的免费计划,允许在生产中进行实验和使用。

根据我对 Unity 和 Unreal 的有限经验,我想说 Unreal 在“最佳外观游戏引擎”类别中获胜,同时仍然提供在 Mac 上开发的能力(CryEngine 目前无法做到这一点)。 然而,Unity 在“最佳生态系统”方法中无疑获胜。 对于我的简单 3D 游戏来说,通过执行简单的 Google 搜索就可以相对轻松地找到我需要的任何内容。 我认为Unity的编程模型与此有关。 你会看到,在虚幻中,你要么使用蓝图(虚幻的可视化脚本系统),要么使用 C++。 Unity 还提供了可视化脚本系统(我不认为它像 Unreal 那样功能齐全)和 C#。 C# 是一种比 C++ 更容易学习和使用的语言,这使得开发对于经验不足的程序员更具吸引力。

难怪大多数游戏开发工作申请都提到 Unity 作为先决条件。

3、对于爱好者:Godot

然而最近,又有一款游戏开发引擎引起了我的注意,名叫Godot。 Godot 标榜自己是“我们一直在等待的游戏引擎”,并引入了“制作游戏的不同方式”。

我很感兴趣,决定尝试一下,结果给我留下了深刻的印象。

Godot 在我的 Mac 上大约需要 75MB,包括整个应用程序和游戏引擎。 而且它是完全免费和开源的。 没有版税,没有付款,甚至连简单的注册都没有。

Godot 的开发模型围绕将行为和外观放入动画和脚本等对象中,并在任何你喜欢的地方重用它们。 这对我来说是相当新鲜的——它只是“点击”到了我的脑海中。 这就是我想要开发场景的方式。 更不用说精美的用户界面让你想使用该引擎。 Godot 的脚本语言主要是 GDScript,一种功能齐全的类似 python 的语言,并且还支持 C++(通过绑定)和 C#(在后续版本中添加)。

据传 Godot 擅长 2D 游戏开发,但不擅长 3D 游戏。 对于我创建的场景和引擎附带的演示来说,Godot 已经足够了,尽管它无法在复杂的 3D 场景和 AAA 引擎中执行。 也就是说,Godot 渲染引擎正在被重写以使用 Vulkan(并且在 OS X 上,它将使用 MoltenVK 作为从 Vulkan 到 Metal 的转换层),因此 Godot 4.0 将缩短与 AAA 引擎在性能和质量上的距离。

总而言之,Godot 是我在开发业余爱好项目时最喜欢的游戏引擎。 GDScript 非常适合游戏开发。 Godot 对开发人员非常友好,以至于有人甚至只使用引擎本身就在 Godot 中创建了精灵编辑器 — Pixelorama。

总的来说,如果我要投入时间进行游戏开发并被一家大公司聘用,我会选择 Unity 并且仍然学习 Godot。 对于我目前的项目来说,无非是简单的概念证明或简单的模拟,Godot 已经足够了,而且会变得更好。

另外,有点偏离主题,但如果你正在寻找优秀的 2D 游戏引擎,可以看看 Cocos。

4、图形框架/中间件

对于任何涉及 3D 图形的项目来说,拥有 Unreal、Unity 或 Godot 等游戏引擎似乎就足够了。

但这不是真的。 尽管这些引擎完全能够产生我感兴趣的图形保真度,但我决定不将它们用于需要 3D 图形的项目。 对于许多用例来说,使用功能齐全的游戏引擎可能看起来有点大材小用。

我以以下心态接触这些引擎:

  • 我是一名业余 3D 开发者(请注意,我不是游戏开发者)
  • 我想创建 3D 图形,并将它们与声音很好地结合起来,并使它们具有交互性。
    我希望能够使用默认的物理引擎执行简单的模拟。
  • 我想将我构建的任何内容合并到本机应用程序中,无论是在 Windows、iOS、Android 还是桌面上。

当谈到研究创意编码解决方案时,我需要做出的第一个选择是我是为浏览器(并且我可以将其嵌入到任何地方)还是为桌面开发一些东西。 我研究了两种做我需要做的事情的方法。

Web 3D 的优点:

  • 设置更容易
  • 它不需要你搞乱本机编译——由于操作系统及其驱动程序和 OpenGL 实现之间的差异,这会很痛苦。
  • 不必担心 OpenGL 被弃用(特别是如果你想面向 macOS 用户)。
  • 比 Native 更多的开发者友好框架
  • Javascript 比 C++(大多数原生 3D 库和框架选择的语言)更容易理解。
  • 它本质上是跨平台的。 它还可以轻松嵌入到任何 Web 应用程序中。

原生 3D 的优点:

  • 极致性能。 你可以做的事情没有任何限制。 如果 OpenGL 还不够,你还可以使用 Vulkan 或 Metal。
  • 可以更好地访问计算机的外围设备。 这对于从事外部输入工作的创意编码人员来说非常重要。
  • 它具有多线程。 JavaScript 不支持此功能。
  • 你有更多的选择(尽管其中大多数选择要求你比为浏览器进行开发更深入)
  • C++ 很方便。 不完全是。 就像当你想要一个富有表现力的 API 来执行数学计算时一样。 运算符重载在 C++ 和 GLM 中确实大放异彩。
  • 我知道我们正在谈论 3D — 但是如果想将视觉效果与声音相关联,则 Native 库和 Web 库之间根本无法进行比较,因此根据需要的声音处理量,你将必须使用 Native。

最终,我的项目的需求决定了我应该走的路。 所有这一切的要点是,Web 有其自身的一系列限制,并通过提供开发的便利性和简单性来弥补这些限制。 我想说,如果你想利用外围设备、声音/视频处理等,请从 Web 方法开始,然后深入研究 Native。

5、原生图形框架

我们先介绍面向创意编码人员的原生图形框架。

5.1 OpenFrameworks

OpenFrameworks 是创意编码人员的完美解决方案。 它是一个基于 C++ 的开源项目,其文档非常出色。 与其他创意编码框架相比,OpenFrameworks 的历史最长,因此其社区规模也更大。 OpenFrameworks 的大部分出色功能都归功于其庞大的附加生态系统。 有些比其他的维护得更好,但这确实表明 OpenFrameworks 是一个得到良好支持的框架,可用于构建解决方案的基础。 当谈到支持像 Kinect 这样的外围设备时,很可能有人已经发布了它的库。

如果满足以下条件,请考虑使用 OpenFramework:

  • 你想要一个使用 C++ 的高性能创意编码框架
  • 你需要利用庞大的社区,并需要社区可以提供的任何出色的扩展。

5.2 Cinder

Cinder 是 OpenFrameworks 的替代品。 它的用户群要小得多,但它针对的是需要强大且面向对象的方法的开发人员。 OpenFrameworks 具有使用 C++ 语言包装 C 风格代码和库的方法。 另一方面,Cinder 是围绕与 C++ 一起使用的概念构建的。

这使得 Cinder 成为一个经过深思熟虑的框架,具有出色的编程范式,旨在被经验丰富的开发人员利用。 它有非常好的文档,并且内置了对音频、视频和图像处理的支持。 它还提供了丰富的数学和实用程序库作为其核心的一部分。

在使用 Cinder 时,我非常喜欢的一点是,从头开始创建一些东西是多么容易,同时又能够尽可能接近底层。 Cinder 不会对你想要做什么做太多假设。

如果你想了解有关 Cinder 开发的一些项目的更多信息,可以查看展示页面。

谁应该使用 Cinder?

  • 寻找 OpenFrameworks 替代方案的创意程序员
  • 开发人员正在寻求一种更加以 C++ 为中心的创造性编码方法。
  • 不害怕尝试新事物并与较小社区的框架一起生活的人

5.3 Magnum Engine

Magnum Engine 是一个引起我注意的框架,它是跨平台数据可视化的低级选择之一。

我最终没有使用它,因为我的项目总是需要更高级别的东西。 我对为图形提供平台所做的工作印象深刻,它不仅仅是现成的库。

Magnum 是人们用来开发自己的解决方案或库的框架之一。 支持 OpenGL,目前正在添加 Vulkan。 如果您喜欢将时间投入到较低级别的图形机制上,那么这就是适合您的框架。

5.4 bgfx

bgfx 是一个跨平台渲染库。 它是低级的并且面向 C++。 bgfx 支持多种渲染后端和平台:Direct3D、Metal、OpenGL、Vulkan —所有这些都适用于 iOS、Android、Linux、Windows 等。

bgfx所做的工作令人惊叹,它是经过严格考验的低级图形库之一。 许多游戏都使用它作为渲染后端(例如 ioquake3、mame),并且它的功能是无限的。 有趣的事实:Babylon Native 也使用它(请阅读下文)

bgfx 非常底层,它在渲染框架和平台之上提供了一个很好的抽象层,这样你就不必考虑支持不同的供应商和代码库。

因此,它不太适合创意编码,但这并不意味着你不应该使用它。 你应该意识到,如果打算使用它,你将需要比通常使用 OpenFrameworks 等解决方案所做的更深入。

6、Web图形框架

如果你正在寻找一种在 Web 上制作 3D 的方法,事情会更简单。 我只使用了网络上可用的两个引擎,但是有了这些引擎,我真的不需要比它们提供的更多的东西了。

6.1 ThreeJS

ThreeJS 是网络上最流行的 3D 图形框架。 它有一个充满 3D 示例的网站。 它的社区非常庞大,而且也有基于它构建的游戏引擎。 这是因为 ThreeJS 本身并不是一个游戏引擎。 事实上,它无非就是渲染图形。

然而,它在这方面做得已经足够了。 多年来人们一直用它建造美丽的东西。 我已将它用于简单的项目,我尝试为我所拥有的特定用例制作简单的 GLTF 查看器。 我发现我可以轻松创建 3D 场景,在其中放入一些东西、一些灯光和相机。 图形质量也非常出色。

ThreeJS 附带一个编辑器来构建基本场景或测试现有场景; 有很多导出选项。 您可以将场景最终导出为 ThreeJS 本机格式、COLLADA、GLTF、wavefront obj 等。 总的来说,使用它非常棒,直到我需要更多东西为止。

6.2 Babylon.js

我必须承认,我不确定 Babylon.js 是否应该归入这一类别,因为它既可以用作游戏引擎,也可以用作创意编码框架。

Babylon.js 于 2013 年发布,由两名 Microsoft 员工开发,并且仍然得到 Microsoft 的支持。 Babylon 是一个成熟的游戏引擎,它不仅仅是一个创造性的编码框架或渲染引擎。 它还扩展到覆盖原生平台 ——尽管现在判断结果如何还为时过早。 Babylon Native 使用 bgfx 作为其渲染后端。

Babylon.js 附带了一个很棒的游乐场工具,可以进行一些实时编码和场景构建。 它还包括一个精灵编辑器、一个材质编辑器等等。 还有一个优秀的编辑器,由社区维护,并且是开源的。 它支持拖放材质和对象、设置具有高级灯光效果的场景、放置声音效果、构建游戏逻辑等等。

根据我的经验,Babylon 使用更自然的光照来渲染我放入的场景,并且它还能够处理包含数十万个对象的更大场景,而不会造成太大压力。

虽然你可以使用编辑器创建 Babylon 场景,但也可以使用纯 JavaScript 库手动执行此操作。 这非常重要,因为我想动态加载一些 GLTF 模型,并根据导入的模型放置一些灯光和效果。 我无法使用预先构建的模型来做到这一点。 设置相机也非常简单。

让我更喜欢 Babylon 的是它的易用性、具体的 API、一流的 Typescript 支持和优秀的工具链。

7、结束语

我想通过这篇文章记录我多年来使用一些 3D 引擎/框架的经验。 无论你的经验如何,创建 3D 图形既有趣又充满挑战。 这对我来说也是最有价值的,尽管我目前没有日常工作来支持此类项目。

总体而言,3D 图形软件领域似乎充满了解决方案,并且没有一种放之四海而皆准的方法。 最有帮助的是了解 3D 图形的基础理论和技术,然后以每次解决明确定义的问题的心态来处理每个框架/引擎。 因此,你应该做好大量工作来确定适合每种场合的 3D 软件工具。


原文链接:我了解的3D引擎和框架 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust】快速教程——一直在单行显示打印、输入、文件读写

前言 恨不过是七情六欲的一种,再强大的恨也没法独占整颗心,总有其它情感隐藏在心底深处,说不定在什么时候就会掀起滔天巨浪。——《死人经》 图中是Starship扔掉下面的燃料罐,再扔掉头顶的翅膀后,再翻转过来着陆火星的…

SASS/SCSS精华干货教程

目录 介绍 基本说明 特点 sass语法格式sass的语法格式一共有两种,一种是以".scss"作为拓展名,一种是以".sass"作为拓展名,这里我们只讲拓展名: 编译环境安装 Vscode安装编译插件 简单使用 sass语法扩张…

15.ORACLE11g的归档方式和日志文件的相关操作

ORACLE11g的归档方式和日志文件的相关操作 一、什么是日志文件1、在线日志文件2、归档日志文件 二、Oracle 11g 归档方式:1、归档方式状态2、归档日志方式下数据库的工作原理3、配置归档日志方式3.1 开启归档模式3.2 日志文件相关操作: 4、oracle11g联机…

API接口测试工具为什么尤其重要

在现代软件开发中,API接口测试工具扮演着关键的角色,连接不同的软件组件,实现数据传递和功能调用。为确保API的可靠性、安全性和性能,此工具成为不可或缺的一部分。本文将介绍API接口测试工具的重要性! 1. 自动化测试的效率 API接…

Java集合大总结——Set的简单使用

Set的简单介绍 Set接口是Collection的子接口,Set接口相较于Collection接口没有提供额外的方法。Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。Set集合支持的遍历方式和Collection集合一样&am…

【前端学java】Java中的异常处理(15)完结

往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 (…

Universal adversarial perturbations(2017 CVPR)

Universal adversarial perturbations----《普遍对抗扰动》 通俗UAP算法步骤理解:对于 x i ∈ X {x_i} \in X xi​∈X 的每个采样数据点,比较 k ^ ( x i v ) \hat k({x_i} v) k^(xi​v) 与 k ^ ( x i ) \hat k({x_i}) k^(xi​) ,如果 k…

电脑监控软件都有哪些,哪款好用丨全网盘点

电脑监控软件是一种用于监视和控制计算机的软件工具,可以帮助企业和个人了解计算机的使用情况,保护数据安全,提高工作效率等。 电脑监控软件都有哪些: 1、域之盾软件 这是一款功能强大的电脑监控软件,可以实时监控电脑…

算法之回溯

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

Java SE——*API API帮助文档

1. API概述 Java中的API可以理解为一本编程字典或者工具包,它包含了许多预定义的类、接口和方法,可以帮助我们更方便地开发Java程序 想象一下,当你要做一个饭菜的时候,你需要食谱和厨具。食谱告诉你需要哪些食材和步骤&#xff…

腾讯云助力港华能源上线“碳汭星云2.0”,推动能源行业绿色低碳转型

11月17日,港华能源与腾讯云联合打造的港华智慧能源生态平台“碳汭星云2.0”升级上线。依托双方的连接、大数据能力和行业深耕经验,该平台打破了园区“数据孤岛”,进一步提升了数据治理、应用集成和复制推广能力,未来有望以综合能源…

记录一次较为完整的Jenkins发布流程

文章目录 1. Jenkins安装1.1 Jenkins Docker安装1.2 Jenkins apt-get install安装 2. 关联github/gitee服务与webhook2.1 配置ssh2.2 Jenkins关联2.3 WebHook 3. 前后端关联发布 1. Jenkins安装 1.1 Jenkins Docker安装 Docker很好,但是我没有玩明白如何使用Docke…

php伪随机数

利用工具 php_mt_seed <?php // php 7.2function white_list() {return mt_rand();}echo white_list(), "\n";echo white_list(), "\n";echo white_list(), "\n"; 输入命令&#xff1a; ./php_mt_seed 1035656029 <?phpmt_srand(181095…

通过U盘重装Win10教程图解

如果我们发现Win10电脑系统出现了问题&#xff0c;可以通过简单的操作来解决问题。如果还是不能解决系统问题&#xff0c;这时候用户就给电脑重新安装Win10系统&#xff0c;这样就能轻松解决问题了。接下来小编给大家详细介绍关于通过U盘重新安装系统Win10的方法步骤。 准备工作…

PC3329L DC-DC降压 10V-100V输入3A大流输出带EN功能实现零功耗只需极少元器件

1. PC3392L特性  通过使能脚关断实现零功耗  宽电压输入范围 10V 至 100V  最大输出电流 3A  集成功率 MOS 管  外围器件少  输出短路保护  温度保护  逐周期限流  输出电压灵活可靠  ESOP8 2. 描述 PC3392L 一款宽电压范围降压型 DC-DC 电源管…

Java面试题07

1.线程池都有哪些状态&#xff1f; 线程池的状态有RUNNING&#xff08;运行中&#xff09;、SHUTDOWN&#xff08;关闭中&#xff0c;不接受新任务&#xff09;、 STOP&#xff08;立即关闭&#xff0c;中断正在执行任务的线程&#xff09;和TERMINATED&#xff08;终止&#x…

Blender洪水淹没毁墙效果

本文中用到了两个Blender插件&#xff1a;FLIP Fluid(流体模拟相关插件) 和 RBDLab&#xff08;碎裂插件&#xff09;: 1.用FLIP Fluid制作流体、域、障碍&#xff0c;确定好流体的冲刷方向&#xff08;后期好摆放被摧毁的墙体&#xff09;&#xff0c;利用插件做出水流动画&a…

信息中心网络提出的背景、研究现状及研究内容

信息中心网络什么时候提出的&#xff1f;未来发展前景&#xff1f;有什么著名实验室在做&#xff1f; 1、提出背景&#xff1a; 互联网产生于上世纪60年代&#xff1a; &#xff08;1&#xff09;网络设备数量呈指数性增长 截至2022年底全球范围内预计将有超过280亿台终端设…

【openGauss/MogDB的TPCH测试】

TPC-H是一个决策支持基准&#xff08;Decision Support Benchmark&#xff09;&#xff0c;它由一套面向业务的特别查询和并发数据修改组成。查询和填充数据库的数据具有广泛的行业相关性。这个基准测试演示了检查大量数据、执行高度复杂的查询并回答关键业务问题的决策支持系统…

MobaXterm配置ssh端口转发(tensorboard使用)

背景&#xff1a; 我有一台本地Windows电脑&#xff0c;上面安装了MobaXterm软件。 MobaXterm通过ssh连接了一台服务器&#xff08;默认是通过22端口连&#xff0c;我这里配了一下&#xff0c;要填别的&#xff09; 现在服务器在跑模型&#xff0c;其6006端口是tensorboard端口…