Recent Posts

人体速写笔记


色彩光影理论



Stay Connected

A smart wordpress theme for bloggers
游戏引擎开发学习(二)渲染架构篇

游戏引擎开发学习(二)渲染架构篇

引言

在游戏引擎开发学习的第一篇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来获取函数实现。

P26 更改为lib静态库项目

这一节Cherno还是决定将项目更改为lib静态库类型了,因为通过lib链接可以提供非常大的优化余地,这对于项目的长期发展是极其有益的。

更改方法很简单,首先将原先dll工程的配置类型更改为“静态库(.lib)”,然后将Core.h中关于TB_API的宏定义直接留空。最后编译dll工程(现在可以改称呼叫lib工程了),会发现不再有dll生成了,取而代之是一个巨大的lib文件:

而此时我们也不需要一次次地在两个工程之间复制粘贴dll文件了,每次编译完TibbieEngine项目后,直接继续编译Sandbox即可运行:

这节的后半部分开始对项目的所有warning进行逐个修复,我个人认为修不修都行,但严谨起见还是跟着修一遍最好。

P27 渲染上下文

opengl的上下文概念(context)这个概念在之前的opengl渲染器中有所提及,这里直接引用一篇blog撰写的概念:

之前我们在WindowsWindow类中使用glfwMakeContextCurrent来创建了opengl的上下文。然而,WindowsWindow本身也应该是一个抽象层(因为它只是说明了Windows操作系统,而非Opengl专属),因此我们不能在这个文件中出现opengl的具体api。那么,我们就只能创建一个抽象的上下文类GraphicsContext来表示抽象的上下文对象,再定义一个OpenGLContext继承上述抽象类,来进行glfwMakeContextCurrent等一系列opengl的专属上下文操作。

P28 绘制第一个三角形

这一节需要通过Opengl的Api来完成二维三角形的渲染。非常基础的一节课,三角形的渲染方法和原理在我的opengl渲染器第一节中已经讲述得比较清楚了Opengl实时渲染器(一)架构搭建 – PULUO,大概就是VAO、VBO的数据绑定,这里就不多说了。

不过因为我们还没有定义渲染器类和渲染层,所以目前渲染的部分直接全部丢到Application去做了,盲猜后面还要做渲染层抽象,到时候所有代码全得重写,所以这部分我就直接用之前opengl渲染器里的代码糊弄了一下:

这一节甚至没有写shader,直接使用了默认shader。

P29 OpenGL Shader

这一节和上一节一样,都是非常基础的opengl知识,shader着色器这种东西之前在unity、opengl渲染器、optix渲染器中也接触了很多遍了,也没有在这里重新讲述的必要。所以这一节我就直接实现了个特简单的颜色渐变shader:

但是这一节并不是简单地将shader代码硬编码就结束了,而是定义了Shader类,在Shader类中完成着色器程序初始化、数据绑定等等内容。不过嘛,这里还没有做api的抽象,所以写在Shader类里的opengl代码到时候肯定要批量转移的,所以可以先不着急去写。

P30 渲染API抽象

这一节开始讲渲染API的抽象了,我们在渲染层(或渲染器)中会调用很多渲染API,例如申请一段gpu缓存,绑定纹理,绑定顶点数据,设置shader等等内容,对于opengl、dx、vulkan等api而言,上述的那些操作都是有不同的接口函数的。因此我们需要将渲染器的api也抽象化,然后再针对于不同平台、不同渲染api分别进行继承定义。

You may also Like

Leave a reply

Your email address will not be published. Required fields are marked *

Stay Connected

Instagram Feed

Recent Posts

人体速写笔记


色彩光影理论



×