Simplygon教程
Simplygon + Maya GUI使用说明
下载Simplygon 10:https://www.simplygon.com/downloads
免费版每天最多200次
运行安装exe的时候,可以点Custom Setup,去掉一些不需要的插件
Unity,UE,Max,Maya,Blender应该都是带插件的,建议模型在后三个建模软件里调整
出现License界面的时候,选择Free License安装
以Maya为例,安装完毕后重启Maya,在插件管理器里搜Simplygon,把对应的两个mll加载进来
加载mll后,最右侧工具栏会出现Simplygon的页签,点开
点击Add LOD Component -> Template -> Advanced -> Reduction
出现Reduction Pipeline面板,找到里面的ReductionSettings,点开
基本参数
ReductionTargetTriangleRatio指的是减面比例
ReductionTargetTriangleCount指的是减面的目标面数
两者共同作用时会取 ...
Premake教程
承接 https://t-rvw.github.io/blog/2022/05/27/game_engine_make/ 提到的Premake编写HelloWorld,本文会介绍更多关于premake如何在C/C++工程中使用的例子。
如果你对于C/C++工程不是非常熟悉,建议先阅读 https://t-rvw.github.io/blog/2022/09/16/native_engineering/ 。
跨平台
Windows
生成Visual Studio工程
Mac
生成XCode工程
Linux:
生成最原始的Makefile,对应参数是gmake2。然后在linux下将它指定生成到项目文件夹根目录,再用make命令跑。
premake-vslinux
Visual Studio新版本支持了vslinux的功能,也就是在Windows下配置Linux工程进行编译
模块不是自带的,需要集成 + 自行升级/维护:https://github.com/LORgames/premake-vslinux
该模块支持到vs2015,关注很少,没人提is ...
C/C++下的软件工程
工程报错的时候,不少程序员会陷入遇到问题,反复搜索各种博客,问答论坛,长时间无法解决的情况,尤其是涉及到一些外部代码,静态库,动态库等概念。本文会尝试介绍C/C++必备的工程基础,以及解决问题的思路,工具等。
工程基础首先C/C++下有四种类型的工程:控制台应用程序,窗口应用程序,静态链接库,动态链接库。前两种都属于应用程序,所以在写代码的时候,边界不会很明确,比如一个控制台应用程序类型的项目,也是可以调用SDL等窗口库函数跑起来的。
重点是后两种类型理解,对于库类型的项目,它的初衷是把某些特定的常用功能封装起来,以符号(函数或者类)的方式提供给上层,这样子上层写代码就可以专注在业务逻辑上。从实际写代码来说,如果所有功能都是源码的形式编译在一起,会因为语言版本升级等情况,维护所有的代码。库的出现,使得应用程序可以使用不同语言版本生成的库文件,项目版本更新可以跟库版本更新分离。
在C/C++中,库又分为静态库和动态库两种类型。使用静态库,需要库的头文件以及相应的静态库文件;使用动态库,除了需要库的头文件以及相应的静态库文件,还有额外的动态库文件。
另外C和C ...
自制游戏引擎 - 编辑器
游戏引擎的编辑器是一个比较尴尬的模块,一来是很多程序员觉得它技术深度很低,而且涉及很多UI,用户交互的功能;二来是它对于引擎的重要性又非常高,引擎香也怕编辑器不好用;三来是因为编辑器还是有一定复杂度的,类似Maya之类的工业软件开发,游戏程序员并不擅长理解大规模软件工程,架构下有游戏引擎,游戏专业性中间件等的依赖,上有非常多零碎的小功能需要管理,比如插件,资源商店,与其他DCC软件的互通工作流等。
技术选型路线上,第一种是引擎先自举UI模块,编辑器基于引擎自绘UI框架来制作;第二种是使用操作系统或者语言等提供的外部UI框架来制作。
其实从研发角度来说,第一种肯定是最好的,做编辑器的同时可以把自己的UI模块开发,测试一遍,因为是自己渲染的,所以很容易跨平台,UI也能定制得比较好。例如Unreal Engine是引擎自己开发的Slate UI来做编辑器。
但是从实际上来说,第二种方案程序员参与开发的门槛更低,比如使用C# Winforms/Wpf这些,微软有详细的文档,StackOverflow有各种问题的解决方法,基本上面向google编程就可以了。而第一种方法遇到问题要么自己 ...
自制游戏引擎 - Shader编译
bgfx跨平台shader方案在学习example工程的时候,你会发现代码里导入的shader是编译过的二进制文件(*.bin)。再打开shader存放的源码目录,会发现它不是主流shader文件格式的后缀名,而是.sc(shader c file)文件。这是bgfx自制的GLSL like的shader语言,即以GLSL为语法基础,加上一些自定义的宏作为扩展和跨平台语法替换。下文简称这门bgfx shader language为BSL。
BSL和GLSL的语法区别:
每个shader文件开头必须用$input/$output写明输入/输出的数据类型,每一个数据类型需要写在varying.def.sc中来绑定语义
varying.def.sc这个文件是唯一且必须提供的
BSL的所有uniform变量均为float类型,不允许bool/int
单个参数的vec2/3/4构造函数被取消了,替代物是vec2/3/4_splat;2/3/4个参数的不受影响
构造矩阵需要使用mtxFromCols ...
自制游戏引擎 - 资源编译
美术资源文件可以看成是代码的源文件,其中可能包含有不够优化的组织结构,冗余或者有轻微错误的数据,平时制作资源写入的临时数据,比如maya使用插件后容易在maya文件中留下插件自定义的信息。所以游戏引擎通常需要有一套资源编译工具来生成干净,专门为引擎需求服务的资源数据文件。
工具设计传统工具的工作流是:
引擎工具层有XXXImporter来导入某个格式的文件,然后生成引擎自定义文件,该工具由引擎编辑器提供UI操作
引擎运行时读取该自定义文件,简单处理后得到渲染要用的数据,显示
缺点:
没有考虑过把引擎运行时读取文件的代码跟引擎解耦。以unreal engine为例,很难在其他引擎里使用uasset格式的文件,或者重新导出成某个格式的模型文件。
缺少引擎到引擎数据沟通的考虑。假如我有一个移动端引擎和一个云端桌面引擎,当它们需要同时协作得到更好的体验时,需要有一份统一的数据格式,然后两个引擎各自写一遍导入,很难把共同的解析部分统一起来。
没有考虑到从引擎反向把场景数据导出成某种开源格式的场景文件,回到DCC软件或者其他引擎里编辑或浏览。Ominiverse的demo表现出这个功能的支持 ...
自制游戏引擎 - 多线程
CPU的算力是指CPU拥有的逻辑核心数(超线程下,一个物理核心等于两个逻辑核心) * 单个核心的频率,每个逻辑核心都可以挂载一个线程来实现并行计算。CPU硬件近些年的提升也是集中在可用的逻辑核心数越来越多,而非单核频率上。
举个例子,考虑一台电脑上拥有8个逻辑核心的CPU,但我们只使用单线程运算,那么程序即使写的再好也只能发挥12.5%以下的CPU性能。所以一些没有设计一套多线程基础框架的传统软件,目前非常难利用好现代CPU,虽然有一些类似Intel TBB,OpenMP之类的多线程库可以很方便地在某个功能内直接使用来优化性能,但是由于线程本身的启动,挂起,切换上下文都具备不少的性能开销,只有在明显长时间卡顿的情况下才是一个好的选择。
所以对于现代化游戏引擎或者软件设计,我们在早期就搭建好一套方便上层使用的多线程框架是有必要的:
我们可以读取当前CPU硬件的核心数量,在引擎启动时便准备好固定数量的线程数,与逻辑核心挨个绑定,避免线程管理上的混乱
多线程框架设计出的API可以让其他模块的开发减少对各类多线程同步原语的关注,可以按同步的编程思路实现异步,类似C#的await/a ...
自制游戏引擎 - 粒子系统
作为游戏引擎渲染逻辑模块内的一个常见功能,粒子频繁的创建/销毁需要做好内存管理,内存池,AoS(Array of Struct) or SoA(Struct of Array)。同时更新的粒子数量如果很大,需要考虑SIMD指令优化,使用多线程,或者是实现GPU粒子。本文会记录新开发的游戏引擎内粒子系统的设计思路。
中间件
Effekseer : MIT开源
https://effekseer.github.io/en/
与我们的游戏引擎对接
图形API
复杂度在于跨平台游戏引擎并不是固定的DirectX或者OpenGL,我们需要对接引擎RHI的每一个渲染后端
资源转换
Textures
Shaders
effekseer的shader跨平台方案是人工编写DirectX11,通过glslang搭建的工具去生成其他语言
bgfx的方案则是基于glsl语法改造的新语言,所以我们需要转译effekseer的shader代码到bgfx里
上述工作的开发已经由云风的团队开了个头,我们可以考虑使用他们的方案一起维护:https://github.com/cloudwu/efkb ...
自制游戏引擎 - 图形API
游戏引擎RHI目前选用的是bgfx
Pros
可以参考的代码比较多
Real-Time Polygonal-Light Shading with Linearly Transformed Cosines论文作者的原文实现也用了bgfx
论文作者博客,包含可运行的例子程序 - https://eheitzresearch.wordpress.com/415-2/
bgfx作者希望有人帮忙把这个例子换个小场景,然后port进来 - https://github.com/bkaradzic/bgfx/issues/1609
Github上的LightMap开源烘焙工具XAtalas,也是基于bgfx作为3D查看器
我的世界也使用了bgfx作为图形API,对bgfx的质量有一定保证
更多例子可以查看Github bgfx的README.md
兼容性,基本上所有图形API,平台都有支持,而且是经过测试的
Cons
包袱多,对新旧两三代图形API都做了支持,抽象到同一套API中,让bgfx的上层API看起来太high level,与现代图形API违背
Diligent Engine会 ...
自制游戏引擎 - 软件设计
现代化游戏引擎正在成为一个工业软件,或者说,游戏开发本身便属于一种带有娱乐性质的轻工业。本文会记录构建一个现代化 + 工业级游戏引擎所需要考虑的事情。
工业软件设计以建模软件Maya为例,我们可以参考得到一个成熟的图形相关工业软件所需要的设计。
Maya的软件设计
编辑器
让美术人员进行建模工作
插件
让技术美术编写自动化脚本/工具,提高美术人员工作效率
项目组自定义的工作流程
连通其他软件,比如集成Peforce/SVN等适合美术的版本控制软件,与其他引擎编辑器间传输场景数据
SDK
提供插件开发需要的各种API,让技术美术有足够自由度为项目定制功能
运行时与编辑器间避免耦合
提供各类脚本语言的绑定,降低开发门槛
运行时
提供实时的几何模型处理能力
提供简易的实时渲染能力
工具
可以看成是官方提供的插件,专业性更强
方便与其他工业软件的协作,比如FBX数据导入/导出
提供用户常用的功能,比如一些烘焙工具制作贴图,离线渲染器查看出图效果
游戏引擎设计参考Maya的设计,游戏引擎也可以这样分层。
自制游戏引擎
编辑器
各类人 ...