笔记15
渲染简介
OpenGL抽象的渲染流程
- 设置上下文
- 设置帧渲染缓冲区
- 上传顶点缓冲区和索引缓冲区
- 上传着色器
- 设置视口
- 其他类型的渲染上下文
- 发出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)反射等技术效果 |
接下来的安排
- 构建openGL的渲染API
- 然后抽象出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中可用,但不希望它们被自动去除,可以通过以下几种方式:
- 确保函数被引用:在代码中确保至少有一个地方调用了这些函数。
- **使用
#pragma comment(linker, "/EXPORT:FunctionName")**:在需要保留的函数前添加导出指令。- 设置适当的编译选项:在编译设置中,确保未引用的函数不会被优化掉(这可能会增加DLL的大小)。
热加载
在讨论Hazel到底是静态库还是动态库导出时,提到了引擎的一个热加载功能。这是一种软件开发技术,允许在程序运行时修改代码,而无需重启程序。
- 尤其是游戏开发或应用开发中,脚本热加载用于实时更新游戏逻辑或 UI 控件等。常见的实现方式是通过脚本引擎来动态执行代码。
- 还有实时加载你载入的美术资源等等
热加载的实现方式:
- 使用动态库(DLL)进行代码热加载(也是在视频中提到了)
- 编译代码时生成 DLL 文件,程序通过加载 DLL 动态执行
- 运行时使用
LoadLibrary加载新的 DLL,旧的 DLL 则通过FreeLibrary卸载。 - 每次更改 DLL 中的代码后,程序无需重启,只需要重新加载 DLL 并更新相关接口。
- 也可以使用文件监控技术检测文件变化加载(不懂)。