随笔分类 -  从零开始游戏开发

一步一步搭建游戏引擎,并完成一个完整的多人角色扮演游戏。 源码地址:https://github.com/SeventhMage/GameDevFromScratch
摘要:需要显示一个模型,虽然可以通过在代码指定顶点数据、显示的纹理、使用的Shader等内容,但游戏开中这些数据通常都是由美术人员提供的,这就涉及到了材质和Mesh的概念。材质提供了模型的外在显示效果,如果使用的Shader、纹理、光照属性等,Mesh提供了模型的几何数据。在游戏资源管理中,有CPU资源和 阅读全文
posted @ 2022-11-13 16:01 毅安 阅读(469) 评论(0) 推荐(0)
摘要:之前的小节,我们显示了使用木箱子外观的三角形,纹理可以极大丰富物体的表现,在这节中,我们将介绍一张图像是如何做为纹理进行显示的,最终实现下图效果: 首先,我们拥有一张.tga格式的图片,tga文件头结构如下: 1 #pragma pack(1) 2 typedef struct 3 { 4 char 阅读全文
posted @ 2022-10-15 15:27 毅安 阅读(238) 评论(0) 推荐(0)
摘要:在光栅阶段,除了要通过片断着色程序(OpenGL叫法)着色外,还需要进行裁剪测试、Alpha测试、模板测试、深度测试、混合操作,这些操作在OpenGL、D3D、Vulkan等操作顺序不尽相同,在软件渲染器,片断着色程序是渲染管线的瓶颈所在,因此这里的光栅化之后流程如下,这里的橙色部分任意一条执行失败 阅读全文
posted @ 2022-09-18 16:10 毅安 阅读(139) 评论(2) 推荐(0)
摘要:在第2.5节中,通过光线追踪的方式渲染了一个三角形,但由于速度太慢而不能直接用于实时渲染。主流方式通过光栅化的方式将图元显示到屏幕上。 在Windows上,屏幕空间坐标以左上角为(0,0)点,x轴正方向朝右,y轴正方向朝下。首先我们想要在屏幕上绘制一条线段,比较著名的时Bresenham绘直线算法, 阅读全文
posted @ 2022-09-11 13:23 毅安 阅读(300) 评论(0) 推荐(0)
摘要:在3.1节中的程序中,我们在RendererApplication::OnInitialize()中看到有下面一段代码,这段代码创建了一个转换到摄像机空间的矩阵和转换到投影空间的矩阵,并将他们传递给了渲染器。到目前为止,我们还没有创建摄像机类,因为对渲染器来讲,摄像机对象最终的主要作用就是将这两个矩 阅读全文
posted @ 2022-08-27 15:07 毅安 阅读(232) 评论(0) 推荐(0)
摘要:第三章的主要目标是完成渲染器的实现,因为进入到了主要引擎核心部分的实现,我们首先需要对引擎进行框架搭建,之后的所有内容将是在引擎框架上进行扩展。下图为引擎所包含的模块,由下向上代表了整个引擎的层次结构,上层模块依赖下次模块的实现,而下层模块则不依赖上层模块。 Dependency模块是外部依赖项,如 阅读全文
posted @ 2022-08-14 17:16 毅安 阅读(460) 评论(0) 推荐(0)
摘要:至此,我们已经拥有了控制基本几何图元的能力,那么这些基本的数学库能为我们做些什么呢?现在我来画第二个三角形。本节的代码利用了第1.1节中显示Windows窗口的部分,对于目前我们来说,利用什么API和平台显示图形并不重要,我们的目的是将图形画在一张Buffer代表的图上,有了这个基础以后,利用任务图 阅读全文
posted @ 2022-07-24 16:27 毅安 阅读(174) 评论(0) 推荐(0)
摘要:实际游戏开发中,无论是游戏物理的计算,还是游戏逻辑开发,常常会用到平面、射线、球体、包围盒等几何图元,我们实现了几个常用的几何图元类。 第一个我们要介绍的是射线,射线包含了顶点和方向,与数学上的射线不同,我们用到的射线可以有距离限制,射线的参数化表示为p = o + td,p为射线上的点,o为射线的 阅读全文
posted @ 2022-07-24 14:23 毅安 阅读(250) 评论(0) 推荐(0)
摘要:在2.2矩阵章节讲到可以将坐标空间的基向量使用矩阵来表示,从而可以用3x3的矩阵来表达物体的方位,并且使用矩阵表示方位也是图形API使用的形式。但3x3的旋转矩阵需要存储9个数据,相比较欧拉角和四元数,内存占用会比较大,并且表达并不直观。 欧拉角可以使用3个数来表达方位,欧拉角使用Roll-Pitc 阅读全文
posted @ 2022-07-17 15:39 毅安 阅读(224) 评论(0) 推荐(0)
摘要:在游戏开发中,矩阵具有十分重要的地位,但他也只是我们操作点和向量的一个工具,在这里我们使用列优先规则来存储矩阵。在这里矩阵最主要的两个作用是:1. 旋转一个向量或者变换一个坐标点的位置;2. 坐标空间变换。对于第一点,在第2.1向量章节中,我们直接使用了三角函数对向量进行旋转,矩阵则是提供了另一种表 阅读全文
posted @ 2022-07-02 17:07 毅安 阅读(291) 评论(0) 推荐(0)
摘要:在介绍向量前,首先要介绍下坐标系统,因为向量是依赖于坐标系统的,最常用的是笛卡尔直角坐标系。坐标系分为左手坐标系和右手坐标系,如下图,当我们使用向量[a,b,c]来做为我们的坐标系时,使用的是右手坐标系,而使用[c,b,a] 做为坐标系时,则使用了左手坐标系统,即两个基向量进行叉乘a x b = c 阅读全文
posted @ 2022-06-26 17:28 毅安 阅读(276) 评论(0) 推荐(0)
摘要:软件项目中最为重要的内容之一就是内存管理,游戏开发尤为如此。一款游戏的运行需要占用大量内存资源,特别是移动设备在硬件受限的情况下,如果不能管理好内存,系统很快就会因为内存不足导致程序崩溃。内存管理中最为关心的两类问题是内存泄露和内存碎片问题。使用C++进行开发时,我们new出一个对象后很容易忘记释放 阅读全文
posted @ 2022-06-19 11:17 毅安 阅读(312) 评论(0) 推荐(0)
摘要:​ 1.11 环境搭建 本系列主要在Windows平台下进行开发,后续核心代码与可以移植到其它平台上。首先我们利用Windows API 显示最基本的窗口而不借助于任何窗口库。下面是显示一个窗口的基本代码。 1 #include <Windows.h> 2 3 LRESULT CALLBACK Wi 阅读全文
posted @ 2022-05-30 19:27 毅安 阅读(269) 评论(2) 推荐(0)
摘要:提到游戏开发,从事或了解过游戏开发的人立刻想到的可能是Unity、虚幻、CryEngine等商业引擎,如今,虚拟引擎已经迎来第五代,Unity2022版本也已经发布,越来越强大的功能被这些商业引擎所支持,使我们能够快速方便的搭建游戏框架,但引擎内部也封装了很多底层细节,对于热爱游戏开发的人而言,能够 阅读全文
posted @ 2022-05-30 19:20 毅安 阅读(267) 评论(0) 推荐(0)