本期为GAMES104《现代游戏引擎:从入门到实践》视频公开课文字实录第13期。本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发。
课程共计22个课时,将介绍现代游戏引擎所涉及的系统架构,技术点,引擎系统相关的知识。为配合学习实践,课程组在 GitHub 上开源了小引擎Piccolo,上线1个月即获得了2900+star, 累计下载量已超过20000+。
以下内容为公开课视频转文字版本,为阅读通顺,有删减
01「纹理压缩」
经过上一节课,我们基本上就可以进行渲染了。(关注公众号,回复[课件],即可获取完整版课件)
下面我们介绍另外一个很关键的概念——纹理压缩。渲染的一切基础都是可渲染物体,在可渲染物体中,有一个很重要的组件,叫做纹理。对于照片来说,我们一般会将其存成JPEG或者PNG格式,或者其他一些流行的图片格式。

而在游戏引擎中,我们一般会将纹理压缩存储。大家知道,计算机会将照片进行压缩存储,对于未经压缩的BMP格式和经过压缩的图片格式来说,同一张图片所占用的空间可能会相差十倍以上。而在游戏引擎的绘制系统中,我们无法使用一些流行的、非常优秀的算法对图片进行压缩,因为经过这些算法压缩后的图片无法进行随机访问。举例来说,对于JPEG格式的文件,如果给定一个UV坐标,系统无法快速从JPEG格式的文件中获取到相应坐标的信息,而且这个计算成本非常高。在游戏引擎中,我们一般采用基于块(Block Based)的压缩方法。我们将图片切成一个个小方块,最经典的就是4×4的小方块,然后进行压缩。

这里介绍一个非常经典的算法。对于DXT类型的纹理,在一个4×4的色块中,可以找到最亮的点和最暗的点,即颜色最鲜艳和颜色最暗的点,然后将该方块中的其他点都视为这两个点之间的插值。因为对于很多图片来说,相邻的像素之间都有一定的关联度(Coherence)。所以我们可以存储一个最大值和一个最小值,然后为每个像素存储一个距离最大值和最小值的比例关系,这样就可以近似地表达整个色块中的每个像素的颜色值。在计算机图形学领域中,纹理压缩