【10】:着色(插值、高级纹理映射)

重心坐标

三角形内插值

为什么要插值?
知道顶点->找到三角形内部的纹理、颜色、法线

插值什么?
例如phong shading 需要知道每个像素的法线

怎么插?
重心坐标

重心坐标

有可能在三角形外部

必须是非负的

相加等于1(否则不在三角形所在平面内)

怎么求alpha beta gamma?

面积比

(这里的A代表面积,下标代表对着的顶点)

三角形的重心,三个系数恰好就是1/3
(即等面积)

公式

纹理插值

但是重心坐标不是投影不变的!!投影前后变化。要在三维空间做重心插值,而不是投影到二维之后。(例如深度插值要在三维空间做)

漫射颜色(贴图)

对每个像素点
找到uv(xy插值到uv)
找到对应颜色
应用颜色

这样做会出现的问题:

问题1 纹理放大(纹理太小)

纹理太小,变得很糊

找到uv那一步,如果uv对应分辨率很小,会插值。

三种插值

双线性插值

Bicubic

用周围16个点

问题2 纹理太大

远处:摩尔纹
近处:锯齿

原因:近处纹理覆盖小,远处纹理覆盖反而大

也就是走样问题

解决:

超采样(可以但太贵)

问题原因:
采样点远远少于实际信息的覆盖

解决思路:避免采样,直接用区域平均值

这是点查询问题vs范围查询

范围查询就是给定一个范围,立即得到其平均值(或最值)

Mipmap

目的:范围查询(快速、近似、正方形)

mip的原意:拉丁语很多东西在一个小的空间内。

总共有log2(n)层

总共需要的内存空间为原来的4/3倍

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

计算纹理映射范围
就是在xy空间上找相邻的像素投影到uv空间以后的最大距离L

然后以该像素为中心的正方形区域即是要查询的区域

怎么找平均值?

求在第几层恰好变为1个像素。设为D层

D=log2(L)

如果层数不是整数,就插值。(例如第1.8层)

三线性插值:
先在各自的层次上双线性插值,然后在不同层次上插值。

缺陷:

远处太糊

解决:
各向异性过滤

不是正方形的查询,而是矩形的查询

内存开销变为3倍

其中mipmap是对角线区域。

只对显存有开销,对计算量无额外开销。

缺陷:
但是同样不能处理非矩形的(四边形)查询

更进一步的解决方案:
EWA过滤(椭圆形的查询)

纹理应用

纹理在现代的GPU的理解:Texture = 一块内存+滤波/范围查询
纹理不必只存储颜色,还可以是高度等等。
可以“伪造”详细的几何。

Environment Maps,将环境光存储在一个贴图上。
因为几乎只有观察方向对环境光起到影响,所以各个方向的光源可以用一个球体进行存储,即任意一个3D方向,都标志着一个texel。

类比地球仪,把它展开,就可以把球面信息转换到平面上,从而得到环境texture。

类比地球仪,在极点存在拉伸和扭曲问题

解决方法:Cube Map,天空盒。

即用六幅texure表示一个天空盒,再进行一次方向面的计算。

简单来说就是利用方向计算出与对应平面上的交点坐标,剔除平面所对应的一维,剩下来的两维坐标转换到(0,1)范围之内即为(u,v)坐标。

Bump Mapping凹凸贴图

  • 记录逻辑上的相对高度(可为负值),表现物体表面凹凸不平的性质。
  • 对每个pixel做一个“扰动”
  • 利用高度差重新计算法线

计算法线的方法:

在平面上:

c:影响大小系数

在三维空间:

Displacement Mapping位移贴图 

  • Displacement Mapping,与Bump Mapping类似
  • 物理上的高度改变,即改变了三角形顶点位置
  • 可以通过物体阴影的边缘发现与Bump Mapping区别
  • 代价:要求模型精度高
    • DirectX 中的动态曲面细分:开始先用粗糙的三角形,应用Texture的过程中检测是否需要把三角形拆分的更细

三维纹理

三维纹理,定义空间中任意一点的纹理。
并没有真正生成纹理的图,而是定义一个三维空间的噪声函数经过各种处理,变成需要的样子。

阴影纹理

阴影可以计算好,直接写在Texture里。

3D Texture 和 体积渲染

shadow mapping

Shading Point没有考虑其他物体的影响,所以着色不能解决阴影。

Shadow mapping本质上是一种图像空间做法,生成shadow这一步不需要这个场景的几何信息,但也会走样。
Shadow mapping生成硬阴影,不生成软阴影。

shadow mapping具体操作:
key idea: 一个点,如果不在shadow里,你又能看到这个点,说明这个点可以从camera中看到,也可以从光源中看到。

1.从光源看向场景,记录看到的点的深度。

2.从摄像机看向场景,并投影回光源所在的成像上。

    • 深度一致:说明能看到

    • 深度不一致:摄像机能看到,但是光看不到阴影


shadow mapping最终效果:
 


可视化shadow maps:

shadow mapping问题:

  • 浮点数难以判断相等,所以一般会有一个tolerance
  • shadow maps查询时不采用双线性插值,只寻找最近的点,因为倘若插值发生在物体边缘时,与邻接点的深度差距很大,会导致插值结果会有很大的误差
  • 属于硬阴影,只适用于点光源

硬阴影vs软阴影

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值