深入解析纹理贴图——纹理压缩技术

news2024/7/6 20:09:53

by STANCH

标签:#纹理压缩 #纹理贴图

1.纹理压缩概述

3D计算机图形学离不开各种类型的纹理。纹理贴图可以极大地提高3D物体的视觉质量和细节水平,而不增加几何复杂度。简单的纹理是二维图像,该图像的单个像素称为纹素(texel)。事实上,纹理不仅可以存储颜色,还可以存储高度、法线方向、高光因子等每个纹理元素的信息。

从上至下依次为漫反射贴图,法线贴图,位移贴图,来源:TEXTURE COMPRESSION TECHNIQUES

随着现代游戏和3D应用程序体量越来越大,消耗了大量内存(存放数据的场所),其中超过一半的内存被纹理占用,在渲染场景时,会有大量的贴图被传输到GPU,不经限制的话带宽(数据传输速度的体现)很快就会成为性能瓶颈,还会导致设备发热。因此,3D程序对内存大小和带宽有很高的要求,在图形渲染过程中纹理以压缩形式存储在内存中并传输到GPU,不仅减小了纹理的内存占用,最重要的是还节省了带宽,这是 一种非常高效的性能优化。此外,纹理压缩还可以减少功耗,因为GPU和VRAM(显存)的传输可以直接转换为功耗开销。

2.图片格式与纹理格式的区别

图片格式和纹理格式都是用来存储二维图像,但其设计目标、文件结构和支持特性都存在明显差异。图片压缩格式基于整张图片进行压缩,无法实现单个像素的解析,因此无法被GPU识别,需要CPU解压缩或非压缩格式才能够被识别,增加了CPU的时间和带宽。纹理压缩格式是基于块压缩,可以让CPU以设定的压缩格式(如DXTC、ETC等)进行压缩,能够更快读取像素所属字节块进行解压缩以支持随机访问

纹理压缩和图片压缩过程图,来源:【技术美术百人计划】图形 3.6 纹理压缩——包体瘦身术

(1)图片格式

  • 图片格式是图片文件的存储格式,通常在磁盘、内存中储存和传输文件时使用
  • 图片格式通常是独立的文件,如 .jpg、.png
  • 图片格式通常只支持基本的颜色通道和透明度等属性

(2)纹理格式

  • 纹理格式是专门为 3D 图形应用而设计,用于存储和传输贴附在 3D 模型表面的二维图像,是显卡能够直接进行采样的纹理数据格式
  • 纹理格式有时会被打包进特定的容器文件中,如 .dds、.ktx 等,这种容器格式可以包含多张纹理贴图以及相关的元数据信息
  • 纹理格式可以支持法线贴图、位移贴图、金属度贴图等更丰富的材质属性

3.什么是纹理压缩?

纹理压缩是为了减少纹理数据占用的存储空间和带宽,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术,广泛应用于计算机图形、游戏、虚拟现实等领域。

图片非压缩格式:

RGBA8888 (RGBA32):一个像素32位,包含A通道,即一个像素消耗4字节

RGBA4444 (RGBA16):一个像素16位,包含A通道,即一个像素消耗2字节

RGB888 (RGB24):一个像素24位,无A通道,即一个像素消耗3字节

RGB565 (RGB16):一个像素16位,无A通道,即一个像素消耗2字节

为了介绍每个像素所占大小,以RGBA32为例,一个像素记录的颜色信息RGBA通道各占8位,一共32位,8位=1字节,共占4个字节。

4.为什么要使用纹理压缩?

尽管像jpg、png的压缩率很高,但并不适合纹理,主要问题是不支持像素的随机访问,这对GPU相当不友好,GPU渲染时只使用需要的纹理部分,纹理访问模式是高度随机的:在渲染过程中,只有部分纹理区域会被使用,而且访问顺序也是事先无法知道的。此外,相邻三角形并不意味着它们对应的纹理区域也是相邻的(下图 )。因此,图形子系统的整体性能在很大程度上依赖于纹理访问的效率。这种随机访问能力决定了各种纹理压缩格式的主要特性。

为了解决这些独特的纹理访问需求,专门的纹理压缩格式被设计出来,它们采用了与标准图像压缩算法不同的压缩方法。这些纹理压缩格式,如 DXT、ETC 和 ASTC,能够支持高效的单个纹理元素的随机访问,同时仍能提供良好的压缩比。

5.常见纹理压缩格式

(1)S3TC/DXTn/BCn

在现代桌面计算时代,纹理压缩的传统答案只有一个:DXT。由于它的起源,它也被称为 S3TC,对于某些 DirectX 实现,它被称为 BCn。最基本的是,它是一种固定的 4x4 块格式,使用 4bpp每像素所占存储空间的位数 对每个 RGB 块进行编码。为了存储 alpha 信息,要么有 1 位 alpha(使用 1bpp 的编码空间),要么有第二个 4bpp alpha 专用块,用于高质量 alpha 编码。这种方法后来出现了一些变体,将 LA 或 RG 数据存储在两个单独的 4bpp 块中,以获得更好的质量。

(2)ETC/ETC2

为了避免使用大量特定于供应商的编解码器,Khronos 定义了与供应商无关的编解码器。随着 OpenGL ES 2.0 的推出,ETC 压缩格式成为可用的多供应商扩展,以更好的质量水平提供类似 DXT 的压缩。然而,它存在的一些问题阻碍了它的广泛采用:它不是ES 2.0 的必需部分,不支持 alpha,并且只有一种模式,即 4bpp RGB。

随着 2013 年 OpenGL ES 3.0(以及完整的 OpenGL 4.3)的发布,ETC2 格式成为标准,具有向后兼容性和重要的新功能。首先,它添加了完整的 alpha 支持,如 DXT3/5(8bpp),以及 1 位“穿透”alpha(4bpp)。其次,它带来了 EAC 格式,支持 1 通道和 2 通道数据(R 和 RG,分别以 4 和 8bpp 为单位)。第三,它添加了 sRGB 数据支持。

(3)ASTC

在 Khronos 定义 OpenGL ES 3.0 的同时,业界也在努力开发一种业界领先的压缩格式,为开发人员提供更精细的控制。这促成了 ASTC 纹理压缩格式于 2012 年中期的推出。ASTC 的关键在于,虽然它使用固定的 128 位/块,但每个纹理可以在这 128 位中容纳不同大小的块,这与之前格式的固定 4x4 块不同。ASTC 利用各种方形和非方形块尺寸,提供各种派生压缩比,从 8bpp 降至略低于 1bpp,如下所示:

因此,ASTC 在调整质量与尺寸方面具有巨大优势。替代格式通常为 RGB 或单通道数据提供 4bpp,有些可以在该占用空间中容纳 alpha,有些在第二个 4bpp 部分中提供更高质量的 alpha 或第二个单通道数据块。PVRTC 是另一种提供较小变体的格式,采用 2bpp 模式。

此外,ASTC 还支持 1-4 个通道,包括全 alpha RGBA、普通 RGB、2 通道 RG (LA) 和 1 通道 R (L/A) 支持,以及自定义 X+Y 和 XY+Z 法线贴图支持。最终结果是 ASTC 可以处理大多数类型的纹理。

ASTC 的另一个主要优势是,端点、权重等的编码方法是逐块选择的,而不是全局选择的,因此编码器可以动态调整分配 128 位以更好地表示每个块中的内容。即使在更高的压缩率下,这也能提供比以前的格式更好的图像质量。

参考:

TEXTURE COMPRESSION TECHNIQUES

【技术美术百人计划】图形 3.6 纹理压缩——包体瘦身术


  关注Mapmost,持续更新GIS、三维美术、计算机技术干货

Mapmost是一套以三维地图和时空计算为特色的数字孪生底座平台,包含了空间数据管理工具(Studio)、应用开发工具(SDK)、应用创作工具(Alpha)。平台能力已覆盖城市时空数据的集成、多源数据资源的发布管理,以及数字孪生应用开发工具链,满足企业开发者用户快速搭建数字孪生场景的切实需求,助力实现行业领先。

欢迎进入官网体验使用:Mapmost——让人与机器联合创作成为新常态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMDB是什么实践案例分享

CMDB是什么&实践案例分享 腾讯蓝鲸CMDB通过集中化管理、自动化发现、灵活的模型定义和开放的API,帮助企业高效管理IT资产和配置项,提升运维效率和服务质量,同时支持与其他系统的无缝集成,适用于金融、制造、互联网等多个行业…

Airflow Dag中,某个多分支汇合的task不执行

之前才接触airflow的时候遇到这个问题,但是解决了没有记录,今天又遇到了想起来就记录下 就拿这个图举例,这是个典型的分支路最后汇合执行的task,用代码演示就是这种情况,有两条路可以执行,最后又回归同一个…

工业边缘计算网关在机械制造企业中的应用-天拓四方

随着信息技术的不断发展,工业领域对数据处理和分析的需求日益增长。工业边缘计算网关作为一种新型技术,正逐渐成为工业数字化转型的关键驱动力。本文将通过一个具体案例阐述工业边缘计算网关在工业中的应用,以及其为工业生产带来的显著效益。…

集体爆雷!突发中科院2区(Top) 被标记!新增10本期刊被“On Hold“

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…

如何在宝塔中使用命令行执行命令

一、 进入宝塔,找到网站然后点击根目录 二、进入项目中,然后点击 终端 三、如果这里会弹出输入密码的框,那就是需要你输入一下你服务器的 账号密码,然后就登录进去了,可以在这里直接执行命令即可,比如我这…

Notes客户机开启事务日志

大家好,才是真的好。 了解过事务日志的人都知道——等等,你还不知道事务日志? 那我们先介绍一下,简单来说,Domino事务日志是捕获数据库更改并将其写入的记录,然后等服务器不繁忙或按计划更新到磁盘上的No…

【前端:HTML+CSS+JavaScript】HTML基础(下)

一、表格标签 1.1 表格的主要作用 表格主要用于显示、展示数据。因为她可以让数据显示的非常频繁&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就线程显得很重要。表格不是用来布局页面的。而是用来展示数据的。 1.2 表格的基本语法 <…

了解Nest.js

一直做前端开发&#xff0c;都会有成为全栈工程师的想法&#xff0c;而 Nest 就是一个很好的途径&#xff0c;它是 Node 最流行的企业级开发框架&#xff0c;提供了 IOC、AOP、微服务等架构特性。接下来就让我们一起来学习Nest.js Nest.js官网地址 一&#xff0c;了解Nest Cli …

Python安装失败,报0x80070643-安装时发生严重错误。

背景 之前安装了3.12.4&#xff0c;因为没用到&#xff0c;就用Revo Uninstaller Pro卸载了&#xff0c;连注册表都清理了。后面看到别人写的一个工具不符合预期&#xff0c;想对源码修改下&#xff0c;用到了Python,于是重新安装&#xff0c;出现上面报错。 解决方法尝试 因…

JS 实现树形结构的各种操作(2)

一 数据源 以下所有操作&#xff0c;都使用本数据做测试。 const oraData [{id: "1",name: "动物",children: [{id: "1-1",name: "哺乳类",children: [{id: "1-1-1",name: "小猫",children: []},{id: "1-1…

c++参考std::string自己设计类hstring

目录 一、前言 二、设计需求 三、设计思想 1.功能一 1.功能二 四、设计过程 1.类hstring搭建 2. 实现有参构造函数 3. 实现副本构造函数 4.完整代码 五、结束语 一、前言 在c中有很多的库&#xff0c;但是在有些时候呢&#xff0c;我们一定要学会自己去设计库&#…

游戏服务器研究一:bigworld 开源代码的编译与运行

1. 前言 bigworld 已经开源了它的代码&#xff0c;而我对于大世界的 scale 很感兴趣&#xff0c;所以就尝试把代码跑起来研究。但是&#xff0c;整个过程比我原先预想的复杂得多。 虽然能找到一些官方的帮助文档&#xff0c;但这些文档要么过旧&#xff0c;要么过于详尽&…

SpringBoot + Maven 项目的创建

文章目录 1、Maven2、SpringBoot3、二者之间的联系4、项目的创建 在创建项目之前&#xff0c;肯定要知道他们之间的区别 1、Maven maven是一个跨平台的项目管理工具。它是Apache的一个开源项目&#xff0c;主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。 比如说…

贪吃蛇游戏代码(C语言项目)

本篇仅提供C语言代码&#xff0c;详细讲解在这篇博客&#xff1a;C语言&#xff1a;贪吃蛇游戏&#xff08;从0开始完整版&#xff09;-CSDN博客 1、运行演示 QQ2024618-155655 2、代码构成&#xff08;vs编译器&#xff09; 3、C语言代码 3.1 头文件Snake.h #pragma once #i…

存储文件夹下所有.cpp和.h的代码到对应的txt文件里

最近大半年刷了160多天的题&#xff0c;每次刷的时候都要新建一个VS文件&#xff0c;所以文件内存太大了&#xff0c;又舍不得删&#xff0c;就用ai整了一个脚本&#xff0c;可将当前路径下的所有文件里的.cpp和.h文件储存到相应名字的txt文件里&#xff0c;若文件夹下还有文件…

概率论拾遗

条件期望的性质 1.看成f(Y)即可 条件期望仅限于形式化公式&#xff0c;用于解决多个随机变量存在时的期望问题求解&#xff0c;即 E(?)E(E(?|Y))#直接应用此公式条件住一个随机变量&#xff0c;进行接下来的计算即可 定义随机变量之间的距离为&#xff0c;即均方距离 随机…

k8s集群新增计算节点使用华为iscsi存储创建的pvc存储挂载报错:FailedMount

背景&#xff1a; 因公司业务需求的增长&#xff0c;导致kubernetes集群测试环境的计算节点资源不够使用了&#xff0c;这时候就申请了几台服务器加入到kubernetes集群中&#xff0c;因为维护的kubernetes集群的对接华为了iscsi存储&#xff0c;通过storageclass组件来创建pvc存…

LangChain入门学习笔记(四)—— Model I/O之LLMs

Prompts输入大模型应用后&#xff0c;下一个重要的处理组件就是LLM或者Chat Model&#xff0c;在这里大模型根据提示语产生相应内容&#xff0c;本章主要介绍LLM。 LangChain不定义自己的LLMs&#xff0c;但是它提供标准接口。由其他的LLM提供商&#xff08;比如OpenAI、Coher…

服务器数据恢复—NTFS文件系统下双循环riad5数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC CX4-480存储&#xff0c;该存储中有10块硬盘&#xff0c;其中有3块磁盘为掉线磁盘&#xff0c;另外7块磁盘组成一组RAID5磁盘阵列。运维人员在处理掉线磁盘时只添加新的硬盘做rebuild&#xff0c;并没有将掉线的硬盘拔掉&#xff0c;所…

CleanMyMac X for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、启动台显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;配置2、授权&#xff0c;允许完全磁盘访问 安装完成&a…