一篇文章讲明白Mipmap与纹理过滤

简介: 一篇文章讲明白Mipmap与纹理过滤

为了加快渲染速度和减少纹理锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为Mipmap。

使用DirectX Texture Tool(DX自带工具)预生成Mipmap Chain

Original Mip1 Mip2 Mip3 Mip4 Mip5 Mip6 Mip7 Mip8

256x256 128x128 64x64 32x32 16x16 8x8 4x4 2x2 1x1

(1)Mipmap宽高值不一定要相等,但需要为2的n次幂,最低精度为1x1

(2)从原始高精度的Mipmap宽高减半,逐级生成低精度的Mipmap层级;所有低精度层级加起来,会增加1/3存储空间的占用

① Mipmap贴图文件占用更多硬盘空间 -- 解决方法:使 用dds进行压缩存储

② Mipmap纹理占用更多内存、显存空间

DDS文件

DDS(DirectDraw Surface):一种使用S3 Texture Compression (S3TC,sometimes also called DXTn or DXTC)算法来压缩存储Mipmap层级的数据格式,

DXTn(DXT1、DXT2、DXT3、DXT4及DXT5)算法可被GPU硬件解压缩,这也使得DDS文件被广泛用来存储纹理数据,其中DXT2与DXT4为过渡算法,用得不多。

当然,DDS也可存储不具有mipmap级别、及未压缩的像素格式的纹理贴图。

算法

说明

DXT1

压缩比为1:8(最高),只有1bit Alpha,Alpha通道信息几乎完全丧失。一般将不带Alpha通道的图片压缩成这种格式。

DXT2

压缩比为1:4 ,使用了4bit Alpha,可以有16个Alpha值,可很好地用于Alpha通道锐利、对比强烈的半透和镂空材质。

DXT3

压缩比为1:4 ,使用了线形插值的4bit Alpha,特别适合Alpha通道柔和的材质,如高光掩码材质。

DirectX Texture Tool工具也可以编辑DDS文件的DXT压缩方式;关于DXT的更多信息可参考:DXT 图片压缩

图像重采样插值算法简介

算法

说明

最近相邻插值

(Nearest Neighbour Interpolation)

优点是计算量很小,算法简单,运算速度较快。但它仅使用离待测采样点最近的像素的颜色值作为该采样点的颜色值,而没考虑其他相邻像素点的影响,

因而重新采样后颜色值有明显的不连续性,图像质量损失较大,会产生明显的马赛克和锯齿现象。

两次线性插值

(Bilinear Interpolation)

2x2 average

average four pixels

计算量稍大,基本克服了最近相邻插值算法颜色值不连续的特点,因为它考虑了待测采样点周围四个直接邻点对该采样点的相关性影响。

但是,此方法仅考虑待测样点周围四个直接邻点颜色值的影响, 而未考虑到各邻点间颜色值变化率的影响, 因此具有低通滤波器的性质,

从而导致缩放后图像的高频分量受到损失, 图像边缘在一定程度上变得较为模糊。

两次立方插值

(Bicubic Interpolation)

8x8 【with sharpening】

4x4 filter 【with sharpening】

计算量最大,算法也最为复杂的。在几何运算中,两次线性插值算法的平滑作用可能会使图像的细节产生退化,在进行放大处理时,这种影响更为明显。

在其他应用中,两次线性插值算法的斜率不连续性会产生不希望的结果。两次立方插值算法不仅考虑到周围四个直接相邻像素点颜色值的影响,还考虑到它们颜色值变化率的影响。

因此克服了前两种方法的不足之处,能够产生比两次线性插值更为平滑的边缘,计算精度很高,处理后的图像像质损失最少,效果是最佳的。

Adobe PhotoShop CS6在图像缩放时,提供了以上三种算法供用户选择:

D3D9中使用Mipmap

① 载入Mipmap贴图文件到内存

void MipData【MAX_TEXTURE_MIP_COUNT】;

LoadMipmapFile(“Maya_Basho_A_Leaf_sm_D.dds”, MipData);

② 创建Mipmap纹理,并绑定数据

IDirect3DTexture9 pMipMap;

// 第3个参数 5 表示从256向下生成5个Mipmap层级(含256);该参数为0表示使用D3D来生成所有层级的Mipmap

m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED, pMipMap);

for( INT MipIndex=0; MipIndex[span class="hljs-number">5; MipIndex++ )

{

D3DLOCKED_RECT LockedRect;

pMipMap->LockRect( MipIndex, LockedRect, NULL, D3DLOCK_NOSYSLOCK );

GetTexDataFromMipData( MipData, MipIndex, LockedRect.pBits, LockedRect.Pitch );

pTexture->UnlockRect( MipIndex );

}

③ 设置Mipmap纹理采样器参数

m_pD3DDevice->SetTexture(SamplerIdx, pMipMap);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_ADDRESSW, //代码效果参考:http://www.zidongmutanji.com/zsjx/434459.html

D3DTADDRESS_WRAP);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MIPFILTER, D3DTEXF_POINT);

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MIPMAPLODBIAS, 1);// Mipmap层级向高精度偏移1个层级

Direct3DDevice->SetSamplerState(SamplerIdx,D3DSAMP_MAXANISOTROPY, 4);// 最大异性采样阈值设置为4

纹理地址模式

纹理坐标uv的范围为:【0, 1】 x 【0, 1】 。若顶点u和v大于1或小于0时,则需要用相应的纹理地址模式来寻址,以确定该顶点所应采用的纹理像素颜色值。

常用纹理地址模式有:包裹模式(Wrap) 镜像模式(Mirror) 夹子模式(Clamp)。

纹理映射

定义:使用uv坐标将纹理像素(texel)映射到屏幕像素(pixel)的过程。

纹理过滤

由于相机不一定正对着物体,以及透视投影为非正交投影,纹理并不会1:1的投影到物体表面并最终呈现到实际的屏幕像素上。

当最后呈现到屏幕中的尺寸比纹理实际尺寸大的时候,此时需要对纹理进行放大(Texture Magnification),反之需要缩小(TextureMinification)。

纹理放大采样的时候如果不经处理,则会出现马赛克等方块等情况,如果纹理缩小采样的时候不经处理,那么就会产生纹理锯齿。因此,纹理过滤就变得非常必要。

从上图像素点被缩放的程度上看//代码效果参考:http://www.zidongmutanji.com/zsjx/183041.html

,当屏幕像素(pixel):纹理像素(texel)为n:1时,则进行纹理放大;为1:n时,则进行纹理缩小。 注:n>1

纹理过滤算法

各向同性:屏幕像素(pixel)在u、v方向上使用相同精度纹理像素(texel)

各向异性:屏幕像素(pixel)在u、v方向上使用不同精度纹理像素(texel)

MIPFILTER说明

① 为D3DTEXF_NONE,表示不使用MipMap

② 为D3DTEXF_POINT,在一层Mipmap进行纹理采样

③ 为D3DTEXT_LINEAR,在两层Mipmap进行纹理采样,然后在两层之间做线性融合,因此在不同层级的Mipmap之间有更好地过度

Mipmap层级选择 -- 各向同性

① 计算得到映射比【屏幕像素(pixel):纹理像素(texel)】最小P(min)的屏幕像素点A

② 计算像素点A的uv在屏幕空间的对应方向,并沿着该方向得到屏幕像素区域的最小外接平行四边形MNOP

③ 计算n=Min{m=xP(min)(u), n=yP(min)(v)} 注:x、y为平行四边形MNOP的u、v对应方向上的边长;m、n为u、v方向的纹理像素值

④ 通过n<=h Min{h1, h2, ...}条件,得到MIPFILTER=D3DTEXF_POINT的Mipmap层级L(上图中为: 64)

⑤ 若MIPFILTER=D3DTEXF_LINEAR,除了选择层级L外,还要选择L低一级的Mipmap层级(上图中为: 32)

Mipmap层级选择 -- 各向异性

① 计算得到映射比【屏幕像素(pixel):纹理像素(texel)】最大P(max)的屏幕像素点A

② 计算像素点A的uv在屏幕空间的对应方向,并沿着该方向得到屏幕像素区域的最小外接平行四边形MNOP

③ 计算m=Max{m=xP(max)(u), n=yP(max)(v)} 注:x、y为平行四边形MNOP的u、v对应//代码效果参考:http://www.zidongmutanji.com/zsjx/58239.html

方向上的边长;m、n为u、v方向的纹理像素值

④ 通过m<=w Min{w1, w2, ...}条件,得到MIPFILTER=D3DTEXF_POINT的Mipmap层级L(上图中为: 256)

⑤ 若MIPFILTER=D3DTEXF_LINEAR,除了选择层级L外,还要选择L低一级的Mipmap层级(上图中为: 128)

各向异性纹理采样(以MIPFILTER=D3DTEXF_POINT为例)

① 根据上面“Mipmap层级选择 -- 各向异性”的规则,得到Mipmap层级L: 256

② 计算任意像素点K的uv在屏幕空间的对应方向,并沿着该方向得到屏幕像素区域的最小外接平行四边形MNOP

③ 分别计算uv方向的纹理像素值 m=xP(k)(u), n=yP(k)(v) 注:x、y为平行四边形MNOP的u、v对应方向上的边长

④ 分别计算S(u)=Min{MaxAnisotropy, L/m},S(v)=Min{MaxAnisotropy, L/n}

⑤ 对S(u),S(v)进行四舍五入取整 (上图中为: S(u)=2 S(v)=4)

⑥ 屏幕像素K对应纹理像素点所在的2x4的区域内采样,并线性插值计算屏幕像素K的颜色值

最大MaxAnisotropy阈值

(1) 使用DirectX Caps Viewer查看显卡的MaxAnisotropy阈值

(2) 另外要注意控制面板中的显卡全局设置(① 是否由3D应用程序决定 ②若由显卡决定,看看MaxAnisotropy设置大小)

不同MaxAnisotropy效果对比

MaxAnisotropy设置得越大,远处的画面细节保留得越多(上图中离视点越远的地方,各向异性程度越高)

常用的纹理过滤参数组合

过滤方式

MinFilter

MagFilter

MipFilter

采样数

Point(最近点采样)

D3DTEXF_POINT

D3DTEXF_POINT

D3DTEXF_POINT

1

Bilinear(双线性插值)

D3DTEXF_LINEAR

D3DTEXF_LINEAR

D3DTEXF_POINT

4

Trilinear(三线性插值)

D3DTEXF_LINEAR

D3DTEXF_LINEAR

D3DTEXF_LINEAR

8

AnisotropicPoint(各向异性)

D3DTEXF_ANISOTROPIC

D3DTEXF_LINEAR

D3DTEXF_POINT

4 x n

AnisotropicLinear(各向异性)

D3DTEXF_ANISOTROPIC

D3DTEXF_LINEAR

D3DTEXF_LINEAR

8 x n

① 采样数可以反映出算法的复杂度:采样数越大,耗费的计算越多

① Point、Bilinear、Trilinear画面效果基本差不多;细看的话,Trilinear > Bilinear > Point,Trilinear在Mipmap层级间过渡更自然平滑些

② AnisotropicLinear效果最好,在Mipmap层级间过渡方面要好于AnisotropicPoint,不过基本上看不出来AnisotropicPoint与AnisotropicLinear的差别了

参考

相关文章
|
9月前
|
人工智能 运维 Devops
基于云效落地平台工程企业级最佳实践
本文介绍了平台工程作为DevOps演进的必然方向,探讨了其建设过程中面临的挑战及解决方案。文中首先分析了平台工程与DevOps的关系,强调了其在提升价值交付和降低团队心智负担方面的作用。接着,通过云效作为基础设施,详细阐述了其如何帮助企业构建高效的研发平台,并分享了两个实际案例:一个是200人规模的互联网企业,另一个是2000人规模的金融行业企业。最后,展望了平台工程的未来发展方向,包括组件化开发、AI技术的应用以及智能化场景的融入。碧桂园生活服务集团也分享了其在平台工程领域的实践经验和未来思考,强调了标准化、自动化、可靠性和智能化四大原则的重要性。
233 10
ctfmon.exe频繁出错的一个解决办法
ctfmon.exe频繁出错的一个解决办法
ctfmon.exe频繁出错的一个解决办法
|
Unix Linux iOS开发
Vulkan开发实战详解
Vulkan开发实战详解
330 4
|
8月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
342 0
|
Linux
CentOS 7 安装Boost 1.67及boost_python
CentOS 7 安装Boost 1.67及boost_python
1597 0
|
11月前
|
机器学习/深度学习 编解码 算法
了解与对比主流背景去除工具
本文对比了几款主流的背景去除工具,包括Remove.bg、Removal.ai、RMBG 2.0、Imagga和Wondershare Pixcut,重点介绍了RMBG 2.0这款开源工具的性能、优势及挑战,适用于不同需求的用户选择。
|
机器学习/深度学习
多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比
多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比
|
存储 搜索推荐 大数据
大数据在医疗领域的应用
大数据在医疗领域有广泛应用,包括电子病历的数字化管理和共享,提升医疗服务效率与协同性;通过数据分析支持医疗决策,制定个性化治疗方案;预测疾病风险并提供预防措施;在精准医疗中深度分析患者基因组信息,实现高效治疗;在药物研发中,加速疗效和副作用发现,提高临床试验效率。此外,在金融领域,大数据的“4V”特性助力业务决策前瞻性,被广泛应用于银行、证券和保险的风险评估、市场分析及个性化服务中,提升运营效率和客户满意度。
1320 6
|
SQL 关系型数据库 网络安全
【一文搞懂PGSQL】2.基础管理
本文档介绍了 PostgreSQL 的基础管理操作,包括登录方式、基本 SQL 命令、防火墙配置 (`pg_hba.conf`)、用户管理(创建、修改、删除用户)及权限管理(数据库、模式、对象权限)。提供了创建数据库、表及用户的具体示例,并展示了如何通过角色组管理用户权限。最后通过一个业务案例演示了如何为开发部门的新业务创建数据库、schema 和用户,并授予相应的操作权限。
|
监控 Oracle 关系型数据库
PolarDB 在多云环境下的部署与管理
【8月更文第27天】随着云计算的普及和发展,越来越多的企业开始采用多云策略来分散风险、优化成本并提高业务灵活性。阿里云的 PolarDB 是一种兼容 MySQL、PostgreSQL 和 Oracle 的关系型数据库服务,它提供了高性能、高可用性和自动化的管理功能。本文将探讨如何在多云环境下部署和管理 PolarDB 实例,并提供一些实用的代码示例。
305 0