GPU纹理压缩格式(详解ETC1)

news2024/9/24 11:31:45

参考

纹理压缩格式原理概述:

  1. 你所需要了解的几种纹理压缩格式原理
  2. Compressed GPU texture formats – a review and compute shader decoders – part 1

ETC1格式:ETC1压缩纹理格式详解

ETC1

将4x4像素(16RGB8位共384位,48字节)压缩为64位(8字节),压缩比6:1。

压缩后的格式:

  • flipbit:1位(将4x4像素点横分还是竖分)
    在这里插入图片描述在这里插入图片描述
  • diffbit:1位
    • 当 diffbit 为 0 时:两个subblock的RGB均值都用4位表示(R4G4B4)
    • 当 diffbit 为 1 时:subblock1的RGB均值为R5G5B5,subblock2的RGB均值为R3G3B3【这对subblock2的精度肯定并不友好】
  • 两个subblock的RGB均值 baseColor :24位(R4G4B4 * 2 或 R5G5B5 + R3G3B3 )
  • 每个subblock有一个行索引:2个subblock * 3位行索引 = 6位
  • 每个像素有一个列索引:4x4像素 * 2位列索引 = 32位

一个解码索引表,所有贴图公用,所以不算进压缩位中
在这里插入图片描述

因此,4x4像素最终被压缩为
位数 = f l i p b i t + d i f f b i t + b a s e C o l o r + 行索引 + 列索引 = 1 + 1 + 24 + 6 + 32 = 64 位 位数 = flipbit + diffbit + baseColor + 行索引 + 列索引 \\ \quad\quad\quad = 1 + 1 + 24 + 6 + 32 = 64位 位数=flipbit+diffbit+baseColor+行索引+列索引=1+1+24+6+32=64

格式编排:

  • diffbit为0
    在这里插入图片描述在这里插入图片描述
  • diffbit为1
    在这里插入图片描述在这里插入图片描述

解码过程:
f o r ( i = [ 0 , 3 ] , j = [ 0 , 3 ] ) { b l o c k I n d e x = 像素 [ i ] [ j ] 所在的块( 0 或 1 ) c o l o r [ i ] [ j ] = b a s e C o l o r [ b l o c k I n d e x ] + T a b l e [  行索引 [ b l o c k I n d e x ]   ] [  列索引 [ i ] [ j ]   ] } for(i=[0,3],j=[0,3])\{\\ \quad blockIndex = 像素[i][j]所在的块(0或1)\\ \quad color[i][j] = baseColor[blockIndex] + Table[\ 行索引[blockIndex]\ ] [\ 列索引[i][j]\ ]\\ \} for(i=[0,3],j=[0,3]){blockIndex=像素[i][j]所在的块(01)color[i][j]=baseColor[blockIndex]+Table[ 行索引[blockIndex] ][ 列索引[i][j] ]}

编码过程:
ETC1的编码流程如下:
1、将图像划分为一系列 4X4 的子块。
2、对每个子块,尝试所有的编码可能性,取解码后和原block像素差值和最小的一种编码。
(1)是否flip,这个决定subblock如何划分
(2)每个subblock用哪一行差值表
(3)每个像素取哪一列的差值
注:决定好flip之后,颜色均值和是否能用diff方式已经确定,这个不用遍历。
3、合并所有子块编码。

不难看出,编码过程需要遍历所有可能性,其复杂度远大于解码,每一个 RGB 像素变成了一个精度较低的RGB均值和一个2位差值号,因此产生压缩。这种预测式表述自然本身就存在偏差,压缩损失亦来自于此。

在这里插入图片描述

Unity几种ETC纹理压缩格式:

  • RGB ETC1 4 bit :4 bits/pixel,对RGB压缩比6:1,不支持Alpha,绝大部分安卓设备都支持。
  • RGB ETC2 4 bit :4 bits/pixel,对RGB压缩比6:1。不支持Alpha,ETC2兼容ETC1,压缩质量可能更高,但对于色度变化大的块误差也更大,需要在OpenGL ES 3.0和OpenGL 4.3以上版本。
  • RGBA ETC2 8bit :8 bits/pixel,对RGBA压缩比4:1。支持完全的透明通道,版本要求同上。
  • RGB +1bit Alpha ETC2 4bit :4 bits/pixel。支持1bit的Alpha通道,也就是只支持镂空图,图片只有透明和不透明部分,没有中间的透明度。

EAC:核心原理与ETC相同,但它只用于单通道或双通道数据,OpenGL ES 3.0和OpenGL 4.3后的设备大部分支持,但由于安卓平台五花八门的兼容性,一般不建议用单双通道贴图。

DXT

一般用于Window平台

PVRTC

一般只被用于苹果

ASTC

https://niepp.github.io/2021/12/18/Compute-ASTC.html
https://docs.unity3d.com/Manual/class-TextureImporterOverride.html

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

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

相关文章

ChatGPT下的Java代码审计

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

爬虫:scrapy基本使用:链家实例

scrapy基本使用 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。 安…

【原创】java+swing+mysql的KTV管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景: 随着社会的发展…

语义分割:YOLOv5的分割模型训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、环境搭建二、构建数据集三、修改配置文件①数据集文件配置②权重下载③模型文件配置④训练参数配置 四、模型训练和测试模型训练模型测试 总结 前言 提示:本文是YOLOv5的分割模型训练自己数据集的记录教程,在调试前需要本地已配置好CU…

测试资料1111

什么是软件 软件是控制计算机硬件工作的工具 软件产生过程 需求产生(客户、用户)、需求文档(需求文档)、设计效果图(UI设计师)、产品开发(研发人员)、产品测试(测试人…

multiple definition of `xxxx`问题解决(vscode开发stm32)

一、背景 开发时遇到如下问题: 在Tim.h文件夹中定义了一个结构体变量 TIM_HandleTypeDef htim2;//定时器实例变量 其余的文件在引用此变量时都加上了#include "Tim.h" 但编译时,终端报错: multiple definition of htim2 全局搜…

hs_err_pid.log分析

hs_err_pid.log 文件是 Java 虚拟机(JVM)在遇到致命错误(如崩溃或内部错误)时生成的错误日志文件。这个文件包含了关于崩溃的详细信息,可以帮助开发者或系统管理员诊断和解决问题。 hs_err_pid.log文件位置和命名 文…

maven导入依赖后依然爆红?

今天遇到了maven导入依赖后依然爆红的问题,检查了本地仓库发现依赖包已经全有了但是IDEA这边的XML文件里面依然大量爆红;并且我重新将之前的本地仓库相关的依赖包甚至其上级目录进行了删除后重新导入,但问题依然没有解决;因此我非…

【大模拟】逻辑回环类

区块链 AcWing 3285. 区块链 - AcWing 区块链涉及密码学、哈希算法、拜占庭问题、共识算法、故障模型、网络模型等诸多知识,也在金融等领域有广泛的应用。 本题中,我们需要实现一个简单的区块链系统。 在一个分布式网络中,有 nn 个节点通…

最新软件库系统源码/ 免服务器源码/带后台功能/使用链接上传或服务器存储

源码简介: 最新软件库系统源码,它是免服务器的,而且带后台,实现超级管理动态发布,会员系统卡密系统充值的后台功能。注册用户的软件投稿,可以使用链接上传,或者服务器存储。 它带有后台功能&a…

Springboot 整合 Swagger3(springdoc-openapi)

使用springdoc-openapi这个库来生成swagger的api文档 官方Github仓库: https://github.com/springdoc/springdoc-openapi 官网地址:https://springdoc.org 目录题 1. 引入依赖2. 拦截器设置3. 访问接口页面3.1 添加配置项,使得访问路径变短…

饮水机功能构建指导思想以及最小试验

饮水机功能构建指导思想以及最小试验 引言 我们饮水机, 其实就只有两个必须使用的功能, 一个是控制加热, 一个是控制放水, 我们现在就可以直接实现这两个功能. 我们使用stm32单片机, 直接控制两个io口的高低电平, 通过继电器, 就可以控制大电流设备的开关. 没错这就已经结束了…

时间序列预测 | CEEMDAN+CNN+Transformer多变量时间序列预测(Python)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时间序列预测 | CEEMDANCNNTransformer多变量时间序列预测(Python) 时间序列预测 创新点 多尺度特征提取:CEEMDAN将复杂的时间序列分解成多个IMFs,使得CNN和Transforme…

【TVM 教程】在 Adreno™ 上部署预训练模型

本文是一个逐步教程,演示如何在 Adreno 上(不同精度)部署预训练的 PyTorch ResNet-18 模型。 首先,我们需要安装 PyTorch 与 TorchVision,因为我们将使用它作为我们的模型库。 可以通过 pip 快速安装: p…

【Linux】Linux环境基础开发工具使用之Linux编译器-gcc/g++使用

目录 一、编译过程二、gcc/g如何完成三、error: for loop initial declarations are only allowed in C99 mode 的解决方法四、预处理五、编译六、汇编七、链接八、数据库8.1 动态库8.2 静态库8.3 动/静态链接的优缺点 结尾 一、编译过程 预处理(头文件的展开、宏替…

计算机网络12——IM聊天系统——项目分析和架构搭建

1、IM——聊天系统主要功能 (1)注册 根据:昵称,手机号,密码 (2)登录 根据:手机号,密码 (3)添加好友 根据:昵称 (4&…

【IR】Counterfactual Explainer on Graphs

图神经网络的反事实解释:最新文章略读 Survey [ 5 ] ^{[5]} [5]CFAD [ 1 ] ^{[1]} [1]CAF [ 3 ] ^{[3]} [3]GCFExplainer [ 2 ] ^{[2]} [2]CFE [ 4 ] ^{[4]} [4]RCExplainer [ 6 ] ^{[6]} [6]CF-GNNExplainer [ 7 ] ^{[7]} [7]Ref Survey [ 5 ] ^{[5]} [5] NeurIP…

Ubuntu24.04使用SRS 搭建 RTMP流媒体服务器

一、简介 SRS(Simple Realtime Server)是一个简单高效的实时视频服务器, 是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群。支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28…

基于html5的网上团购系统设计与实现

TOC springboot301基于html5的网上团购系统设计与实现 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代,也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端,也就是电脑互联网时…

编码在左,学习在右,你心中的天平如何倾斜?

目录 前言 程序员如何平衡日常编码工作与提升式学习? 养成高效编码习惯 掌握时间管理技巧 提升式学习的策略 广泛涉猎的优势与考虑因素 深入钻研的优势与考虑因素 职业发展与个人成长的和谐共生 结束语 前言 程序员如何平衡日常编码工作与提升式学习&#…