Lecture9:Shading3 (Texture Mapping cont.)
- 前情回顾:略
- 今日内容
- 重心坐标
- 纹理怎么贴?
- 纹理的应用
Interpolation Across Triangles: Barycentric Coordinates 重心坐标
- 我们为什么要在三角形内部插值?
- 为了在三角形内部平滑过渡
- 我们插值什么内容?
- 纹理坐标,颜色,法向量。。。
- 怎么做插值?
- 重心坐标
- 重心坐标定义于三角形上
- 重心坐标其实是两个数
- 这个平面上每个点都可以用重心坐标表示
- 如果α,β,γ之和为一,表示的坐标在三角形所在平面内
- 进一步,如果又有α,β,γ都非负,表示的坐标在三角形内
- A点自己的重心坐标
- 求任一点的重心坐标(通过面积计算)
- 一个特殊的点,重心
- 求任一点的重心坐标(更容易的方法)
- 怎么使用重心坐标插值?
- 但是在投影变换下无法保证重心坐标不变!
- 插值时不应该忽略深度!
- 怎么使用纹理插值?
这么简单做会出什么问题?
-
问题一:纹理的放大(纹理太小了怎么办?)
- pixel:画面像素,texel:纹理像素
- 对于非整数纹理坐标如何得到其值
- 最近 Nearest
- **双线性插值 Bilinear **
- 找邻近的四个点
- 离左下角的水平、数值距离
- 然后在u、v分别线性插值
- **Bicubic **
- 周围十六个,每次用四个做三次插值
-
问题二:纹理太大了怎么办?
- 引起更严重的问题!
- 走样:远处摩尔纹,近处锯齿
- 为什么会这样?
- 当像素覆盖的纹理区域大的时候,不能简单使用像素中心进行采样
- 之前说的超采样好用吗?
- 好用,但是开销太大了!
- 一个像素内有很高频的信号,需要更高频的采样方法,似乎就是用更多的采样点
- 另一个思路,不采样了!
- 直接告诉一个区域的平均值是多少:点查询问题和范围查询的问题!
- Mipmap,允许范围查询,快,但不准确的,仅仅是正方形的
- mipmap相比于原图引入了多少额外存储?
- 一个级数求和问题,只多了1/3的存储量
- 看图理解为啥1/3也可,不好笔记,用2×2的块想
- 一个级数求和问题,只多了1/3的存储量
- 怎么知道查询的区域有多大? 一种近似:
- 通过区域的大小面积去旋转mipmap
- 去求出其面积在第几层会变成一个像素的大小
- 这个mipmap层数的变化不连续
- 怎么做1.8层?
- 三线性插值:两层有两个双线性插值,对这两个值再插值!
- 开销比较小,游戏中常见
- 三线性插值:两层有两个双线性插值,对这两个值再插值!
- mipmap的缺陷
- 糊掉了远处的细节,overblur
- 原因之一:只能查询正方形范围!
- 引起更严重的问题!
-
各向异性过滤
- 不同长宽比的图(ripmap,额外开销变为原本3倍),mipmap没有这个
- 为什么需要不同长宽比?
- 但是对于那种斜着的图形,各向异性过滤仍然不够
- EWA过滤,把形状拆成圆形多次查询,但是代价大
-
各向异性过滤 n x 指:在水平、竖直方向均压缩m次(2的m次方等于n)
- 因此只要应用了各向异性过滤,n更大对帧率几乎没有影响。
-
纹理的应用:下节课讲