FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

多人在线游戏架构实践 第十章 · apswe/GameProgrammerStudyNotes@0f59e08 · GitHub

Commit 0f59e08

Browse files
committed
多人在线游戏架构实践 第十章
1 parent 65dab94 commit 0f59e08

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

‎GameEngineArchitecture/README.md‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,9 +395,32 @@
395395
$$
396396
397397

398-
- **深度缓冲区**:用于存储每个像素的深度信息,解决了图像渲染中的遮挡问题。
398+
- **静态光照:**最快的光照计算就是不计算。因此光照最好能尽量在游戏运行前计算。我们可以在网格的顶点预计算Phong反射,并把结果储存于顶点漫反射颜色属性中。我们也可以逐像素预计算光照,把结果储存于一类名为光照贴图(light map)的纹理贴图上。在运行时,把光照贴图纹理投影在场景中的物体,以显示光源对物体的影响。
399+
为何不把光照信息直接烘焙到场景中的漫反射纹理中?原因有几个。
400+
401+
1. 首漫反射纹理贴图通常会在场景中密铺或重复使用,所以把光照烘焙在它们上是不可行先,
402+
2. 我们会使用一张光照纹理贴到所有受光源影响范围内的物体上。这样做能令动态物体经过光源时得到正确的光照。
403+
3. 而光照贴图的分辨率也可以异于(通常是低于)漫反射纹理的分辨率。
404+
4. 最后一点,“纯”光照贴图通常比包含漫反射颜色信息的贴图更易压缩
405+
406+
- **发光物体**场景中有些表面本身也是光源。例如手电筒、发光的水晶球、火箭喷出的火焰等。发光表面可用放射光贴图(emissive texture map)来模拟,此纹理的颜色永远以完全强度发射不受附近的光照环境所影响。这种纹理可以用来定义霓虹灯标志、车头灯等。
407+
有些发光物体(emissive object)会结合多种技术来渲染。例如,渲染手电简时,在直望的方向可以使用放射光贴图,在同一位置加入聚光以照亮场景,加入半透明的黄色网格模拟光锥,渲染面向摄像机的卡片以模拟镜头光量(lens flare)(若引擎支持高动态范围光照可用敷霜效果/bloom代替),以及用投射纹理把手电筒的焦散效果投射至受光的表面上。
408+
409+
- **帧缓冲**:最终渲染后的影像会储存在一个名为帧缓冲(frame buffer)的颜色位图缓冲里。虽然多数显卡支持多种帧缓冲格式,但像素颜色通常以RGBA8888格式储存。其他常用的格式包括RGB565、RGB5551,以及一些调色板模式。
410+
411+
显示硬件(CRT、平板屏幕显示器、高清电视等)会周期性地读取缓冲的内容,北美及日本所使用的NTSC电视的读取频率是60Hz,而欧洲及许多其他地区所使用的PAL/SECAM电视则是50Hz。渲染引擎通常会维护至少两个缓冲。当中,显示硬件扫描一个帧缓冲时,渲染引擎则更新另一个帧缓冲。此称为双缓冲法(double buffering)
412+
413+
通过在垂直消隐区间(vertical blanking interval,即CRT电子枪向屏幕左上角重置期间)互换两个缓冲,双缓冲就能确保显示硬件一直能扫描完整的帧缓冲。这么做能避免一个名为撕裂(tearing)的不良效果,当中屏幕上半部分含有最新渲染的影像而下半部分则仍是上一帧的残留影像。
414+
有些引擎共使用3个帧缓冲,此技术称为三缓冲法(triple buffering)。这么做的原因是,就算显示硬件仍在扫描上一帧,演染引擎已经能开始渲染下一帧。例如,当引警完成缓冲B的渲染时,硬件可能仍在扫描缓冲A,这时候引擎就可以继续把新的帧渲染至缓冲C,而不需要闲置等待显示硬件完成缓冲A的扫描。
415+
399416
- **光栅化**:将三角形转换为像素,并根据深度信息进行绘制,以生成最终图像。
400417

418+
- **抗锯齿**:当光栅化一个三角形时,其边缘可能显得像锯齿般不圆滑。我们都熟悉并喜爱(或恨)这种“梯级”效果。从技术上来说,这些混叠(aliasing)之所以产生,是由于我们使用离散的像素集对原本圆滑的、连续的二维信号进行采样(sample)。(在频域中,采样导致信号偏移并在频率轴方向多次复制。混叠的字面意思就是指信号重叠后,使信号之间产生混淆。)
419+
420+
1. 在全屏抗锯齿(full-screen antialiasing,FSAA)中,影像渲染至比实际屏幕宽一倍、高一倍42的帧缓冲里。然后再把该帧缓冲缩减采样(down sample)至所需的分辨率。FSAA很耗时,因为渲染长宽两倍大小的帧等于渲染4倍像素。FSAA的帧缓冲也需消耗正常帧缓冲4倍的内存。
421+
2. 多数现在的图形硬件能够进行抗锯齿渲染,当中用到的技术称为多重采样抗锯齿(multi sample antialiasing,MSAA)。其基本原理是把每个像素分拆为多个片段。这些片段在管道最后阶段结合成单个像素。(现在的GPU通常能支持4x及8x的多重采样。)其实MSAA仅仅是FSAA的一种优化,其优化的地方在于,深度和stencil采用超采样方式进行测试(如每像素做2x2个采样),但像素着色只是正常采样(即每像素只做1个采样)。最后如同超采样抗锯齿方法一样,把帧缓冲缩减采样至目标的分辨率。MSAA的优化能显著减少着色计算。
422+
3. 由于近年流行的延迟渲染(deferred rendering)不能使用MSAA,因此多种新的抗锯齿技术应运而生,例如,形态抗锯齿(morphological antialiasing,MLAA)、方向局部化抗锯(directionally localized antialiasing;DLAA)快速通近抗锯齿(fast approximate antialiasing,FXAA)、次像素重建抗锯齿(subpixel reconstruction antialiasing SRAA)等。
423+
401424
2. 渲染管道
402425

403426
- **固定功能管道**:传统的渲染方式,依赖于硬件的固定功能。

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL