【URP】Unity[纹理压缩]算法多平台对比

news/2025/10/29 0:44:54/文章来源:https://www.cnblogs.com/SmalBox/p/19173008

【从UnityURP开始探索游戏渲染】专栏-直达

纹理压缩技术发展节点

  • 早期阶段 2000年代初
    • DXT/S3TC成为PC和主机平台主流,采用4×4像素块压缩,但移动端支持有限。
    • PVRTC(2008年)专为PowerVR GPU设计,要求纹理尺寸为2的幂次方且宽高相等,成为iOS早期标准。
  • 移动平台标准化 2012-2014年
    • ETC1(2012年)成为Android基础格式,但缺乏透明通道支持。
    • ETC2(OpenGL ES 3.0强制支持)扩展了RGBA和sRGB支持,2013年后中高端Android设备普及。
    • ASTC(2012年推出)由ARM开发,支持灵活分块(4x4至12x12)和NPOT纹理,2014年后A8/iPhone 6及以上设备支持。
  • 现代统一化趋势 2020年后
    • ASTC逐渐成为Android/iOS首选,压缩比和质量优于ETC2/PVRTC。
    • Unity Crunched压缩(如ETC2+二次压缩)用于进一步减少纹理体积。

ASTC(Adaptive Scalable Texture Compression)‌

实现原理

  • 分块压缩‌:将纹理划分为4×4至12×12像素的块(Block),每个块独立压缩为128位固定大小‌。
  • 颜色插值‌:每个块存储2个端点颜色(RGB或RGBA)和权重网格(Weight Grid),通过插值计算中间颜色值‌。
  • 动态分区‌:根据颜色分布自动选择最优分区方式(如4×4块可拆分为2×2子块),平衡压缩比与质量‌。

示例

  • ASTC 4×4 RGBA‌:
    • 原始数据:4×4=16像素×32位(RGBA)= 512位
    • 压缩后:128位(8:1压缩比)
    • 解码时,通过端点颜色和权重插值还原每个像素的RGBA值‌。

ETC2(Ericsson Texture Compression 2)‌

实现原理

  • 4×4块压缩‌:每个块分为两个2×4子块,子块间通过1位标记选择横/竖分割方式‌。
  • 颜色模式‌:
    • Individual模式‌:子块独立存储RGB444颜色(高对比度区域)‌。
    • Differential模式‌:子块存储RGB555基色+RGB333偏移量(低对比度区域)‌。
  • 透明通道‌:通过额外64位数据存储Alpha值(ETC2+Alpha)‌。

示例

  • ETC2 RGB‌:
    • 原始数据:4×4=16像素×24位(RGB)= 384位
    • 压缩后:64位(6:1压缩比)
    • 解码时,根据子块模式选择基色+偏移量计算最终颜色‌。

PVRTC(PowerVR Texture Compression)‌

实现原理

  • 双通道压缩‌:仅压缩RGB通道,Alpha通道单独处理(PVRTC2支持RGBA)‌。
  • 颜色索引‌:每个4×4块存储2个主色(RGB565)和64位颜色索引表,通过插值生成中间颜色‌。
  • 固定尺寸‌:仅支持2的幂次方纹理(如256×256)‌。

示例

  • PVRTC4‌:
    • 原始数据:4×4=16像素×24位(RGB)= 384位
    • 压缩后:64位(6:1压缩比)
    • 解码时,通过主色和索引表插值还原颜色,但透明通道需额外处理‌。

DXT(DirectX Texture Compression)‌

实现原理

  • DXT1‌:
    • 4×4块存储2个RGB565颜色和16位插值索引(无Alpha)‌。
  • DXT5‌:
    • 4×4块存储2个RGB565颜色+2个8位Alpha极值+16位Alpha插值索引‌。
  • 块状伪影‌:高对比度区域易出现色带(如渐变纹理)‌。

示例

  • DXT1 RGB‌:
    • 原始数据:4×4=16像素×24位(RGB)= 384位
    • 压缩后:64位(6:1压缩比)
    • 解码时,通过端点颜色和插值索引计算中间颜色‌。

压缩方式对比

格式 压缩比 透明支持 适用平台 典型问题
ASTC 4:1~12:1 iOS(A8+)/Android(ES3.1) 低端设备兼容性差‌
ETC2 6:1 是(需扩展) Android(ES3.0+) 高对比度区域色带明显‌
PVRTC 4:1~6:1 是(PVRTC2) iOS 强制2的幂次方尺寸‌
DXT 4:1~6:1 是(DXT5) PC/主机 移动端不支持‌

多平台压缩方案对比

格式 支持平台 压缩比 优势 劣势
ASTC iOS(A8+)、Android(ES3.1+) 4x4块=8bit/像素 高灵活性,支持NPOT和透明通道4 低端Android设备可能不兼容
ETC2 Android(ES3.0+) 8bit/像素 广泛兼容,支持透明通道2 压缩质量低于ASTC,块状伪影明显
PVRTC iOS(全系列) 4bit/像素 苹果硬件原生优化1 强制2的幂次方尺寸,透明通道效果差
DXT PC/主机 4-8bit/像素 DirectX高效解码2 移动端不支持,高细节纹理易失真

URP中各平台推荐方案与问题

iOS平台

  • 首选ASTC 4x4‌:平衡质量与性能,但需放弃iPhone 5s等旧设备。
  • 备选PVRTC4‌:兼容性最佳,但渐变和透明区域易出现色带。

Android平台

  • 高端设备ASTC‌:需检测OpenGL ES 3.1支持,否则回退ETC2。
  • ETC2通用方案‌:可通过分离Alpha通道(ETC1+Alpha图)优化透明纹理,增加复杂度。

特殊情况处理

  • 高保真需求‌:使用RGBA32无压缩,但内存占用激增(如1024x1024纹理达16MB)。
  • 渐变纹理‌:RGBA16结合Dithering抖动处理,减少色阶断裂。

性能优化建议

  • 平台检测‌:通过SystemInfo.SupportsTextureFormat动态选择压缩格式。
  • 分级压缩‌:根据纹理用途(UI/场景)采用不同压缩级别,UI优先ASTC/ETC2,背景可用PVRTC。
  • 冗余检查‌:避免AssetBundle重复打包纹理导致内存翻倍

【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

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

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

相关文章

AI元人文构想:三值纠缠模型

AI元人文构想:三值纠缠模型 作者:岐金兰 日期:2025年10月29日 引言: 观照个体欲望,尊重个体自感,于白箱化的价值博弈舞台,共同涌现集体客观——此三值纠缠模型,正是AI元人文构想跳动的心脏。 这精准道破,并庄…

EDK2环境搭建以及HelloWorld编译实现

本文简单介绍了Linux环境下搭建EDK2开发环境的关键步骤和命令。EDK2环境搭建以及HelloWorld编译实现 TianoCore的官方介绍 Welcome to TianoCore, the community supporting an open source implementation of the Uni…

谁生?谁死?从引用计数到可达性分析,洞悉GC的决策逻辑

谁生?谁死?从引用计数到可达性分析,洞悉GC的决策逻辑引用计数与可达性分析:谁死了,谁还活着? 垃圾回收,顾名思义,便是将已经分配出去的,但却不再使用的内存回收回来,以便能够再次分配。在Java虚拟机的语境下…

P1561 [USACO12JAN] Mountain Climbing S

Solution 简单看题容易得到一个错误的贪心: \[ans=max\{\Sigma_{k=1}^n + down_{min}, \Sigma_{k=1}^n +up_{min}\} \]然后你将可以把他 hack 掉,因为最初的方法认为第一个牛上山后,所有上下山是一起进行的,其实有…

六、阅读笔记六:保障软件可靠性的防线

《程序员修炼之道:从小工到专家》围绕软件测试与质量保障展开,系统阐述了如何通过科学的测试方法和质量管控策略,构建可靠的软件产品。在软件开发生命周期中,测试与质量保障是不可或缺的环节,它能够及时发现潜在问…

以此贴作别算法

以此贴作别算法def lcs(i, j):if i == m or j == n: return 0if s[i] == t[j]: return 1 + lcs(i+1, j+1)return max(lcs(i, j+1), lcs(i+1, j))def lcs2(i, j):if i >= m or j >= n: returni0 = i; j0 = jwhile…

五、阅读笔记五 应对复杂系统的挑战

《程序员修炼之道:从小工到专家》聚焦于并发编程与系统性能优化,为应对复杂系统的技术挑战提供了全面的解决方案。随着软件系统的规模不断扩大,用户量持续增长,并发处理能力和系统性能成为衡量软件质量的重要指标。…

P3988 [SHOI2013] 发牌

Solution 容易发现,答案就是维护当前序列的第 k 大值,而且只有删除,这个时候就可以使用权值线段树来维护。这颗树的每一个叶子表示一张牌,然后线段树记录改节点为根的子树的节点个数,接着进行查询即可,代码见下…

映射

通过ide伪造数据库 映射 Map 首先我们来了解一下什么是映射 先直到 key,value 它们往往是一对 一个键只能对应一个值,但一个值可以对应多个键 例如 苹果 -> 水果 菠萝 -> 水果 人名 -> 电话号码 学号 ->…

文件夹显示绿色成功图标方法

链接:https://blog.csdn.net/jiminkoo/article/details/131840356本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/19172967

【RabbitMQ】与ASP.NET Core集成

本章目标掌握在ASP.NET Core中配置和依赖注入RabbitMQ服务。学习使用IHostedService/BackgroundService实现常驻消费者服务。实现基于RabbitMQ的请求-响应模式。构建完整的微服务间异步通信解决方案。学习配置管理和健…

IMO2025 Problem 1

考虑 \(n = 3\) 时的下三角,显然有三个容易构造的解,\(k = \{0, \, 1, \, 3\}\),构造如下:那么 \(n > 3\) 呢?由于下三角的点数恰好为 \(1 + 2 + \cdots + n\) 个点,对于第一条直线,有且仅有 \(3\) 中方式覆…

Day6综合案例2-注册信息

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

2014吉林省赛题解 | CCUT应用OJ——Sign in

题目简介题源:1035-Sign in | CCUT OJ,2014 吉林省赛 C 题 题意:给定长为 \(n\) 的序列 \(A\) 与长为 \(n-1\) 的序列 \(B\),其中 \(B\subset A\),求 \(A-B\)。即:\(B\) 中恰好只有一个元素在 \(A\) 中没出现,求…

访答知识库-可以本地使用的知识库

访答知识库-可以本地使用的知识库访答知识库,一键安装,0代码使用。 支持图片、视频、语音搜索与问答 支持多模态问答

代码大全2 第三四章

读《代码大全 2》第三、四章,感觉像听老程序员唠实用嗑,没半点虚头巴脑的理论。第三章讲代码可读性,真是说到心坎里了。以前总觉得代码能跑就行,变量随便叫个 a、b、c,注释能省就省。结果过半个月回头看,自己写的…

https代理服务器(六)再次java动态签发【成功】

https代理服务器(六)再次java动态签发【成功】1X500Name canamem = new X500Name(caCertificate.getSubjectX500Principal().getName());改为X500Name issuerName = new JcaX509CertificateHolder(caCertificate).ge…

[AGC032D] Rotation Sort 题解

QwQ[AGC032D] Rotation Sort 题解 把循环移位看作是将某个数向左或右插入到任意位置,显然一个数最多被移动一次。 那么该序列中一共有三种数:向左移动 向右移动 不动假设已知每个数属于哪一种,考虑如何判定该方案是…

[AGC024E] Sequence Growing Hard 题解

QwQ[AGC024E] Sequence Growing Hard 题解 首先手玩一下样例,考虑在哪些位置插入是合法,假设在 \(pos\) 位置前插入 \(x\),则如果 \(x > a_{pos}\),则显然字典序会变大,否则如果 \(a_{pos} = x\) 需要找到 \(p…