»
首页
|
手机数码
|
汽车资讯
|
游戏硬件
|
评测专题
|
手机壁纸
|
海淘值得买
|
度假
|
求职招聘
|
广告联系
» 您尚未登录:请
登录
|
注册
|
标签
|
帮助
|
小黑屋
|
TGFC Lifestyle
»
游戏业界综合讨论区
» 问个科学性问题,关于游戏多边形画面过滤的
发新话题
发布投票
发布商品
发布悬赏
发布活动
发布辩论
发布视频
公司招聘信息
打印
[其他]
问个科学性问题,关于游戏多边形画面过滤的
hourousha
魔王撒旦
帖子
5249
精华
0
积分
27921
激骚
435 度
爱车
主机
相机
手机
注册时间
2004-1-7
发短消息
加为好友
当前离线
1
#
大
中
小
发表于 2012-2-20 10:53
显示全部帖子
过滤主要分临近点,双线性,三线性,各向异性几种。
其中,后两种都是和MIP-MAP连用才能达到完整效果的技术。而前两种,既可以和MIP-MAP连用,也可以只在一个纹理平面上使用。而tri-linear其实就是在相邻两个mipmap平面上做bi-linear然后在之间再做linear。
mip-map chain是一系列尺寸成倍缩小的贴图链,作用主要是两个,一个是避免闪烁,另一个是提高性能。
闪烁的发生是因为bi-linear只能在2x2个图素(texel)之间做low-pass filter过滤,所以不适应缩小比率低过1/2的情况,在这种情况下,属于采样点不足所以出现运动中闪烁现象。
而提高性能主要是指降低texture cache miss的概率,因为如果纹理分辨率大大高于像素间UV密度,说明相邻像素需要采样的texel在内存里距离很远,因此可能每个像素的texture fetch都会导致一次cache flush和cache fetch。自然性能降低。
而mip-map的运作原理在于根据uv的dda信息(即相邻像素间uv差值),选择合适的mip-map层进行纹理取样,这样就不会出现上面提到的情况。
我们假设dda=2,代表相邻像素在最大纹理层上跨2个像素,因此此时应该选择比最大纹理层低一级的层做texture fetch,也就是mipmap层的选择是和log2(dda)相关的。
而tri-linear与anisotropic的最大差别在于mip-map的选择逻辑。因为uv一般都有两个方向——u方向和v方向,而这两个方向的dda值往往是不同的,对于tri-linear来说,它会选择ddu,ddv两个值中的较大值作mipmap层次选择,比如dda(u) = 1,dda(v) = 4,那么它会选择4,也就是长宽为1/4的层来做纹理读取,但显而易见,这样一来,u方向就会发生欠采样现象,也就是常说的模糊出现了。
而对于anisotropic来说,它的选择公式是形如max((max(log2(ddu),log2(ddv))-log2(anisotropic_level)),0)这样的,也就是上面那种情况,如果max anisotropic level>=4,它就会选择最大尺寸的纹理层来做纹理读取,同时,它会以8x2个texel来做filter,这样一来同时也就避免了采样不足的闪烁现象。
简单归纳一下,如果只用bi-linear,而贴图尺寸又明显大于像素间uv密度(除了由模型自身制作的因素外,更由输出分辨率,摄像机远近等要素决定)则一动就闪烁。
如果用tri-linear而且mipmap又是完整的,那么如果uv两个方向密度不同,就会在一个方向上发生模糊的现象,这是因为选择了相对另一个方向解析度过低的贴图原因,如果强行调整mipmap_lod_bias使之选择高分辨率纹理层,则又在uv中密度较低的方向上发生闪烁。
只有使用anisotropic filter,同时把anisotropic level定得比较高,才能同时解决闪烁和模糊的现象。
当然,如果原始贴图分辨率就不足,那就怎么折腾都没辙了,或者模型拉得过近,或分辨率过高,那么除了使用完全编程化的像素空间过程纹理外,没有其他办法。
[
本帖最后由 hourousha 于 2012-2-20 11:08 编辑
]
本帖最近评分记录
dragonzet
激骚
+3
精品文章
2012-2-20 17:17
UID
18955
帖子
5249
精华
0
积分
27921
交易积分
0
阅读权限
40
在线时间
27770 小时
注册时间
2004-1-7
最后登录
2024-9-22
查看详细资料
TOP
控制面板首页
密码修改
积分交易
积分记录
公众用户组
基本概况
版块排行
主题排行
发帖排行
积分排行
交易排行
在线时间
管理团队
管理统计