【GAMES101笔记速查——Lecture 09 Shading3(Texture Mapping Cont.) 】

目录

1 重心坐标(Barycentric coordinates)

        1.1 引入:三角形插值

           为什么我们要进行三角形插值?

           我们插值什么内容?

           如何插值?

        1.2 重心坐标

         1.2.1 重心坐标定义

        1.2.2 求解重心坐标(面积比)

        1.2.3 三角形重心

        1.2.4 计算三角形任意一点的重心坐标

        1.2.5 使用重心坐标需要注意的情况

2 纹理查询(Texture queries)

        2.1 简单纹理映射

        2.2 纹理放大(Texture Magnification)

        2.2.1 问题描述

        2.2.2 解决方案

      (1)四舍五入

      (2)双线性插值

2.3 纹理缩小(Texture Magnification (hard case))

        2.3.1 问题描述

        2.3.2 解决方案

      (1)超采样

      (2)Mipmap(多级贴图)

        · 如何计算要查询的纹理区域?

        · 如何使Mipmap的查询过程连续?三线性插值。

        · Mipmap的局限性

      (3)各向异性过滤(Anisotropic Filtering)

      (4)EWA滤波

3. 纹理的应用(Applications of textures)

        3.1 环境贴图(Environment Map)

        3.1.1 球面环境映射

        3.1.2 立方体映射

        3.2 凹凸贴图 / 法线贴图

        3.3 位移映射贴图

        3.4 三维纹理

        3.5 体渲染

        3.6 记录已生成信息


1 重心坐标(Barycentric coordinates)

        1.1 引入:三角形插值

           为什么我们要进行三角形插值?

        ·已知顶点的值后,能得到顶点围成的三角形内部任何一个点的平滑的值。

           我们插值什么内容?

       ·纹理映射时候的纹理坐标,颜色,法向量……

           如何插值?

       ·重心坐标

        1.2 重心坐标

         1.2.1 重心坐标定义

        ·将三角形所在平面上任一点表示成三角形顶点坐标的线性组合,且系数之和为1。

        那么(α,β,γ)就是这个三角形的重心表示。

        ·如果这个点在三角形的内部,那么系数都是非负的,即α≥0,β≥0,γ≥0。

        顶点自己的重心坐标如何表示?

        1.2.2 求解重心坐标(面积比)

       通过面积比可以求解重心坐标

        每个小部分的面积可以通过海伦公式求解

        1.2.3 三角形重心

      三角形重心性质:若把重心和顶点连接起来,会分割出来三个等面积的三角形

        1.2.4 计算三角形任意一点的重心坐标

      表达式不用记,只用知道,每个点我们都可以计算出它的重心坐标。

      应用重心坐标可以计算三角形内部任何一点的属性。

        1.2.5 使用重心坐标需要注意的情况

        某个三角形重心坐标与投影之后的三角形的重心坐标不一样。

        如果我们想插值一些三维空间中的属性,

        那么我们需要在三维空间中算重心坐标然后插值,再对应到二维结果上面去。


2 纹理查询(Texture queries)

        2.1 简单纹理映射

        对于每个光栅化屏幕上的点(x,y)一般是像素的中心:

        · 通过这个屏幕坐标的位置(x,y)计算出对应的纹理贴图的坐标位置(u,v)

        · 在纹理贴图上找到(u,v)所在位置的颜色

        · 设置屏幕上点的颜色(通常就直接让这个颜色当漫反射模型的系数kd)

        2.2 纹理放大(Texture Magnification)

          2.2.1 问题描述

        如果纹理本身过小。也就是现在屏幕是一张高清的墙,但上面贴的图很低清怎么办?

        2.2.2 解决方案

      如果纹理查询的时候(对于任何一个点,找到它对应在纹理上的坐标),当查询到的坐标不是一个整数,我们有如下三个方案来应对这个情况:

      (1)四舍五入

      这个方法会导致屏幕上的好几个pixel对应纹理贴图上的同一个texel(纹理元素,纹素), 这样会很模糊,并且过度不自然

        (2)双线性插值

        对于一个点,其对应到贴图上的某一个位置,如果直接将这个位置的颜色设置为texel中心的颜色的话,就会出现好几个pixel是同一个颜色,从而导致画面出现明显的像素级突变(就像四舍五入方法的效果一样)。

现在我们考虑pixel之间的颜色实现平滑的过度

开始考虑pixel映射到的纹理坐标周围的4个texel。
 

想让这个红点的颜色融合它周围的四个texel的颜色,首先我们将其周围的texel中心连接起来,组成一个正方形,设其边长为1(一个像素的距离)。

以左下角的texel的中心点作为计算的原点,算出s和t的长度,此时s和t就是一个介于0到1之间的数。可以用线性插值的公式表示出红点相对于计算原点的远近。

我们先对正方形的上下两条边通过s计算出线性插值后的颜色。

然后对水平方向产生的两个线性插值的结果,根据t,在竖直方向上进行线性插值,从而得到红点处的颜色。

使用双线性插值得到的图像素之间的过度会更加平滑,但依旧模糊。和一些更高级的方法比如Bicubic(任一红点考虑周围的16个格子)来说,效果会差一些。

2.3 纹理缩小(Texture Magnification (hard case))

        2.3.1 问题描述

        · 如果纹理太大了会怎么样?

        · 会引起更严重的问题。

        看一个例子:

        远处出现摩尔纹,近处出现锯齿。

        也就是走样现象。

        这个问题为什么会出现?

        远处,一个像素覆盖比较多的场景(往右)

        近处,一个像素覆盖比较小的场景(往左)(属于2.2的问题)

        这里的场景指的是场景本身,并非我们从屏幕上看到的区域。

        在接近地平线的位置,如果用下图中蓝色的点所在的texel值来代表周围所有灰色场景的话,就会出现画面不连续的情况,也就是摩尔纹。

        2.3.2 解决方案

       (1)超采样

        使用超采样的方法的确可以让画面效果变好,也就是对一个像素内采样512个点,然后取平均。但这个方法计算量消耗太大。

换个思路,采样会导致走样,那如果我们不采样呢?

只要我们可以立刻知道任何一个区域的平均值呢?

点查询:给一个点,值是多少?双线性插值

范围查询:给一片区域,值是多少?Mipmap

      (2)Mipmap(多级贴图)

        这个方法的特点:快、近似的、正方形的。

        Mipmap是可以提前计算出来的。在渲染之前,会为一张纹理预先计算出如下所示的几张衍生图:Mipmap方法在计算机视觉界也被称为图像金字塔Mip hierarchy。

        Mipmap方法的存储量开销多了多少?

        1+1/4+1/16+…+1/4n = 3/4。

        即,将这些图像金字塔提前计算出来所占用的存储量,比原图的存储量仅仅多出了1/3

           · 如何计算要查询的纹理区域?

        取屏幕空间内的每个pixel周围3个相邻的pixel,共4个像素点。

        映射到纹理空间之后,这4个像素点相对位置发生改变,它们围成的区域不再是正方形。

        屏幕空间内,像素边长 = 相邻像素的距离 = 将其连接起来的长度,正好是1像素。

        纹理空间内,查询区域边长 ≈ 相邻像素的距离 ≈ max(将其连接起来的长度),这里为了简便近似的过程,取了某个像素映射后的点与相邻点的连线最大的值L,当然也可以用其他方法近似。

        若L*L=1*1,在D=0层直接查询纹理;

        若L*L =2*2,在D=1层直接查询纹理;

        若L*L =4*4,在D=2层直接查询纹理;

        ···

        若L*L ,在D = \log_{_{2}}L层直接查询纹理。

        将这个Mipmap的过程可视化,可以看到:

        离摄像机越近,区域查询所用的图像金字塔层数D越低(越红);

        离摄像机越远,区域查询所用的图像金字塔层数D越高(越蓝)。

        如下图所示,图像由近到远产生了颜色的递进,但颜色之间的过度并不连续,这可能会导致贴图后过渡边界生硬的问题。

        · 如何使Mipmap的查询过程连续?三线性插值。

     想查询D=1.8层的纹理,我们该怎么办?

     在D层,对于像素映射后的点落在的4个相邻texel,做1次双线性插值。

     在D+1层,对于像素映射后的点落在的4个相邻texel,做1次双线性插值。

     对以上两个步骤获得的结果相结合,再进行1次线性插值。

将这个Mipmap的过程可视化,可以看到:

层与层之间的过渡变得连续起来。

     Mipmap三线性插值的开销:

     2次查询,1次插值。

        · Mipmap的局限性

    

      对比超采样和Mipmap的结果,我们可以发现,在Mipmap方法得到的结果中,远处的物体变得非常模糊,这种现象叫Overblur(过度模糊)。

      为什么会出现这种情况?

      因为我们在Mipmap的计算过程中产生了大量的近似计算。

      原因1:将所有待处理区域近似成正方形

      原因2:三线性插值是近似算法

      我们先着眼于第一个方面来解决这个问题。

      (3)各向异性过滤(Anisotropic Filtering)

        不论屏幕空间内的像素映射到纹理空间后是什么形状,Mipmap都把这些形状近似成正方形来处理。于是,当映射后的区域形状类似于长条时,这种近似方法误差就变得巨大。

        各向异形过滤不只是等比金字塔,还在水平和竖直方向分别压缩,形成多层衍生图。

        各向异性过滤的存储开销是原本的3

        (4)EWA滤波

        用多个圆形去覆盖任意一个不规则形状。


3. 纹理的应用(Applications of textures)

之前我们了解了对一个模型做shading的过程,我们可以使用平面着色、顶点着色、或者像素着色的方法去为一个物体添加光照模型,并且还可以为它添加纹理贴图。

纹理的应用非常多

        3.1 环境贴图(Environment Map)

        可以用纹理贴图来描述环境光的样子,表达出的东西比点光源的信息量要多。

        环境贴图假设默认光线在无限远处,只记录光照的方向信息,不记录距离信息。

(犹他茶壶~

        3.1.1 球面环境映射

环境光被记录在球面上,然后作用于一些物体

这个球面能够展开,但一些区域会出现严重的扭曲问题。这个球面描述了环境信息,但没有均匀地描述出来。

        3.1.2 立方体映射

      连接球心和球面上地一个点,并作延长线,让球面上的点映射到立方体的表面。

映射结果如下,在业内也被称为“天空盒”

        3.2 凹凸贴图 / 法线贴图

        纹理不仅能够描述物体表面的颜色信息(比如替换blinn-phong里面的kd),还可以影响很多属性。

        比如,定义点的相对高度

        相当于在任何一个点做一个假的法线,然后再着色。实际上并没有改变几何

凹凸贴图实现细节

黑色曲线:原本光滑的物体表面

橙色曲线:凹凸贴图定义所有点相对高度变化

如何计算变化后的法线?

让我们考虑最简单的一维情况(flatland case)

·假设原本的曲线是直线,那原来的法线方向就是(0,1)

·定义凹凸贴图后,计算某个点的导数。

切线=相邻两点的高度差除以点和点之间水平方向的距离,也就是除以1。公式如下:

dp = c*[ h(p+1) - h(p) ]

·切线计算出来之后,要算法线。将切线(1,dp)逆时针旋转90度就得到了法线(-dp,1)。

然后,再将法线的大小归一化,得到法线向量:

n(p) = (-dp,1).normalized()

在三维情况如何计算?

分别计算出u方向和v方向的导数,然后计算并归一化(推导省略),得出这一点的法线为:

n = (\textup{-dp/du,\, -dp/dv,\, 1}).normalized()

        3.3 位移映射贴图

        位移映射贴图使用和凹凸贴图相同的纹理,但位移映射会将物体的顶点方向真实移动。

        也就是说:

        凹凸贴图只是表达出了凹凸的感觉,会在物体边缘和影子上回露馅。

        位移贴图是真实改变了物体模型的三角形顶点位置,

        位移映射需要模型足够细致,跟得上纹理的频率。

        directX提供了一套方法来解决这个问题:【曲面细分】

        一开始模型不需要非常细致,在渲染的过程中去检测模型细致度够不够用,如果不够用,那么就将模型三角形细分成更多的三角形,以达到可以使用纹理贴图的程度。

        3.4 三维纹理

        定义了空间中任何一个点的值,三维空间中的噪声函数-柏林噪声。

        3.5 体渲染

        3.6 记录已生成信息

模型的阴影可以提前计算好,然后着色的时候直接贴上去就可以实现物体阴影。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值