zhouqijie

第一部分:覆盖层

游戏菜单、UI、HUD等覆盖层(overlay)通常是用二维或者三维的图形直接渲染在观察空间或者屏幕空间的。覆盖层通常在主场景之后渲染。

二维覆盖层的实现方法通常是使用正射投影渲染屏幕空间的quad(一对三角形)。
也可以使用正常的透视投影并把几何物体置于观察空间,使这些几何物体随摄像机移动。

屏幕坐标:

Jason:二维覆盖层的坐标可以使用屏幕像素为单位。但如果要支持多种屏幕分辨率,可以使用归一化屏幕坐标(NSC),归一化屏幕坐标不能两个轴都是0~1范围,通常y轴为0~1范围,而x轴视长宽比变化。有了归一化屏幕坐标,我们放置视觉元素时就不用考虑分辨率,而仅考虑少许长宽比因素。

CRE:归一化坐标应该可以设置两轴都是0~1范围,Unity的锚点机制就是这样做的。但是某些需要固定长宽比的UI元素就需要以像素为单位,否则会拉伸变形。

CRE:Unity的UGUI的坐标系统使用的就是锚点+相对坐标值。

CRE:视觉元素应该可以调整和设置不同的对齐方式。以便在不同长宽比下都能正常显示。

文字和字体:

游戏引擎的文本字体系统通常实现为一种特殊的二维或者三维的覆盖层。在其核心中,文本渲染系统需要按字符串显示一串文字字形(glyph),并以某种反向在屏幕上排列。

字体(font)通常以含有字形的纹理贴图实现。另外,再保存一个字体描述文件,内含每个字形在纹理中的包围盒、字体布局信息,例如字距调整(kerning)、基线偏移(baseline offset)等。

优良的文本/字体系统必须处理不同字符集的区别,以及各语言固有的阅读方向。也可以包含一些特殊的功能。




伽马校正

阴极射线管(CRT)显示屏往往有非线性的亮度响应曲线。即输入CRT的RGB值和人眼实际感知的CRT值不是线性的。(显得比理论上更暗)

一般CRT显示屏的伽马响应曲线(gamma reponsive curve):
$V_{out} = {V_{in}}^γ$

其中CRT显示器的γ值一般为2.2。要校正此情况,通常会进行一个逆变换,使用1/2.2即0.455作为校正值。

有些纹理图片是伽马编码校正过的。有些高质量渲染引擎会先把纹理图片伽马解码。




全屏后处理效果

全屏后处理效果(full-screen post effect)应用在已渲染的三维场景上,以增强真实感或者做出特殊风格。

全屏后处理的实现方法通常是把屏幕所有内容传送至含所需效果的像素着色器。实际过程就是把已渲染场景图像以一个全屏四边形进行渲染。

  1. 动态模糊(motion blur)。(动态模糊的实现方法是渲染一个屏幕空间的矢量缓冲区,并使用此矢量场选择性模糊已渲染图像,模糊方法是施加一个卷积核)
  2. 景深模糊(depth-of-field blur)。(使用深度缓冲区的内容调整模糊程度)
  3. 晕影(vignette)。(晕影降低屏幕四角的亮度饱和度,实现方法是简单地覆盖一层遮罩)
  4. 着色(coorization)。(即任意方式修改屏幕上的颜色,例如除了红色部分其他全显示为黑白)

(END)