人气 475

[翻译文档] mipmap的优点具体是什么? [复制链接]

Dopsscala 2017-12-5 21:02:09

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我知道的是加了mipmap那么shader工作使用的纹理就是那张小图,可以大大减少带宽。
不确定的是,假如一个小区域用大贴图且没有mipmap,纹理采样的性能损失具体有多少?比如一个屏幕像素点的位置下有16个纹理里的像素,它是把他们全部采样还是选了它们最靠近中间的那个?
另外mipmap是否会根据需要只上传小图进入显存?

Mipmap需要的情况下绝对不能关我知道,但我想明确其理由。毕竟现在太多只在乎那30%额外体积的人了。

顺便问个事,纹理采样都是在单独的单元内进行的,是否意味着只要没达到瓶颈,便可以无代价地使用消耗更大的各项异性过滤?
回复

使用道具 举报

eqwov 2017-12-5 20:53:03

  • 不用mipmap的话,性能损失主要在于texture cache会很难命中,因为相邻pixel采样的texel都是空间不连续的。SSAO算法也会遇到这个问题。因为SSAO一般会使用噪声来降低单个像素的采样次数,所以相邻pixel采样的texel会距离很远,对cache非常不友好。而nvidia的HBAO+就使用了Interleaved Rendering来解决这个问题。具体优化方法就不详述了,现在HBAO+是开源的,有兴趣的话可以去Github看下源码。
  • 不管一个pixel覆盖多少个texel,point采样1个,bi-linear采样4个,tri-linear采样8个,anisotropic则可能会采样更多。mipmap就是为了解决1个像素覆盖很多个texel的情况,相当于离线计算好1个pixel覆盖多个texel的结果,存在mipmap中。mipmap1是1个覆盖4个,mipmap2是1个覆盖16个······
  • 我平时接触的是dx11。据我所知,只有当显存不够了,才会将部分texture移出去,不然就始终是在显存的。
  • mipmap可以说是必须的,不然的话远景频率太高,画面会闪烁个不停。就算只是用一个负的lodbias,画面都会很闪,更别说完全不用mipmap了。
  • sampler unit和shader unit是完全并行的,sampler返回结果之前,shader unit不会等待,而是去处理其他数据,所以理论上是正确的。


推荐一篇很不错的文章(),你可以从中了解很多底层相关的东西。
回复 支持 反对

使用道具 举报

9uhk 2017-12-5 21:07:59
第一句说法是错误的
不叫使用那个小图
也不会减少需要访问纹素的次数(需要访问的纹素的次数只和最终图元光栅化后的像素数量和纹理的采样方式有关)
mipmap只是会增加缓存命中率
因为采样一次 实际上是把纹理这个采样位置周围的纹素数据都加载到缓存
如果没有mipmap 纹理很大 采样频率却很小的情况下
相邻的两个屏幕像素采样的纹素差的很远
此时会大大降低缓存命中率
不过mipmap主要的作用也不是为了提高性能
主要目的还是为了提高质量
因为数据频率远高于采样频率 会导致严重的失真


每次采样需要访问多少次纹素
是根据采样方式决定的
和纹理是否是mipmap的无关
一般实现上来说
临近采样就只是访问最近的一个纹素
线性就是访问周围4个
三次就是访问8个
mipmap采样 根据是否mipmap间是NEAREST或者LINEAR在1个或者2个mipmap层级间采样 根据上面所说的采样方式进行采样 访问纹素次数是一样的或者是2倍
各项异性需要在纹理坐标变化速度快的方向进行多次采样 最终把多次采样结果进行混合的
根据各向异性采样次数 需要访问的纹素次数也是n倍


你恐怕还对带宽有误解
带宽指的不是数据从系统内存传输到显存需要的传输量
显存足够的情况下 纹理数据是一直存在于显存的
带宽指的是渲染时数据在显存(实际上也不一定是显存 现在GPU基本都支持DMA)和处理单元之间传输所需要的传输量


用不用mipmap和用不用各向异性采样
是要看情况的
如果纹理大小和实际上最终图元在屏幕上的大小始终差不多的情况下
就不需要mipmap
如果最终光栅化图元像素的采样坐标的ddx ddy几乎是一样的
就不需要各向异性
比如2D Sprite 就不需要各向异性
如果Sprite在屏幕上的最终大小几乎始终和纹理差不多大
就不需要mipmap
回复 支持 反对

使用道具 举报

ylifk 2017-12-5 21:23:10
Mipmap的实质,是预先计算了一系列低通滤波的贴图,以防止屏幕空间的低频采样造成贴图空间的高频卷回。
回复 支持 反对

使用道具 举报

Cruzhymn 2017-12-5 21:38:29
mipmap注意是要预先算好图片缩小后的图片,当显示得Mesh因为种种原因被缩小(transform变化,相机变化)如果直接使用原图就会过度采样从而出现颜色信息会丢失,出现走样的现象。而且如果开启了抗锯齿功能,就要耗费时间去反走样。

        而mipmap的消耗也很明显,图片不管是硬盘占用内存占用还是显存都会提升相应的倍数,可以说这是一种用空间换时间的方式。(我用工具抓过显卡里面的图片,不是小图是大图,当然送到cache的是小图是可以防止cache Miss的)


        不过类似使用正交相机,并且不会对一种原图进行过度缩放可以考虑关闭mipmap……一种情况要注意:自适应UI的时候,如果屏幕分辨率很小而制作规格很大就要作死了,所以一般UI还是选择在低分辨率下制作,为了显示更加清晰而选择在1080P下作死,最好开启mipmap
透视相机没的说,必须开启mipmap……
回复 支持 反对

使用道具 举报

liujiajia796 2017-12-5 21:52:43
近了给你看大图,远了给你看小图。你生活中不也是这样嘛。那如果是正交ui就不用mip。生活中也是这样嘛。
有个好玩儿的地方就是给texture的mip每一级传入不同的图纸,做出来的效果会很有意思。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-27 08:25 , Processed in 0.130469 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.