跳至正文

Shading3(Texture Mapping cont.)

重心坐标

1.为什么要在三角形内部进行插值

内部我们希望得到一个平滑的过渡

2.我们插值什么内容呢?

纹理映射 颜色 向量等

3.怎么做插值?

引入概念 重心坐标

在这个三角形ABC形成的平面内

任何一个点都可以表示这三个向量的线性组合

在三角形内这三个必须都大于等于0

 
 

A点所在的重心坐标呢?

 
 

重心的性质 就是把三角形分成三个相等的部分

 
 

对于任意一点还有一个更简化的方法

如果要做插值 同样用重心坐标线性的组合表示出来

这个属性可以是任何的属性

如果想插值三维的属性 那就要用三维的坐标去算重心坐标

再去表示 而不能说用投影来做

 
 

怎么把纹理用在实际渲染中?

屏幕上的点找到纹理在哪

但这么简单使用就会出一些问题

第一个问题就是纹理的放大

假如纹理太小了怎么办

纹理映射到了一个非整数的地方

那在这个红点的地方值为多少呢?

找临近的四个点 四个点总有一个左下角

定义一个操作 线性插值lerp

做了两趟插值 水平一趟 竖直一趟

就叫做双线性插值

 
 

 
 

上面三幅图中间那副就是双线性插值的结果

问题:质量相比更高级的方法还是差一点

最右边这副Bicubic 取的不是临近四个 而是临近十六个

 
 

如果这个纹理太大了又会怎么样呢?

更严重 远处摩尔纹 近处锯齿

也就是说出现了走样问题

纹理大的时候就不能用像素中心去采样了

超采样可以得到一个很好的结果 但是开销很大

回顾一下走样是怎么出现的

当纹理特别大的时候 一个像素内的频率就很高 那采样点可能就不够了

那我就需要一个更高频的采样方法

如果我们避免采样怎么样呢?

如果我立刻就能知道这个平均值是多少呢?

怎么样才能知道呢?

就要提到mipmap这个概念了

另 这实际上是一个算法问题

点查询问题或者说范围查询问题

 
 

Mipmap

允许大家做范围查询

做的快、是不准的涉及到近似、可以做仅仅是方形的范围查询

可以有好几个水平的层级

第一层把分辨率缩小一半

第二层再一半

以此类推

计算机视觉把这个叫图像金字塔

问:生成了这么多张图 比原本存储1多了多少呢?

答:4/3 也就是多了1/3

你可以想象乘三 然后补足最后的1 最后再除于3

 
 

屏幕上的点映射到纹理到底是多少?

一片区域映射到纹理又占了多少?

 
 

最后可以用一个矩形来近似

可以分层 然后从第几层mipmap来选取

那假如说我要个1.8层 怎么做呢?

那就插值 三线性插值

应用之后 出现了过渡

 
 

但是mipmap还没办法完全解决

为什么 一定是mipmap还不完全对

因为三线性插值都是近似 没办法完全正确

各向异性过滤就可以解决一部分这个问题 虽然不是太完美

 
 

各向异性相比mipmap多的是不均匀的水平和垂直压缩

几个X就是压缩几倍 随着X倍数增加 还是会趋近于总存储的三倍

显存足够的话 各向异性过滤直接开到最大就好了 对性能没有太大影响

但是还是不能完全解决问题

所以又出现了EWA过滤

不规则的形状都可以拆成很多不同的椭圆或者圆形

多次查询覆盖可以比较完美 但是开销很大

 
 

发表评论

您的电子邮箱地址不会被公开。