Cherno_游戏引擎系列教程(2):17~43

https://www.youtube.com/watch?v=DJEprZioFmU&list=PLlrATfBNZ98dC-V-N3m0Go4deliWHPFwT&index=17

17. GitHub and Hazel Game Engine series

这一节主要是讲了一些 GitHub 的 issue 啥的,然后小改了一下 premake

18. Pull Requests Game Engine series

19. Input Polling Game Engine series

20. Key and Mouse Codes Game Engine series

到目前我们仍然是依赖于 glfw 的一些api,我们这一节希望丢掉 glfw 的键鼠代码依赖。

在这里插入图片描述
我们这里创立了如上两个文件,并从 glfw3.h 中把这些按键码抄过来了。可以比如 win32 api,他的按键码和 glfw 的按键码是不一样的:
在这里插入图片描述
一种方法是在特定平台上通过宏判断然后赋予不同给的指,但是这样做的话,如果要保存按键码之类的(序列化啥的),就不方便比较了。

另一种就是搞一个 map 去映射按键码。

21. Maths Game Engine series

这里决定用 GLM

用 git submodule 添加进来

未来希望能用我们的 log 以及 imgui 打印出来。

22. ImGui Docking and Viewports Game Engine series

Docking 就是窗口停靠的意思,像这样:
在这里插入图片描述
我们可以看到,ImGui有这么一个分支:
在这里插入图片描述
我们进入 imgui 的文件夹运行这一行切换一下分支就好了:

git checkout docking

23. Introduction to Rendering Game Engine series

24. Rendering Architecture Game Engine series

在这里插入图片描述
上面少了一个 Render Command Queue

在这里插入图片描述

25. Rendering and Maintenance Game Engine series

26. Static Libraries and ZERO Warnings Game Engine series

不是说全部把dll换成lib,而是把核心的部分静态链接过去。

不过最后貌似还是把 premake 里头的配置全改成 static lib 了。。。

27. Rendering Context Game Engine series

28. Our First Triangle! Game Engine series

屏幕空间是 -1 ~ 1,因此我们的三角形顶点定义如下:

float vertices[3 * 3] = { 
	-0.5f, -0.5f,  0.0f,
	 0.5f, -0.5f,  0.0f,
	 0.0f,  0.5f,  0.0f
};

每次初始化的时候这样打印出信息:

HE_CORE_INFO("OpenGL Info:");
HE_CORE_INFO("  Vendeor: {0}", glGetString(GL_VENDOR));
HE_CORE_INFO("  Renderer: {0}", glGetString(GL_RENDERER));
HE_CORE_INFO("  Version: {0}", glGetString(GL_VERSION));

在这里可以改配置(比如我把 Vendor 从 Inter 改成了 NVIDIA):
在这里插入图片描述

29. OpenGL Shaders Game Engine series

30. Renderer API Abstraction Game Engine series

参考:https://www.cnblogs.com/hwx0000/p/15676498.html

Compile Time Or Runtime
关于游戏引擎Hazel,它需要可以根据不同的平台使用不同的渲染接口,比如DirectX、OpenGL、Metal或者Vulkan等。目前有两种做法。

第一种是在Compile Time决定Hazel引擎使用哪种渲染API,具体是通过不同的宏来实现的,比如USE_OPENGL_RENDERER这些宏,然后根据这些宏的设定,对引擎代码进行编译,就只会编译OpenGL相关的渲染代码,如果我想要OpenGL来实现绘制,就使用对应的宏build OpenGL的代码,如果想用Vulkan就用Vulkan对应的宏来build Vulkan的代码,总之最后的build出来的引擎就只是支持一个平台的渲染API。

这样做的坏处时,一次build只能用一个平台的渲染API,而且每次切换渲染的API时,都需要rebuild相关代码,这对开发者来说是很不友好的,比如说同样的技术实现的画面效果,用DX或OpenGL应该是一样的,如果不一样就说明出了什么问题,如果开发者要对比两个平台的画面效果,那么要反复切换宏,然后rebuild,这很麻烦。虽然可以把各个渲染平台对应的组件,设置为各自的dll,但仍然需要在Compile Time重新编译代码,生成新的引擎build(应该最终是exe文件)。而好处就是,引擎在runtime不必花时间去判断到底用哪个平台的渲染API,所以runtime下效率会更快

第二种是在Runtime决定使用哪种渲染API,既然是Runtime那么肯定是不能用宏了,有人之前用if条件去为每一个渲染的API做一个条件判断,这样做工程量很大,也有点傻,这里建议的做法是利用多态(虚函数)来做,比如说有Shader类,那么就有OpenGLShader和DirectXShader这样各平台的派生类,这样在build时会编译所有可用平台的相关渲染api,比如ios平台就会编译OpenGL和metal的渲染API。

31. Vertex Buffer Layouts Game Engine series

在这里插入图片描述

32. Vertex Arrays Game Engine series

Vertex Array 就像一个 state containing entity,其实本身不包含任何Buffer的数据,它只是记录了Vertex Buffer和IndexBuffer的引用,并且使用glVertexAttribPointer函数来决定VAO通过哪种方式来挖取 VBO中的数据。

33. Renderer Flow and Submission Game Engine series

34. CAMERAS and How They Work Game Engine series

35. Creating an Orthographic Camera Game Engine series

36. Moving to Sandbox Game Engine series

37. TIMESTEPS and DELTA TIME Game Engine series

我们到现在的问题是不知道我们是多少帧渲染的,也根本不知道我们的 Update 函数每秒运行多少次,那么我们的移动就会在不同帧数下速度不同。也就是没有 TIMESTEPS 我们压根无法控制我们的速度到底是多快。

所以 TIMESTEPS 是必要的。

38. Transforms Game Engine series

其实就是 MVP 里头的 Model 矩阵而已。

39. Material Systems Game Engine series

这里只是介绍了一下我们希望的方式,之前讲过材质其实就是 shader + uniform 而已(dx中则叫做 constant buffer)

我们最终希望可以做到这样:

HEngine::MaterialRef material = new HEngine::Material(m_FlatColorShader);
HEngine::MaterialInstanceRef mi = new HEngine::MaterialInstance(material);

mi->SetValue("u_Color", redColor);
mi->SetTexture("u_AlbedoMap", texture);
squareMesh->SetMaterial(mi);

每次 update 函数中我们直接这样渲染:

HEngine::Renderer::Submit(mi, m_SquareVA, transform);

40. Shader Abstraction and Uniforms Game Engine series

41. Refs, Scopes and Smart Pointers Game Engine series

为什么用 shared_ptr 而不是 unique_ptr,因为我们的循环中要有这些东西的强引用,不能被销毁,否则直接crash;而 shared_ptr 通过它的引用计数做到了这一点。

这一节我们直接在 Core.h 中添加这样的代码:

namespace HEngine
{
	template<typename T>
	using Scope = std::unique_ptr<T>;

	template<typename T>
	using Ref = std::shared_ptr<T>;
}

这样在未来,比如我们有自己的资源管理器,那么我们就可以直接写 class Ref 而不用替换代码。

因此只对那些引擎特有的需要管理资源的一些东西(如IndexBuffer)要改成 Ref 之类的,别的像我们的 Log 啥的就直接 std::shared_ptr 不用改。

42. TEXTURES Game Engine series

在一个引擎中应该要有自己的数据结构,而不应该去相信png、jpeg之类的。不过在这里我们就简单地加载一个png了。

使用的还是那个 stb_image 库。

43. BLENDING Game Engine series

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值