图形学基础 (六)介绍重心坐标的应用

三角形内部插值

  • 为什么对三角形内部做插值?

    因为我们得到的是三角形顶点的内容, 内部的像素的值需要插值得到且为平滑过渡

  • 那插值什么内容呢?

三角形的顶点有许多内容, 比如它可以定义到它映射到texture上的不同的uv坐标, 颜色, 法线方向

#### 重心坐标

可以借助三个顶点的线性组合得到重心坐标, 而且着三个数加起来都是1,所以只要知道两个数就行了, 而且都是非负的

image-20211206172755797

对于任意一个点的 α   β   γ \alpha \ β \ γ α β γ , 都是满足面积比关系的, 而对于重心这个数是1/3

image-20211206173015473

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77AtQu3N-1639012963444)(typora_pic/image-20211206173438602.png)]

  • 下面是三角形的重心的重心坐标, 重心坐标和重心的重心坐标不是一回事, 因为重心坐标是一系列权重的组合, 重心的重心坐标是一个点的重心坐标

image-20211206173346347

利用重心坐标

假如知道三角形三个点的值, 比如是颜色, 法线, 深度, texture 坐标。。。都可以通过插值的方式得到内部点的属性。

image-20211208163653005

重心坐标局限性

  • 投影变换下不能保证重心坐标不变, 比如从三维中的三角形投影到二维中, 因为三维中的三角形会变形, 其重心坐标的系数也变了

  • 所以对于三维空间中的属性, 插值时应该用3维中的坐标进行插值, 简而言之, 你原本的属性定义在几维的点上, 就用几维中的坐标

  • 假如你已经投影到二维空间中了, 那么就需要再变换回去

Textures 的应用

在这个部分暂时不考虑uv的位置在0到1之内, 因为是映射过去的嘛,这里是为了方便理解

比如屏幕上一个点,通过插值得到像素对应的uv坐标, 然后在uv 属性中一查,再用到屏幕上。

image-20211208165448950

存在的问题:纹理的不匹配

纹理太小

想想我们把一张100x100的纹理贴图应用在一500x500的屏幕之上必然会导致走样失真,比如我查找的uv位置通过插值后是小数,我们可以把它round成整数, 然后再用到屏幕上,这样的话在一定范围内查找的是相同的像素。

  • 纹理上的像素是有名字的,中文叫 纹理元素, 纹素
  • 英文是 texel

这种用四舍五入的方法得到会比较模糊, 如下图:

image-20211208170427671

双线性插值

比如我从屏幕上插值得到的像素是个小数, 这个得到小数的过程详细说一下,比如说我屏幕上有1到5这5个数, 我对应的纹理有1到5个值, 这是一一对应,假如说我的屏幕变为1到10这10个值,那不就是每个数递增0.5, 第一个1对应1, 2对应1.5, 这个1.5就查不到

我们可以找到距离这个小数距离最近的4个点, 这里把距离左下角的点的横向距离规定为s, 纵向距离规定为t, 也就是距离u00的距离, s和t在0到1之内

  • 这里就可以使用线性插值了, 比如我有两个点v0和v1, x的值是0到1, 我就可以通过线性插值得到x对应的坐标

image-20211208172653178

  • 使用横向距离插值两次得到两个点的属性, 就得到下图的u0和u1的值

image-20211208172821858

  • 竖直方向上也可以做插值, 利用上面的到的u0和u1

image-20211208172921776

因为水平和竖直做了两趟所以叫双线性插值, 其实是做了三次插值, 水平方向两次得到两个点, 竖直方向利用这两个点得到最后的值, 这个最后的结果还是不错的

image-20211208173955620

  • 当然更好的是Bicubic, 双三次插值,取附近16个, 每次用4个做插值,不是线性的

image-20211208174124615

纹理大了的问题

其实这个一个像素对应的纹理区域大小不同的问题是透视投影带来的,假如是正交投影其实没这个问题

想象一张很大的地板,在上面铺满了重复的方格贴图,我们所期望看到的结果应该是这样的:

image-20211208192247794

但是假如对应的投影到屏幕上会出现什么情况呢?

image-20211208192329254

近处锯齿!远处摩尔纹!非常严重的走样现象,为什么会导致这样的一个现象呢?

  1. 如开头所说,地板上铺满了重复的方格贴图,根据近大远小,远处的一张完整的贴图可能在屏幕空间中仅仅是几个像素的大小,那么必然屏幕空间的一个像素对应了纹理贴图上的一片范围的点,这其实就是纹理过大所导致的,直观来说想用一个点采样的结果代替纹理空间一片范围的颜色信息,必然会导致严重失真!(从信号的角度来说就是,采样频率过低无法还原信号原貌)

  2. 换一种想法,考虑离相机很远的一个三角形面,假设该三角形面真正在纹理贴图上对应的一片区域有10个像素点。但是由于透视的关系,距离很远的三角形面投影到近平面时可能只有1个或2个像素点的大小(远远小于10个像素的原来大小),那么这1个或2个像素采样texture的结果就要代表原来这个三角形面10个像素点的颜色信息,自然会导致失真!

为什么1个屏幕空间像素点覆盖多个纹理空间像素就是纹理过大呢,想象一下纹理贴图大小500x500,屏幕空间100x100,将屏幕空间的像素点均匀分布在纹理空间之中,那么1个屏幕空间像素点所占的平均大小就是5x5=25个纹理空间像素,因此这就是纹理过大所导致的结果)

image-20211208192430492

这种现象被形象的成为屏幕像素在texture空间的footprint。如上图所示一个屏幕空间的蓝色像素点离相机越远,对应在texture空间的范围也就越大。其实也就是越来越欠采样,那么一种直观的解决方法就是Supersampling,如果一个像素点不足以代表一个区域的颜色信息,那么便把一个像素细分为更多个小的采样点不就可以解决这个问题了吗?对,确实是这样,可以看看如下图512x超采样的结果

image-20211208192450280

效果虽称不上完美但也极大缓解了走样现象,但问题是什么?计算量太大了,一个像素点被分为了512x512个采样点,计算量几乎多出了25万倍!这显然不是所希望看到的,并且随着屏幕空间的点离相机距离更远,更多的texels(纹理空间的像素)会在屏幕像素的一个footprint里面,会要更高的超采样频率。

  • 后面的内容暂时用不到就不再推进了
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

live_for_myself

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值