LOADING

加载过慢请开启缓存 浏览器默认开启

渲染简介

笔记15

渲染简介

OpenGL抽象的渲染流程

  1. 设置上下文
  2. 设置帧渲染缓冲区
  3. 上传顶点缓冲区和索引缓冲区
  4. 上传着色器
  5. 设置视口
  6. 其他类型的渲染上下文
  7. 发出DrawCall指令

渲染架构

俩个方面

Render APRI(API/platform specific依赖平台接口的功能API) Render API(API/[platform agonstic不依赖特定平台或图形 API)
Render Context 2D&3DRenderer(Forward.deferred)(渲染器}
Swap chain Scene Graph(场景图)
Framebuffer Sorting(排序)
Vertex Buffer Culling(剔除/裁剪)
Index Buffer Materials(材质)
Texture LOD(Level of Detail模型细节等级)
Shader Animation(动画)
States Camera(相机)
PipelinesR VFX(视觉特效)
Render passes(渲染通道) PostFX(后处理)
Other things (reflections,ambient occlusion)反射等技术效果

接下来的安排

  1. 构建openGL的渲染API
  2. 然后抽象出Renderer

渲染和维护

在笔记14那一节中,我们最后在sandbox中使用了imgui的函数,可是显示链接错误。

首先我们的imgui导出静态库lib,Hazel链接这个imgui静态库。

而Hazel导出的是动态库dll,Sandbox链接。

这就会导致一个问题,当Hazel没有使用imgui的那一部分函数,并不会从imgui的lib中整合到dll文件中,所以Sandbox使用函数如果Hazel没有调用过,Hazel.dll就不存在imgui对应函数的实现。

解决方法有很多:

  • 在 Hazel 项目的导出头文件中(如 Hazel.h),用 __declspec(dllexport) 标记需要导出的 ImGui 函数,或直接将 ImGui 的头文件和实现文件作为 Hazel.dll 的一部分导出。

  • 直接在 Sandbox 项目中链接 ImGui 静态库

  • 使用 ImGui 的动态库(DLL)链接到Sandbox

在C++中,DLL(动态链接库)与静态库之间的一个关键区别是链接方式。静态库(.lib文件)在编译时会将所有引用的函数和对象代码整合到可执行文件或DLL中。而动态链接库则只在运行时加载。

对于未引用的函数,动态链接库不会链接这些函数。这是因为动态链接库的目的是在需要时按需加载代码,而不是将所有代码都包含在内。

如果你希望某些函数在DLL中可用,但不希望它们被自动去除,可以通过以下几种方式:

  1. 确保函数被引用:在代码中确保至少有一个地方调用了这些函数。
  2. **使用 #pragma comment(linker, "/EXPORT:FunctionName")**:在需要保留的函数前添加导出指令。
  3. 设置适当的编译选项:在编译设置中,确保未引用的函数不会被优化掉(这可能会增加DLL的大小)。

热加载

在讨论Hazel到底是静态库还是动态库导出时,提到了引擎的一个热加载功能。这是一种软件开发技术,允许在程序运行时修改代码,而无需重启程序。

  • 尤其是游戏开发或应用开发中,脚本热加载用于实时更新游戏逻辑或 UI 控件等。常见的实现方式是通过脚本引擎来动态执行代码。
  • 还有实时加载你载入的美术资源等等

热加载的实现方式:

  1. 使用动态库(DLL)进行代码热加载(也是在视频中提到了)
  • 编译代码时生成 DLL 文件,程序通过加载 DLL 动态执行
  • 运行时使用 LoadLibrary 加载新的 DLL,旧的 DLL 则通过 FreeLibrary 卸载。
  • 每次更改 DLL 中的代码后,程序无需重启,只需要重新加载 DLL 并更新相关接口。
  1. 也可以使用文件监控技术检测文件变化加载(不懂)。