
Hazel游戏引擎
文章平均质量分 88
2023年2月14日开始做此专栏,可能会耗时两三个月。
此专栏是我学习TheCherno的Hazel游戏引擎教程的笔记,包括一些重要的步骤和代码及思考,建议看原视频教程。
刘建杰
像我这么混的人,
本该当个公务员。
怎么二十多年到头来,
还在招聘会沉沦。
像我这样迷茫的人,
像我这样牛马的人,
像我这样打工度年的人,
你还见过多少人。
展开
-
Hazel游戏引擎(034-035)正交摄像机实现
此两节目的为了实现一个简单的正交摄像机,能观看场景内的物体摄像机相关概念摄像机定义为我们提供了一种观察世界的方式,摄像机是从特定角度观察场景的所有物体,不仅是有特定角度,还可以调整视野大小观察场景。摄像机概念摄像机并不存在,只是计算抽象摄像机的投影与观察矩阵坐标空间,将场景内的物体先变换到观察矩阵,最后变换到投影矩阵坐标空间。摄像机属性fov视野大小、自己的位置、宽高比、近远平面范围等摄像机的观察矩阵推导介绍工作方式摄像机往后移动,其实是场景内的物体往前移动摄像机往右。原创 2023-07-02 00:00:40 · 670 阅读 · 0 评论 -
Hazel游戏引擎(033)渲染器架构抽象
此节目的Application绘制层存在OpenGL->gl开头的原始函数代码,想删掉它,并用封装的渲染架构来调用drawcall命令(glDrawElements)。渲染器架构抽象前要讨论它的工作方式才能更好设计渲染一个物体需要什么材质信息、转换矩阵信息等渲染一个场景需要什么光的信息、环境的信息、摄像机等渲染一个场景中两个物体的大概流程文字描述绘制一个场景,并且这个场景中有两个物体,应该是从一台相机上查看场景,场景负责渲染2个物体,渲染这2个物体拥有共有场景的环境信息、光的信息总结描述。原创 2023-06-29 00:11:48 · 531 阅读 · 0 评论 -
Hazel游戏引擎(032)顶点数组抽象
此节目的为了封装抽象OpenGL的顶点数组为了渲染层中没有创建顶点数组的原始OpenGL函数代码顶点数组介绍得先理解它,然后才能更好的封装抽象顶点数组是一种包含状态的实体,他们实际上不包含任何实际数据包含实际数据的是顶点缓冲区包含顶点、索引缓冲区包含索引顶点数组实际上包含的只是对顶点缓冲区和索引缓冲区的引用,以及顶点属性布局指针顶点数组有点像指针,指向现有的顶点缓冲区和索引缓冲区。一个顶点数组可以有多个顶点缓冲包含不同的信息图示:从API设计抽象顶点数组类此节完成后的类图解释。原创 2023-06-29 00:11:18 · 316 阅读 · 0 评论 -
Hazel游戏引擎(031)顶点缓冲区布局抽象
此节目的抽象顶点缓冲布局类:给出对应顶点着色器输入一样的格式,使能够自动计算每个属性的偏移量、分量大小,总大小,而不用手动计算更详细讨论:为什么要顶点缓冲区布局抽象类directx有缓冲区布局有了后可以自动计算大小和偏移量,以及能在布局就能看到顶点缓冲区、顶点着色器输入数据的结构,而不用手动计算// 手动计算与输入 glVertexAttribPointer(0 , 3 , GL_FLOAT , GL_FALSE , 3 * sizeof(float) , nullptr);原创 2023-06-27 01:50:05 · 287 阅读 · 0 评论 -
Hazel游戏引擎(030)顶点与索引缓冲的抽象
此节目的对于OpenGL的生成顶点缓冲索引缓冲这种原始代码抽象成类。Application里面有创建opengl的渲染代码,顶点缓冲、索引缓冲,想要application中不含这些OpenGL函数,就需要将这些操作封装成类。如何设计类从想使用的API形式出发// 在m_VertexArray构造函数中完成创建顶点缓冲对象、绑定、与从CPU数据发送到GPU上渲染接口的设计由于可以有多个渲染图形API:OpenGL、DX,若引擎支持两种渲染图形API,需要设计选择哪一个如果是在编译时确定选择。原创 2023-06-27 01:47:51 · 469 阅读 · 0 评论 -
Hazel游戏引擎(029)OpenGL着色器
此节目的使用shader,让渲染的三角形有颜色,并且光于shader的代码抽象到Shader类中(目前只是初步的抽象类)关于Shader告诉GPU如何处理我们从CPU发送到GPU的顶点数据着色器(Shader)是运行在GPU上的小程序,分别对应渲染管理不同阶段。着色器是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。相关网站。原创 2023-06-27 01:44:36 · 324 阅读 · 0 评论 -
Hazel游戏引擎(028)第一个三角形
此节目的为了在屏幕上用OpenGL的函数显示一个三角形,以及显示显卡信息。更多讨论此节渲染三角形,是直接调用OpenGL图形API,并没有抽象类来封装这些API,此节先让我们了解知道有哪些API,后面才慢慢封装成一个个抽象类014节以添加了Glad库,所以可以使用OpenGL函数。原创 2023-06-26 01:11:22 · 303 阅读 · 0 评论 -
Hazel游戏引擎(027)渲染上下文
此节目的用抽象类封装渲染图形API的上下文,应该可以根据不同渲染API,设置不同渲染的上下文。我认为的渲染上下文就是图形OpenGL、DX API要将图形渲染到哪个窗口上去,我目前认为上下文是窗口,但可能不止是窗口类图。原创 2023-06-26 01:09:39 · 301 阅读 · 0 评论 -
Hazel游戏引擎(026)Hazel为静态库和零警告
此节目的将Hazel改为静态库,清除警告。原创 2023-06-26 01:08:03 · 296 阅读 · 0 评论 -
Hazel游戏引擎(023-025)渲染器前准备讨论与维护
渲染器基本上是指我们在屏幕上绘制图形的能力保真性,模拟现实世界GPU用来并行计算图形像素与GPU交互需要图形接口API,OpenGl就是其中之一OpenGL较为简单原因ImGui静态链接到Hazel.dll中,但是Hazel.dll有能力删除ImGui中没有导出的函数定义内容,因此如果在链接dll文件的exe文件使用ImGui的内容,就会链接错误。原创 2023-06-26 01:06:40 · 488 阅读 · 0 评论 -
Hazel游戏引擎(022)ImGui的Docking和Viewports
此节目的为了使用imgui的新特性:停靠和多个子UI窗口,需要改变之前015016所做的(自己写关键ImGui的代码具有停靠特性要复杂很多),所以需要使用ImGui已经写好的cpp来直接使用ImGui的新特性。(可能说错了)修改后的类图可见ExamplerLayer也依赖ImGUI,因为它也可以有ImGui窗口,每个Layer都可以有一个或多个ImGui窗口。原创 2023-06-26 01:05:57 · 1589 阅读 · 0 评论 -
Hazel游戏引擎(021)数学库GLM
此节目的为了渲染需要数学运算,自己写数学运算功能可以,但写好写得运算快难。(写好数学运算需要用SIMD,知识盲区)而GLM数学库已经写好了数学运算且支持SIMD使得运算更快。相关网址。原创 2023-06-26 01:01:56 · 420 阅读 · 0 评论 -
Hazel游戏引擎(020)按键和鼠标值
此节目的由019可以在程序任何地方检测有一个键是否按下、鼠标是否点击、鼠标位置等。但是如果要针对某一个按键(A)是否按下,需要使用GLFW宏定义的键值HZ_TRACE("A键按下");GLFW_KEY_A定义在#include 文件中,这样只要使用了GLFW_KEY_A就需要包含这个头文件,这样不好,应该自定义键值,从而摆脱与GLFW紧密联系在一起。HZ_TRACE("A键按下");还为什么要自定义键值呢。原创 2023-06-26 01:00:06 · 205 阅读 · 0 评论 -
Hazel游戏引擎(019)输入事件轮询
此节目的在引擎程序中任何位置都能询问本应用是否有输入事件(按键是否按下、鼠标是否点击、鼠标位置等)。分析目前引擎程序已能获得GLFW窗口事件,但是通过Application的OnEvent分发给所属的Layer层,这并不能实现在程序任何位置都能知道此时是否有输入事件。如何实现方法一自己写一套检测输入事件系统,因为现在能接收GLFW窗口事件,当检测到一个按键按下事件时,将这个按键设置为按下,当检测到按键松开时,将这个按键设置为释放。这是一个方式,但是自己根据GLFW窗口事件来实现,有点麻烦。原创 2023-06-26 00:59:32 · 372 阅读 · 0 评论 -
Hazel游戏引擎(016-018)给ImGui添加事件
提醒此节所作的是针对旧版的ImGui库写的ImGui事件,但在022节使用新版的ImGui有提供自动处理GLFW事件,此节所作的会被022节替代此节目的为了让显示在屏幕上ImGui的UI能接收GLFW窗口事件。此节对应008计划窗口事件的Layer层,只不过将Layer层具体化为ImGuiLayer层再次回顾事件流程图示。原创 2023-06-26 00:54:29 · 1113 阅读 · 0 评论 -
Hazel游戏引擎(015)ImGui层
此节目的给窗口添加编辑UI,使用Imgui库来实现编辑UI。原创 2023-06-26 00:50:02 · 796 阅读 · 3 评论 -
Hazel游戏引擎(014)现代OpenGL和GLAD
此节目的为了使用OpenGL,而OpenGL的函数定义在显卡中,大多数函数的定义位置都无法在编译时确定下来,所以需要在运行时查询,需要使用GLAD库在运行时获取OpenGL函数地址并将其保存在函数指针中供程序运行时使用。Glad在线服务网址。原创 2023-06-18 23:45:39 · 574 阅读 · 0 评论 -
Hazel游戏引擎(013)Layers游戏的层级
此节目的为完成008事件系统设计的第四步,将事件从Application传递分发给Layer层。使引擎事件系统模块完整Layer的理解想象同Ps中一张图有多个层级,可以在层级上绘制图画Layer的设计数据结构:vector渲染顺序从前往后渲染各个层的图像,这样后面渲染的会覆盖前面渲染的图像,在屏幕的最顶层。处理事件顺序从后往前依次处理事件,当一个事件被一个层处理完不会传递给前一个层,结合渲染顺序,这样在屏幕最顶层的(也就是在vector最后的layer)图像最先处理事件。例子解释。原创 2023-06-11 20:42:15 · 1438 阅读 · 3 评论 -
Hazel游戏引擎(012)GLFW窗口事件
此节目的为了完成008计划窗口事件的接收glfw窗口事件以及回调部分此节要完成使用glfw函数可以设置(拦截)真正窗口事件的回调函数,在回调函数中转换为我们自定义的事件,再回调给Application的OnEvent,OnEvent拦截对应的事件图示部分图中是将Appilication的事件给Layer去处理,但本节是Application自己拦截事件并处理,修改后的图如下。原创 2023-06-11 20:39:17 · 1055 阅读 · 0 评论 -
Hazel游戏引擎(011)窗口抽象和GLFW创建窗口
此节目的为了有窗口效果,但不想使用原生的window32写起,所以用glfw窗口库。也为了完成008计划事件系统的创建窗口部分图示。原创 2023-06-11 20:34:27 · 1464 阅读 · 2 评论 -
Hazel游戏引擎(010)预编译头
此节目的由于项目中的头文件或者cpp文件都包含着c++的头文件,有些重复,可以将它们包含的c++头文件放在一个头文件内,这样不仅使代码简洁,而且预编译头可以加快编译速度。原创 2023-06-11 20:32:35 · 615 阅读 · 1 评论 -
Hazel游戏引擎(008-009)事件系统
此节目的由008节的计划窗口事件图中的2.3将glfw窗口事件分组成自己系统的事件Event,即写出对应glfw窗口事件的自定义事件Event类。事件最终的设计为了简便,自定义事件是立即处理事件,没有缓冲事件。缓冲事件:键盘a一直按下第一个立刻输出,顿了一下才一直输出。glfw窗口事件窗口相关事件重新调整大小、窗口关闭等鼠标事件移动、滚动、按下键盘事件键盘按下、释放类图声明由于类过多,只写几个类Event/*为了简便,自定义事件是立即处理事件,没有缓冲事件。原创 2023-06-11 19:12:04 · 1647 阅读 · 0 评论 -
Hazel游戏引擎(007)Premake
此节目的由于之前配置VS项目各项属性需要根据不同平台手动一个一个设置,很麻烦,缺乏灵活性。用lua脚本配置项目属性,使用premake运行程序一键生成VS项目及属性,更灵活简便。原创 2023-06-11 19:03:42 · 1243 阅读 · 0 评论 -
Hazel游戏引擎(006)日志+Git添加删除子模块
此节目的为了实现项目能在控制台打印日志信息,不是简单字符串输出,更要有C#语言风格的输出,能接收参数这些如何实现自己写好的日志API,得1千左右行,应使用第三方日志库。原创 2023-02-16 23:45:26 · 773 阅读 · 0 评论 -
Hazel游戏引擎(005)入口点
此节目的将上一小节的main函数入口点写在Hazel项目中,由引擎内部控制。优化dll导出导入代码,用条件编译+宏定义来编写dll导出与导入代码Cherno本节完整代码链接在Hazel项目的Application.h中. . . . };在Hazel命名空间内声明了CreateApplication函数在Sandbox项目的SandboxApp.cpp中定义了CreateApplication函数在EntryPoint.h中调用. . . }原创 2023-02-14 12:39:44 · 1164 阅读 · 0 评论 -
Hazel游戏引擎(004)项目设置
此节目的 新建好Hazel和Sandbox项目,Hazel项目生成为dll,Sandbox项目生成为exe,运行此exe通过动态链接Hazel的dll,可以调用dll定义的函数并输出信息。Cherno的Hazel项目地址。原创 2023-02-14 12:30:12 · 1089 阅读 · 0 评论 -
Hazel游戏引擎(001-003)
关于此专栏是我学习TheCherno的Hazel游戏引擎教程的笔记,包括一些重要的步骤和代码及思考,建议看原视频教程。2023年1月1日至2023年2月14日学完123集,但是期间没有做笔记,现在开始利用空闲时间做个完整的从1到123集的笔记。从2023年2月14日开始做此专栏,可能会耗时两三个月。效果展示为了避免第一个开头文章大都是文字介绍略显枯燥,先放个做到123集的效果,看看能不能引起各位兴趣由于001-003都是些文字的讲述,我放在一起。原创 2023-02-14 12:17:03 · 1868 阅读 · 1 评论