3DWorld 博客:https://3dworldgen.blogspot.com
3DWorld 是一个基于 OpenGL 的跨平台 3D 游戏引擎,自 2001 年在加州大学伯克利分校学习 CS184 计算机图形学课程以来,我一直在研究它。它具有以下功能:
围绕 OpenGL 的 3D 图形函数、类和包装器
具有热重载功能的着色器生成器/处理器
地形、植被、城市、建筑内部和外部等的程序内容生成。
带有星系、恒星、行星、卫星等的程序宇宙生成器。
具有实时用户编辑功能的程序体素 3D 地形生成
地形生成器,包括各种噪声函数、侵蚀、实时用户编辑、高度图读/写
程序建筑(内部和外部)、道路和城市生成
原始对象类型和其他对象的物理模拟(> 10K 动态对象)
实时昼/夜循环与天气(雨、雪、冰雹、风、闪电)
具有反射和折射的基于物理的材料
动态阴影、环境光遮挡、多达 1024 个动态光源、后处理效果
骨骼动画和程序动画
内置第一人称射击游戏《笑脸杀手》
内置太空飞船+星球殖民游戏
构建开放世界物品收藏和僵尸游戏模式
计算机人工智能为 FPS 游戏中的玩家、构建游戏玩法以及宇宙游戏中的飞船提供帮助
Lightwave 对象文件、3DS 格式的导入器以及其他文件格式的 Assimp 导入器
纹理读取支持:JPEG、PNG、BMP、TIFF、TGA、DDS
针对大型模型的快速加载和实时渲染进行了优化(> 1GB 的顶点/纹理数据)
我在提交 6607 处将项目从 svn 转换为 git。大部分代码是用 C++ 编写的,着色器使用 GLSL。这是一个跨平台项目。包含 Microsoft Visual Studio 2022 项目文件。还包括 linux/gcc makefile,但更具实验性。有关更多详细信息,请参阅 README.linux。该项目应该在 Linux 上的 gcc 下构建并进行一些工作,但自从我尝试这个以来已经有一段时间了。我有一个过时的旧 makefile,但可能不需要太多工作来修复并使其可用。
请注意,这是一个大型存储库,目前约为 1GB。我包含了源代码、配置文件、纹理、声音、小模型、照明文件、场景数据、高度图和项目文件。此存储库不包含某些场景中使用的大型模型文件,您必须单独下载这些文件。这意味着某些场景配置文件将无法工作,因为它们找不到引用的数据。当前的依赖项列表是:
OpenGL 4.5(应配备 Windows 8/10/11 最新图形驱动程序)
OpenAL 1.1(可选)(系统安装:https://www.openal.org/downloads/ 或者您可以尝试更新的 openal-soft:https://github.com/kcat/openal-soft)
freeglut-2.8.1(当前 3.0 版本可能有效:https://sourceforge.net/projects/freeglut/)
freealut-1.1.0(可选)(其中一个版本在这里:https://github.com/vancegroup/freealut)
zlib-1.2.11(您可以从这里下载更新版本:https://zlib.net/)
glew-2.0.0 (2.1.0 可能也有效:http://glew.sourceforge.net/)
gli (最新版本:https://github.com/g-truc/gli / 仅标头,包含在依赖项目录中)
glm-0.9.9.0 (最新版本:https://glm.g-truc.net/0.9.9/index.html 或 https://github.com/g-truc/glm / 仅标头,包含在依赖项目录中)
libpng-1.2.20(可选)(我的版本很旧;最新版本:https://libpng.sourceforge.io/index.html);大多数情况下可以用 stb_image 替换,地图图像导出除外。)
libtiff-4.3.0(可选)(最新版本:http://www.simplesystems.org/libtiff/)
Assimp(可选)(请参阅 https://github.com/assimp/assimp/blob/master/Build.md 上的构建说明;vcpkg 构建说明可能是最简单的。)
libtarga(包含源代码)
STB 标头:stb_image、stb_image_write、stb_dxt(包含源)
我已将大多数这些库的精简版本包含在依赖项目录中。我删除了 3DWorld 不需要的所有大文件,在某些情况下甚至是示例/测试/文档。这些是在 Windows 11 上使用 MS Visual Studio 2022 Community 构建的。如果您想使用这些,您需要将目录复制到根目录并重建其他版本的 Windows 或 Visual Studio 所需的任何库。如果您克隆/安装 vcpkg,它应该与 3DWorld 目录处于同一级别。
请注意,其中许多依赖项都是旧的,可以用更新的库替换。我一直专注于添加内容,对此不太感兴趣。 Freeglut 可能应该替换为 SDL,图像库应该替换为 STB 或 DevIL。 (STB 用作后备,但不支持所有使用的图像。)
如果您想构建 3DWorld,可以使用依赖项/文件夹中的项目,或者自行下载并构建它们并更改项目设置以使用它们。我目前使用 3DWorld 的 x64 MS Visual Studio 2022 Community 构建目标,但 win32 构建目标也可以工作。 MSVS 2019 项目 3DWorld_msvs2019.vcxproj 目前已过时,但可能可以正常工作。如果将 DLL 从 lib64/ 文件夹复制到存储库的根目录并进行一些其他项目设置更改,它应该以 32 位模式编译和运行。
如果您有 Linux,您可以尝试使用提供的 makefile 进行构建。文件 README.linux 应该会有帮助。我已经构建了 3DWorld,并且主要在带有 gcc 7 的 Ubuntu 18.04 和带有 gcc 9 的 Ubuntu 20.04 上运行。
3DWorld 在命令行上获取配置文件名。如果未找到,它将读取 defaults.txt 并使用其中列出的任何配置文件。其中一些 congig 文件包括 Sponza Atrium、Stanford Dragon、sportscar 等模型。这些文件太大,无法存储在 git 存储库中。如果找不到模型,我尝试让 3DWorld 生成非致命错误。许多较大的模型可以在 McGuire 计算机图形档案中找到:http://casual-effects.com/data/
我已经打包了对于 GitHub 存储库来说太大的 3D 模型,并将它们放在 Google Drive 上(现在最高为 v6):https://drive.google.com/file/d/1crN9rqT-LSvYyTZTw5wtkhwsubE651ex/view? usp=sharing 其中一些模型以 3DWorld 的内部格式存储,不应在其他项目中重复使用。其他来自 Mixamo 等网站。还有一个纹理目录,其中包含用于建筑内部的附加纹理,可以与项目纹理目录合并。
系统要求:
Windows 8/10/11; Linux 将 makefile 与 gcc 一起使用时。
Microsoft Visual Studio 2019 或 2022。 OpenMP 支持需要专业版或社区版。你也可以尝试在linux上使用gcc。
相对较新的一代 Nvidia 或 AMD GPU(在我的配备 Intel 显卡的笔记本电脑上运行,但帧速率为 12-20 FPS)
较大场景至少 8GB 系统内存
较大场景至少 4GB GPU 显存;我的 GPU 有 12GB 内存
故障排除:似乎某些系统(特别是 AMD 卡)需要 OpenGL 核心上下文。可以通过在配置文件中添加“use_core_context 1”来选择。这也可以在 scene_config/config_post.txt 中启用,该文件是在读取所有其他顶级配置文件后应用的文件。在某些情况下(某些 Nvidia 卡),使用核心上下文可能会比较慢,这就是为什么我默认情况下没有启用它。
有用的按键(有关更多按键绑定,请参阅 readme-keys.txt):
a、s、d、w:运动
q,e:更改武器(游戏模式)
“空间”:跳跃/射击
‘esc’:退出
“tab”:屏幕菜单(使用箭头键和“X”导航以切换菜单)
b:启用对象/物理/AI(用于地面模式和宇宙模式游戏)
F1:地面/宇宙/平铺地形模式之间切换
F2:切换游戏模式
m:切换全屏模式
h:切换飞行移动
v:更改相机模式(水晶球/轨道与第一人称)
V:切换鼠标外观
K:切换俯视图模式
x:暂停
鼠标左键:转动/动作
鼠标右键:火
我目前根据 GPLv3 许可证将此存储库用于教育目的。某些子模块可通过与我的 GitHub 帐户中的商业用途兼容的其他许可证获得。它并不是一个商业工具,我也不想在这里赚钱。尽管我正在接受反馈、错误报告和建议,但现阶段我也不会寻找其他人来参与该项目。如果我决定用这个制作一个真正的游戏,也许事情会改变。如果您想在您的项目中使用此处的某些内容,请告诉我。
没有关于 3DWorld 的更多文档。不过,我确实有一个博客,其中包含算法的描述和大量屏幕截图:https://3dworldgen.blogspot.com
以下是我博客中链接的一些屏幕截图:
这是一栋大楼的零售区,里面摆满了货架。建筑物可以包含数以万计的互动对象,玩家可以随身携带。 (config_heightmap.txt)
放置在其他房间的摄像头在安全监视器上显示实时视频。 (config_heightmap.txt)
僵尸(具有寻路和其他人工智能行为)四处走动并掉入室内游泳池。水面有波纹、水花、倒影、折射。 (config_heightmap.txt)
停车场停放着汽车,洒水管布置在天花板上。 (config_heightmap.txt)
程序化的建筑地下室,有人、间接照明和沿着天花板布线的管道。 (config_heightmap.txt)
程序化的住宅区,后面有办公楼。人行道上和建筑物内都有汽车和行人。 (config_heightmap.txt)
程序建筑内部 - 一个带有程序生成书籍的图书馆。 (config_heightmap.txt)
程序生成的具有完整内饰的房屋和办公楼。 (config_heightmap.txt)
具有间接照明的夜间场景中的反射(金属)、折射(玻璃)、发射和半透明球体。实时绘制;球体可以交互移动。 (config_white_plane.txt)
具有建筑物、道路、汽车和行人的程序城市。 (config_heightmap.txt)
程序城市在晚上与前景中的桥梁。 (config_heightmap.txt)
有松树的早期程序城市。
早期的程序城市。
在放置城市之前使用域扭曲噪声和水力侵蚀模拟的地形。 (config_heightmap.txt)
具有河流、树木、草地等的平铺地形模式(config_t.txt)
涉及树木、植物和草地的实时交互式破坏性火灾/烟雾模拟。 (config_trees.txt)
程序宇宙太阳系与小行星带。 (宇宙/config_universe.txt)
Crytek Sponza 中庭场景,具有动态阴影投射光源和间接照明。 (sponza/config_sponza2.txt)
10,000 个高度详细的博物馆模型实例放置在平铺地形模式(普吉特海湾高度图)中,并使用阴影和间接照明实时绘制。 (config_museum_tt_model.txt)
Crytek Sponza 中庭设有反光地板和 200 个实时动态点光源。 (sponza/config_sponza2.txt)
办公楼庭院中有许多具有基于密度的光衰减的反射/折射球体和立方体。 (mapx/config_mapx.txt)
圣米格尔场景,具有动态降雪和使用自定义着色器渲染的路径跟踪积雪覆盖图。 (config_san_miguel.txt)
San Miguel 场景使用路径追踪的预计算间接照明、法线贴图和立方体贴图反射表面进行实时渲染。 (config_san_miguel.txt)
2M 程序生成 + 放置的松树(500K 可见)使用实例广告牌以平铺地形模式实时绘制。 (config_t.txt)
Mapx 场景中 10,000 个动态盒子的交互式堆叠。堆栈可以移动和推翻,场景可以保存/重新加载/编辑。 (mapx/config_mapx.txt)
程序生成的行星,其环包含小行星。 (宇宙/config_universe.txt)
小行星带,包含 10,000 个动态(旋转和轨道)小行星、100,000 个点精灵粒子和大量尘埃广告牌云。 (宇宙/config_universe.txt)
平铺地形模式,显示程序生成的各种形式的植被,包括草、花、松树、棕榈树和落叶树。这些实际上是投射阴影的多边形模型。 (config_t.txt)
Crytek Sponza 场景中通过基于噪声的体积烟雾的实时动态光轴。 (sponza/config_sponza2.txt)
Crytek Sponza 场景中的反光金属地板,具有间接阳光 + 天空照明。 (sponza/config_sponza2.txt)
在办公楼大厅中使用立方体贴图反射纹理在动态场景中实时绘制反射球体、环面和立方体。材料是使用基于物理的模型的金属和电介质的混合物。 (mapx/config_mapx.txt)
具有间接照明、反射表面和阴影贴图的博物馆场景。该模型具有程序纹理。 (config_museum.txt)
下雪的房子场景是通过掉落十亿个雪粒并积雪而生成的。雪是预先计算的,但可以实时渲染。 (房子/config_house_winter.txt)
雨模拟和渲染,包括每个雨滴和潮湿/反射表面的碰撞检测。 (房子/config_house.txt)
重叠聚光灯的间接照明和阴影应用于动态对象。 (mapx/config_mapx.txt)
在平铺地形模式下使用硬件镶嵌进行水波模拟。 (config_t.txt)
使用间接照明程序生成 3D 体素冰洞。该地形可以使用画笔和武器火力进行实时编辑。 (config_ice_caves.txt)
程序生成的行星完全在片段着色器中绘制,没有纹理。这包括地形生成(冰、雪、岩石、森林、沙漠、泥土)、水、云和大气。 (宇宙/config_universe.txt)