Rendering Introduction

引言

好的,之前的铺垫终于有了本章:渲染!我们将介绍渲染的基础知识,讨论渲染架构以及维护。

Introduction to Rendering

渲染是复杂而疯狂的。

一般而言渲染 = 我们在屏幕绘制图形的能力,这意味着:嘿,我喜欢这个 3D 模型;我想画画;我有整个世界;我已经建立了整个场景…..我们要以一种 实时 的方式(越快越好)渲染,通常大概是每秒 60 帧。我还希望它是 交互式 的,这意味着输入和实际处理输出的延迟很短。

这也是我们选择 OpenGL 作为最初始的图形 API 的原因之一,因为它非常简单(Vulkan 则是另一个极端)。它的跨平台特性也是衡量的一大因素,无论是 Windows、MacOS、Linux、Android 还是 IOS 都可以运行 OpenGL。

渲染让情况变得复杂,我们需要在设计 API 时隐藏所有实际的渲染 API 的抽象,例如背后的调用。理想情况下引擎拥有自己的渲染 API,然后该 API 可能会使用 DirectX12 或 Vulkan 等任何最佳适配该设备的图形 API。所以我们需要一个 API 抽象层,可以告诉引擎如何调用底层。

Rendering Architecture

Two Sides

Where do we start

Rendering and Maintenace

让我们回到引擎来看看之前的报错。

我们的 ImGUI 是以静态库形式构建:

而我们的引擎是以动态库形式构建的,将不同库链接到一起:

那么问题来了,当我们在沙盒中使用 ImGUI 时只链接到引擎,并没有链接到引擎链接的库,所以才会出现未知外部符号的问题:

有许多方式可以修复该问题,之前的章节我使用的方法是在 imconfig.h 中取消注释。

...
#define IMGUI_API _declspec(dllexport)
...

除了修改 ImGUI 源配置文件,我们也可以在 VisualStudio 中加入 IMGUI_API = _declspec(dllexport)

修复报错之后我们再看看警告提示:

很多警告都是因为 dll 导致的,所以将引擎转为静态库的想法在脑中浮现。灵活的动态链接库固然不错,然而现在出现了许多警告也确实影响到了我们开发。有朝一日也许我们可以同时支持引擎构建静态库和动态库,但就目前而言我们暂时使用静态库方便开发流程。