纹理分辨率太大怎么处理

  本专栏内容整理了GAMES101计算机图形学课程的主要内容,作为我学习计算机图形学的一份复习备份或叫做笔记。内容中如有错误,或有其他建议,欢迎大家指出。

附上GAMES101计算机图形学课程:GAMES101: 现代计算机图形学入门正在上传…重新上传取消https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html正在上传…重新上传取消https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html​编辑https://sites.cs.ucsb.edu/~lingqi/teaching/games101.htmlicon-default.png?t=N7T8https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibiliGAMES101-现代计算机图形学入门-闫令琪共计23条视频,包括:Lecture 01 Overview of Computer Graphics、Lecture 02 Review of Linear Algebra、Lecture 03 Transformation等,UP主更多精彩视频,请关注UP账号。正在上传…重新上传取消https://www.bilibili.com/video/BV1X7411F744正在上传…重新上传取消https://www.bilibili.com/video/BV1X7411F744​编辑https://www.bilibili.com/video/BV1X7411F744icon-default.png?t=N7T8https://www.bilibili.com/video/BV1X7411F744

纹理分辨率太大

前面介绍了纹理太小,图像容易出现锯齿。那么当纹理像素过大,会出现什么情况呢。

在上面的图中左边是一幅正常渲染应该得到的场景图。而右边的图片在中间部分出现了锯齿,远处的部分出现了摩尔纹的情况。这就是纹理的分辨率太大。在远处的地方,在较小的像素范围内。需要渲染较大的纹理图片。此时,屏幕上的一个像素,就覆盖了纹理贴图上面很大的一块区域。甚至一个像素要渲染一整个贴图的颜色。如果我们继续按照前面介绍的方法四舍五入,或者插值就会出现右图的情况。

 图中背景是纹理贴图。前面的蓝色覆盖区域是屏幕的像素,蓝色是屏幕像素中心点,这里用屏幕像素中心点所在的位置去采样。

我们会发现右图的摩尔纹,锯齿跟我们之前介绍过的走样一样。这里同样是采样点屏幕像素,过少过于离散导致的走样。所以我们也可以考虑使用反走样方法。

使用MSAA超采样,每个屏幕像素使用512个采样点可以得到下面右边的图像。

 结果还不错,但是一个像素512个采样点才能得到这么一个效果,性能代价有些太大了。

采样会引起走样,那如果我们不采样呢?

对于纹理映射的采样。我们是预先知道要采样的源信号(纹理贴图)是什么样的,如果我们预先对纹理贴图进行分辨率降低(Mipmap)。在屏幕映射的时候我们立刻选择适合的分辨率贴图(范围查询)。这不就能降低性能的消耗了吗?多加几张低分辨率的纹理贴图,用空间换时间。用内存换性能。

图中两个白色圆圈处使用了相同样子的纹理贴图。我们可以知道,在近处的地方应当选用分辨率高的纹理贴图,在远处的墙上,应该选择分辨率很低的纹理贴图。 

Mipmap

Mipmap是一个在图形学上广泛应用的经典概念。它允许大家做范围查询。

Mipmap做的范围查询特点:快,但是不准确。

Mipmap就是从一张图片,生成的一系列图。

 就比如上图。通过八层的降低分辨率,得到了一共8张不同的分辨率图片。

这些图片(Mipmap)是可以提前计算生成的。就是在渲染之前,先将纹理处理一遍,得到低分辨率的一系列mipmap。

计算机视觉中,Mipmap称为图像金字塔。

我们说到,Mipmap是以空间换时间。那么mipmap对比原本的贴图会多出多少空间呢?

答案是:1/3     !!!!!!!所以这是一个非常划算的生意。

 上图中,我们将原图复制三份,填充在一个矩形空间中,再将图像分辨率减小一倍,再复制三份放在右下角剩余的矩形空间中,再继续。。。。。。。会发现右下角多出来的内容空间是无限接近1份贴图的。对比原本复制的3份贴图,多出来的比例就是1/3

我们要用Mipmap做一个近似的范围查询,给到一个值立刻要得到这个值对应给定的范围内的平均值是多少。

任何一个像素都可以映射到纹理上的一个区域,那么这个区域我们要怎么得到。就是采用一个近似的办法。

 比如:上图中,左边是屏幕空间,右边是纹理贴图。蓝色的像素和红色的像素要映射到纹理贴图上的对应部分(这里要渲染的面跟视角有一定的角度)。

在屏幕空间中,各个点的距离都是一致的,都是一个像素。根据映射关系,我们会知道映射到纹理上两个点之间会间隔多大的uv距离。(x,y;u,v都知道。)

 然后我们用计算出来的L作为正方形边长,取纹理贴图中映射点周围的这么一个正方形作为屏幕像素的映射区域。

接下来我们用这个L * L 的矩形去查询合适像素的纹理贴图。如果L是1那么,我们就用原本第0层的材质贴图去映射到屏幕像素。如果L是2,那我们就可以用第1层的纹理贴图。如果L是4,那就使用第2层的纹理贴图。

上面的图中,我们用不同的颜色表示使用不同层级的Mipmap。近处使用较第层级的Mipmap,远处使用高层级的Mipmap。但是我们会发现,各个层级之间并不连续。如何更连续地查询Mipmap,比如查询出第1.8层出的纹理贴图。

连续就是线性,线性就是连续。

所以我们又可以使用线性插值。

线性插值查询Mipmap 

 当我们要查询第1.8层时,我们可以用双线性插值先得到第1层和第2层的值。再对得到的值再进行一次线性插值。总共做了三次的插值。

这样不管我们的纹理映射在哪一个位置,我们都可以通过三线性插值,做一次查询,得到屏幕像素内覆盖的颜色的平均。

采用三线性插值我们那就得到了一个连续效果很好的层级分布图。

 接下来我们用Mipmap来重新渲染前面的那个地面网格图

 我们会发现在远处全都糊掉了。这种情况叫Oveblur。过分模糊。

所以Mipmap还存在一定的问题。

各向异性过滤

因为Mipmap近似出来的是一个正方形的区域,在远处的时候,由于视角变化导致屏幕上的一个正方形像素,覆盖到的区域变成了一个狭长的长方形。在贴图的u和v方向上压缩的比例不一致。

在这种情况下,我们就需要引入一个新的方法来帮助我们部分结局这个问题。

这个方法就是各向异性过滤。(可以打开你的3A大作的设置选项中是否有这么一个选项,开关查看效果)

各向异性就是在各个方向上表现出来的形状是不同的。

 我们可以看到采用了各项异性过滤后,在远处的渲染效果明显好于普通的Mipmap。

Mipmap中我们的长和宽是等比例缩小的,无法适应对于长宽比例压缩不一致的纹理映射。Mipmap计算的就是上面卫星图中左上到右下的对角线的图片。 

而我们用各向异性过滤补充了长宽非等比例缩小的内容,更适合像素映射成矩形的区域。

那么各向异性过滤的空间增加了多少呢?从上面的卫星图,我们大概可以看出,是增加了三倍

还有一种情况。

EWA过滤

对于这种斜着的这种纹理映射区域使用各向异性过滤就无法处理。

对于这种情况就需要使用EWA过滤。

EWA:通俗讲:你有一个任意的不规则形状。对于这个不规则形状,我们都可以把它给拆成一堆的椭圆。用这些椭圆来覆盖这个不规则形状。渲染时我都去查询每一个椭圆,经过多次查询,就得到了可以覆覆盖这个不规则区域的几个椭圆(个人理解,仅供参考)。

下面是gpt的论述:

EWA过滤,即椭圆加权平均(Elliptical Weighted Average)过滤,是计算机图形学中一种高级的纹理过滤方法。它主要用于纹理映射(texture mapping)过程中,以减少纹理放大(texture magnification)时产生的失真和锯齿效果。

EWA过滤的基本思想是考虑像素在屏幕空间的椭圆形区域(footprint),并对这个区域内的纹理元素(texels)进行加权平均。这种方法可以有效地处理纹理映射时的各向异性问题,特别是当纹理表面与观察平面成较大角度时。

具体来说,EWA过滤会追踪当前像素的纹理坐标对于屏幕空间坐标的微分,即 ( \frac{du}{dx}, \frac{du}{dy}, \frac{dv}{dx}, \frac{dv}{dy} )。这些微分值可以通过实时渲染中的ddx和ddy函数获得,在离线渲染中则需要使用射线微分来获得。通过这些微分值,EWA过滤可以确定纹理空间中的采样频率,从而选择合适的mipmap级别进行采样。

EWA过滤算法的核心步骤包括:

  1. 使用微分值确定mipmap级别。
  2. 构建椭圆形状来近似投影后的footprint。
  3. 扫描椭圆所在的包围盒来决定哪个纹素在椭圆内,并进行卷积处理。
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值