摘要:
需要显示一个模型,虽然可以通过在代码指定顶点数据、显示的纹理、使用的Shader等内容,但游戏开中这些数据通常都是由美术人员提供的,这就涉及到了材质和Mesh的概念。材质提供了模型的外在显示效果,如果使用的Shader、纹理、光照属性等,Mesh提供了模型的几何数据。在游戏资源管理中,有CPU资源和 阅读全文
摘要:
之前的小节,我们显示了使用木箱子外观的三角形,纹理可以极大丰富物体的表现,在这节中,我们将介绍一张图像是如何做为纹理进行显示的,最终实现下图效果: 首先,我们拥有一张.tga格式的图片,tga文件头结构如下: 1 #pragma pack(1) 2 typedef struct 3 { 4 char 阅读全文
摘要:
在光栅阶段,除了要通过片断着色程序(OpenGL叫法)着色外,还需要进行裁剪测试、Alpha测试、模板测试、深度测试、混合操作,这些操作在OpenGL、D3D、Vulkan等操作顺序不尽相同,在软件渲染器,片断着色程序是渲染管线的瓶颈所在,因此这里的光栅化之后流程如下,这里的橙色部分任意一条执行失败 阅读全文
摘要:
在第2.5节中,通过光线追踪的方式渲染了一个三角形,但由于速度太慢而不能直接用于实时渲染。主流方式通过光栅化的方式将图元显示到屏幕上。 在Windows上,屏幕空间坐标以左上角为(0,0)点,x轴正方向朝右,y轴正方向朝下。首先我们想要在屏幕上绘制一条线段,比较著名的时Bresenham绘直线算法, 阅读全文
摘要:
在3.1节中的程序中,我们在RendererApplication::OnInitialize()中看到有下面一段代码,这段代码创建了一个转换到摄像机空间的矩阵和转换到投影空间的矩阵,并将他们传递给了渲染器。到目前为止,我们还没有创建摄像机类,因为对渲染器来讲,摄像机对象最终的主要作用就是将这两个矩 阅读全文
摘要:
第三章的主要目标是完成渲染器的实现,因为进入到了主要引擎核心部分的实现,我们首先需要对引擎进行框架搭建,之后的所有内容将是在引擎框架上进行扩展。下图为引擎所包含的模块,由下向上代表了整个引擎的层次结构,上层模块依赖下次模块的实现,而下层模块则不依赖上层模块。 Dependency模块是外部依赖项,如 阅读全文
摘要:
游戏开发中地形是一个绕不开的主题。一种地形方案是地表纹理是一张由美术生成好的大图,这种方式的好处是地形的每一处看起来都不会重复,但当地形变的非常大时,纹理图也会变的更大,一张10kx10k的地图,如果按一厘米每个像素的分辨率,需要的贴图大小将达到10个G,在目前的PC游戏中,这个大小的磁盘空间也许可 阅读全文
摘要:
至此,我们已经拥有了控制基本几何图元的能力,那么这些基本的数学库能为我们做些什么呢?现在我来画第二个三角形。本节的代码利用了第1.1节中显示Windows窗口的部分,对于目前我们来说,利用什么API和平台显示图形并不重要,我们的目的是将图形画在一张Buffer代表的图上,有了这个基础以后,利用任务图 阅读全文
摘要:
实际游戏开发中,无论是游戏物理的计算,还是游戏逻辑开发,常常会用到平面、射线、球体、包围盒等几何图元,我们实现了几个常用的几何图元类。 第一个我们要介绍的是射线,射线包含了顶点和方向,与数学上的射线不同,我们用到的射线可以有距离限制,射线的参数化表示为p = o + td,p为射线上的点,o为射线的 阅读全文
摘要:
在2.2矩阵章节讲到可以将坐标空间的基向量使用矩阵来表示,从而可以用3x3的矩阵来表达物体的方位,并且使用矩阵表示方位也是图形API使用的形式。但3x3的旋转矩阵需要存储9个数据,相比较欧拉角和四元数,内存占用会比较大,并且表达并不直观。 欧拉角可以使用3个数来表达方位,欧拉角使用Roll-Pitc 阅读全文