重心坐标
三角形内插值
为什么要插值?
知道顶点->找到三角形内部的纹理、颜色、法线
插值什么?
例如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软阴影