在目前所做的一个大世界项目的开发中,整体场景的制作会涉及到很多的方方面面,也会有很多问题产生,每个方面都需要理一个比较清晰易懂的标准出来,让整个项目组有关的人员能快速达成共识,也减少沟通的成本。

比如项目中发现对于贴图格式的设置和使用还是有些错误,故可能会逐步整理一些类似这样有关的说明给项目美术人员看看,顺便解答自己的一些疑惑,文中分为三个版本,分别是

太长不看版:直接看结果,那种贴图用哪个格式

美术版:除了结果,稍微介绍一下每种格式的细节

程序版:主要解答我自己以下几个疑问,如果你也有这些疑问,可以看看

  1. NormalMap 是如何选择使用 BC3 还是 BC5 压缩的?
  2. 普通 Texture 导入进来,引擎会不会自动判断是否有 alpha 通道,从而选择使用 BC1 还是 BC3?
  3. 当然第二个问题很容易看出来,引擎确实会,但它执行逻辑的地方在哪里?
  4. 引擎真正执行压缩的地方在哪里?使用的什么来执行压缩?

目录

太长不看版

美术版

BaseColor(Default DXT1/DXT5 BC1/BC3)

NormalMap

Masks(MSRA:roughness,specular,metal,ao )

Alpha/GrayScale

HDR (RGB, no sRGB) / HDR Compressed (RGB, BC6H, DX11)

BC7 (DX11, optional A)

Ohthers

合理 使用TextureGroup

程序版


太长不看版

BaseColor等就一般使用BC1或者BC3(有 alpha 用 BC3,没有就用 BC1),一般勾选 sRGB,如果错误导入进来 alpha,可以勾选 Compress without alpha,在引擎里面禁用掉

NormalMap使用BC5,也就是选项里的 normal map选项,取消勾选 sRGB

MSRA 使用 Masks模式,并且取消勾选 sRGB

HDR环境贴图使用BC6,推荐使用 HDR Comressed,也就是使用 BC6 压缩,如果选择 HDR ,它的 format 是 floatRGBA 一个通道 32bit,非常大

单通道的贴图 可以使用 Alpha 或者 GrayScale,GrayScale 相当于不压缩,使用 G8 的format,也就是 一个 Pixel 是 8 bit,4*4 16个pixel 占 128bits,Alpha 使用BC4 压缩 4*4 16个pixel 占 64bits,小一半,所以 GrayScale 适合不是本身不是很大的贴图,否则比较大,还是使用 alpha 选项,BC4压缩一下

LUT 就不需要自己选了,选一下引擎的  LoopUpTable 的  texture group,它会自动帮你设置好,默认引擎的配置是不压缩的

美术版

BaseColor(Default DXT1/DXT5 BC1/BC3)

如果导入的 BaseColor 贴图带了 alpha,但其实不需要,可以勾选 Compress Without Alpha,避免把alpha 压进来

DXT1/BC1: 有8:1 的压缩比,24bit*16 变成 64 bit(6:1),(32bits*16 / 64 = 8,所以8:1)

NormalMap

normal map BC5,并且没有 sRGB,根据系统配置可以强制选择 BC3压缩

具体逻辑在 Texture.cpp FName GetDefaultTextureFormatName()

FString UseDXT5NormalMapsString;if (EngineSettings.GetString(TEXT("SystemSettings"), TEXT("Compat.UseDXT5NormalMaps"), UseDXT5NormalMapsString))
{bUseDXT5NormalMap = FCString::ToBool(*UseDXT5NormalMapsString);
}
...else if (FormatSettings.CompressionSettings == TC_Normalmap){TextureFormatName = bUseDXT5NormalMap ? NameDXT5n : NameBC5;}...

如果导入不小心带了 alpha,也可以勾选 without alpha 去掉

Masks(MSRA:roughness,specular,metal,ao )

另外那张 roughness,specular,metal,ao 等等的贴图 MSRA,这类不是用来存储 color或者 vector,而是独立的4种信息(相当于4种 grey scale),都可以归类为 Mask,使用Mask,no sRGB,实际使用的是 DXT5,也就是 BC3的压缩,每个 4*4 的块压缩为 128 bits,所以基本能看到比选择 default BC1 的 texture size大一倍,注意 128 bits 里面 64bits 用于 rgb color,64 bits用于 alpha,所以这四个里面选择也是把 比较重要的那个放在 alpha channel里面

Alpha/GrayScale

同样 Masks 模式,这张 heightMap

自动检查到没有 alpha,所以使用了 DXT1

但能看到这种模式下由于压缩带来的 锯齿 很严重,所以换用别的压缩模式 grayScale,R8的format,适合本身就是 8 bits 灰度,由于 R8是直接没压缩的,所以适合 texture 不止单通道,本身也不是很大的那种,否则还是用压缩,BC4吧

这里注意原本是 RGBA 8 的 贴图,进来强行只使用 单通道,选择 alpha 或者 gray scale 是不可以的,原来不是单通道,切换到 Alpha 或者 GrayScale 会变成 BGRA8.

HDR (RGB, no sRGB) / HDR Compressed (RGB, BC6H, DX11)

HDR环境贴图使用BC6,如果选择 HDR ,它的 format 是 floatRGBA 一个通道 32bit,非常大,推荐使用 HDR Comressed,也就是使用 BC6 压缩

BC7 (DX11, optional A)

特别重要的使用 BC7,4:1 压缩比,相比 BC1,两倍占用,alpha 也可以有

Ohthers

其他的类型的 用法都包含在名字里了

Displacement Map (8 / 16bit):G8 ,单通道的 置换贴图

Vector Displacement Map (RGB8):BGRA8,支持四个通道的置换贴图

User Interface 2D (RGBA):BGRA8,UI 上的贴图都选这个,注意复用,不要太大

Distance Field Font (R8):用于 sdf font 的 贴图,只用存单通道距离就行,所以 G8 就够

合理 使用TextureGroup

配置好 group,可以减少美术出错几率,只要一开始配置好 config,后面所有贴图资源的 format 都可以统一管理

程序版

在 Texture 修改属性之后,一般会调用到 Texture 的 UpdateResource();

里面会调用

CachePlatformData(); 重新生成 DDC(生成压缩纹理),

ClearAllCachedCookedPlatformData(); 清理cook data

而 压缩的逻辑就在 CachePlatformData()

GetBuildSettingsForRunningPlatform() 获取各种配置和 压缩format,出来判断ddc 的key是否已经有了,如果没有,就重新cache 生成

里面会调用

  • GetTextureBuildSettings,获取 texture 的各种配置,就是 那个窗口的配的各种属性
  • CurrentPlatform->GetTextureFormats,各个平台选择各自需要的压缩格式
    • Android:FAndroidTargetPlatform::GetTextureFormats
    • Windows:GenericWindowsTargetPlatform.h,调用 default,

      • FName GetDefaultTextureFormatName,这里就是 官方解释 压缩格式的文档里写明的格式

FTexturePlatformData::Cache 如果DDC 里没有找到,开始 Cache

  • 先 找到 ITextureCompressorModule 纹理压缩的 module 作为 Compressor 压缩器,由 Compressor 生成 task,这里可以异步

  • Compressor 里面根据不同的 format,分给不同的 format 压缩器,比如 DXT 格式就是 FTextureFormatDXT
const ITextureFormat* TextureFormat = nullptr;
ITargetPlatformManagerModule* TPM = GetTargetPlatformManager();
if (TPM)
{TextureFormat = TPM->FindTextureFormat(BuildSettings.TextureFormatName);
}
  • 然后 DXT 的format 里再处理,比如上面如果是 AutoDXT 的 format,这里就是再根据是否有alpha 选择使用 DXT1 还是 DXT5

  • 然后同样这个方法,下面就执行 Compress,DXT 目前默认使用 NVTT,Nvidia 的一个纹理压缩器,压缩之后返回是否成功,如果成功,就缓存到到 DDC 里面

那大概这样。

Reference:

  1. https://www.youtube.com/watch?v=h95X255NhOo&ab_channel=BenCloward
  2. https://docs.unrealengine.com/en-US/RenderingAndGraphics/Textures/TextureCompressionSettings/index.html

UE4场景流程规范-纹理压缩(美术版/程序版/太长不看版)相关推荐

  1. java压缩mp4大小_压缩的mp4视频播放时间太长(exoplayer)

    视频(mp4)从Android摄像头录制并发送到后端,这里我使用ffmpeg包装器压缩视频[44mb视频到5.76mb] . 压缩效果很好,但是当我在android(exo播放器)发送视频播放时,开始 ...

  2. VC下发布的Release版程序的异常捕捉

    VC下发布的Release版程序的异常捕捉寻找Release版程发生异常退出的地方比Debug版麻烦得多.发生异常的时候windows通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概 ...

  3. UE4 Material 101学习笔记——08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶

    UE4 Material 101学习笔记--08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶 Lec08 凹凸和视差贴图 Bump Offset and Parallax Occlusio ...

  4. 技术美术知识学习3600:纹理压缩

    学习教程来自:[技术美术百人计划]图形 3.6 纹理压缩--包体瘦身术 笔记总结 什么是纹理压缩 纹理压缩是为了解决内存.带宽问题,专门在计算机图形渲染系统中存储纹理而使用的图像压缩技术 为什么要纹理 ...

  5. UE4场景美术(地编、特效)人员招聘

    UE4场景美术(地编.特效)人员招聘 岗位职责: 基于UE4,进行电子沙盘.大数据可视化产品的建筑室内外表现.或城市场景相关工作: 配合产品经理或设计师,完成开发过程中的美术场景的设定. 与2D.3D ...

  6. 倾斜摄影超大场景的三维模型的顶层合并的纹理压缩与抽稀处理技术分析

    倾斜摄影超大场景的三维模型的顶层合并的纹理压缩与抽稀处理技术分析 倾斜摄影超大场景的三维模型的顶层合并需要对纹理进行压缩和抽稀处理,以减小数据量和提高数据的传输和展示性能.以下是一种常用的纹理压缩和抽 ...

  7. 显存优化:纹理压缩功能介绍与使用说明

    由于近期在开发者群里发现一些开发者对纹理压缩不太理解,遇到一些使用上的问题,所以本次文章中对纹理压缩进行详细的说明和使用上的介绍,希望能对有需求的开发者带来帮助. 本篇文章已经先更新到官网的文档中,也 ...

  8. unity 纹理压缩格式‘_纹理优化:让你的纹理也“瘦”下来

    在上一期<纹理优化:不仅仅是一张图片那么简单>中,我们针对纹理相关的优化,挑选了部分知识点分析.无论是大家在开发时的疏忽,还是对相关知识点的理解不足,这些问题的积累最终都会反映到项目的性能 ...

  9. 【Unity3D】图片纹理压缩方式,干货走起!

    Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设 ...

  10. 模型常见问题及规范--模型制作PBR流程规范规范

    链接: 美术 2.5 模型常见问题及规范笔记. 链接: 美术 2.7 Metallic与Speculer流程. 模型制作规范 模型制作流程 模型制作规范 示例 图例 软件初始设置 统一单位 所有制作软 ...

最新文章

  1. 【FBI WARNING】一些Noip的黑科技 持续整理!
  2. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...
  3. Vue.js入学教程
  4. 读JavaScript权威指南(第六版)笔记(第二章)
  5. GoogleEarth崩了!!除了重装还可以这样解决......
  6. 深度学习-文档检测方案整理
  7. php excel复选框,excel如何实现下拉框复选
  8. Unity图片格式转换
  9. DSF view Model
  10. var,let,cont声明变量的区别
  11. D1net阅闻:Facebook上线求职功能,以挑战LinedIn
  12. 【华为OD机试真题 JAVA】九宫格按键输入
  13. 书本ISBN号码校验
  14. NDK at ...Android\Sdk\ndk\21.1.6528147 did not have a source.properties file
  15. php将图片存储到mysql bolb类型
  16. Verilog实现序列信号发生器
  17. Python菜鸟学习之基础篇(持续学习中)
  18. 苹果电脑怎么删除旧账户_如何找到您不记得的旧在线帐户
  19. python绘制五彩泡泡_《五彩的泡泡》教案设计
  20. 达梦数据守护(主备)

热门文章

  1. 〈四〉ElasticSearch的认识:基础原理的补充
  2. mediasoup推拉流分析
  3. Vue拦截器报错Uncaught (in promise) TypeError Cannot read properties of undefined (reading ‘code‘)
  4. linux:服务开机自启
  5. 服务雪崩、服务熔断、服务降级
  6. rrpp协议如何修改_RRPP 演示实例
  7. MATLAB制作PPT(一):插入图片
  8. speedoffice(PPT)怎么添加图片
  9. 不开心就玩消消乐~~~正则表达式(1)
  10. lvm扩容lv扩容操作记录