引言
在游戏引擎开发学习的第一篇blog中,我们完成了工程的配置、日志系统、事件系统架构以及ImGui的配置。现在我们将进入下一阶段——Opengl渲染阶段。
在学习这一阶段之前,我根据LearnOpengl的教程,学习了Opengl的核心模式编程(本科学的是立即渲染模式编程,没啥用),并完成了一个非常迷你的实时渲染器。如此,我对Opengl也有了浅薄的认知,所以在接下来Cherno的讲义中,我大概率不会对每个Opengl的知识点作大规模的解读和分析了,只会默认这部分是我学过的内容从而一笔带过。
P23 介绍渲染相关
这一节纯唠嗑,聊了聊渲染api是什么,为什么选择opengl而不是dx或vulkan(单纯因为opengl入门简单,不会出现写上千行代码才能勉强渲染一个三角形的窘境),以及gpu并行渲染的简单介绍。
P24 渲染架构
这一节主要是介绍了一个渲染的架构图:
右侧是渲染Api的各个实例,由这些实例可以实现绝大部分渲染内容;左侧是我们自定义的渲染器系统应该包含哪些实例或功能。
接下来是我们实现该系统的一个逻辑顺序:
首先我们选择了最容易上手(同时也最低级)的图形api--Opengl,然后针对于Opengl的每一个Api做一个封装;拥有了Api的封装后,我们开始搭建渲染器,并依次实现第一张图左侧的所有功能实例;接下来我们便可以自定义要渲染的内容,并使用渲染器进行实时渲染了。由于引擎提前抽象了渲染层,在我们完成了Opengl的渲染工作后,还可以继续引入Vulkan、dx、metal等其他api进入我们的引擎。
P25 渲染与维护
前半部分在修正ImGui导出符号丢失的bug,这个主要和工程配置有关,Cherno是将ImGui的项目设置成了lib模式,所以需要对项目的API宏定义做一些补充配置。我是直接把ImGui的文件复制到工程内了所以避免了这个bug。然后再次介绍了静态链接lib库和动态链接dll库的区别,lib库在链接时可以做的优化空间更大,但是灵活性低;dll库是将大坨的逻辑完全封装好,灵活性很高任意项目import这么一个dll文件就可以用了,但是没有任何优化空间。具体使用哪个更好呢?Cherno没有给出答案,只是放出来了个讨论区让大家评论:
所以归根到底,lib和dll我们都用到了,其中我们的lib囊括了引擎的所有架构体系(符号),而具体的函数实现全部导出为dll,但是dll还是占主导地位(lib就几kb,dll占了几mb)。那么Sandbox项目就既需要通过链接lib来获取引擎的符号和体系,还要导入dll来获取函数实现。
更改方法很简单,首先将原先dll工程的配置类型更改为“静态库(.lib)”,然后将Core.h中关于TB_API的宏定义直接留空。最后编译dll工程(现在可以改称呼叫lib工程了),会发现不再有dll生成了,取而代之是一个巨大的lib文件:
Comments | NOTHING