第十章:纹理应用、几何


Shading 1&2

  • Blinn-Phong 反射模型
  • 着色模型/着色频率
  • 图形管线
  • 纹理映射

Shading 3

  • 重心坐标系

  • 纹理反走样(MIPMAP)

    • 纹理太小插值,纹理太大 MIPMAP 范围查询
  • 纹理应用

纹理应用

纹理:一块内存,可以做不同的范围查询(过滤)
环境光照(环境光映射)

把任何一个方向来的光都记录下来,用纹理描述环境光,用环境光渲染其他物体。假设环境光源都是来自无限远处,不考虑位置。
犹他茶壶

image​​image​​image

环境光可以记录在球面上,放在不同的方向上记录一个点,再把图展开(就像世界地图)

但这样会在顶部和底部出现扭曲

image

此时可以假设球外面有一个包围盒,把球心到球表面的连线延长到立方体上,把环境光信息记录在一个立方体上对应的 6 个面上,再把立方体展开:

image

6 个面基本是均匀的,所以不会发生扭曲,但是需要计算方向和面的对应关系。

image

凹凸贴图(法线贴图)
纹理不只是可以表示颜色,也可以表示高度。

可以在不把几何形体变复杂的情况下,定义任意一个点的相对高度,通过相对高度计算出一个假的法线,产生着色上的明暗对比。

image

对像素做扰动,重新计算法线方向

image

用相邻两点的高度差除长度,得到切线,通过切线旋转 90 度再算法线

image

三维情况下需要计算两个方向的切线(假设局部坐标系的法线是(0,0,1)):

image

位移贴图

凹凸贴图没有真正改变顶点的高度,在边缘和自己的几何会产生自己的阴影的情况下表现失真,这个时候用位移贴图,真正改变三角形顶点的高度。问题就是三角形需要定义得足够细,能跟上纹理定义的频率。

image

DirectX(动态曲面细分) 先应用一个粗糙一点的模型,应用过程中检测是否满足要求,根据需要把三角形拆得更细做位移贴图。

三维过程噪声

不真正生成纹理图,定义一个三维噪声函数,计算空间中每一个点计算出噪声的值,再通过一些计算得到纹理。

image

预计算阴影

image

先计算环境光遮蔽写进纹理图,再把纹理图乘以着色的结果,得到阴影。

三维体积渲染

医学成像,核磁共振扫描人体,得到一个密度的三维纹理。

几何

曲线、光滑曲面、齿轮、布料(透明的、纤维)、水的表面形状、城市(大量几何形状)、动物毛发、细胞等等怎么用几何表示。

隐式表示

满足特定关系的一些点表示一个几何,比如一个球体。

f(x,y,z) = 0;

image

问题:
不好直接看出来表示的几何是什么形状

好处:
可以很快得判断一个点在不在这个几何面上(在几何体内还是外)

显式表示

1.把几何上的面的点直接表示出来

2.通过参数映射定义表面

image

好处:
很容易找到形状,把(u,v)都算一遍

问题:
不能很快判断一个点是不是在表面上(在几何体内部还是外部)

隐式表示方法:

代数曲面:

image

可以不只用代数方式来表达:

Constructive Solid Geometry(构造立体几何法,CSG)

用基础的结构体做一些简单运算形成复杂的几何:

image

Distance Function(距离函数)

定义任意一个点到这个几何体表面的最近距离

如果距离是正的,说明这个点在物体外部,距离是负的则在物体内部

对两个几何做融合(blend)得到 A→B 从左到右运动的一个中间状态。blend 两个几何的距离函数,其实就是 blend 两个边界。可以通过 blend 出来的结果距离函数,还原出边界(SDF 为 0)。

image

距离函数也可以不写成解析表达式,比如水平集

等高线也是类似

image

水平集也可以定义在三维上。比如计算三维中 f(x)等于某一个值的所有点,可以得到一个三维空间中的一个表面。
医学扫描

image

水滴融合

image

分形

自重复几何

image

总结:

优点:
隐式函数表示起来比较容易,对存储也比较友好,比较容易判断是否在物体表面。用隐式函数表示的表面很容易对光线求交。严格地表示简单形体,很容易给出准确描述。很适合描述拓扑结构。
缺点:
对复杂的模型很难用一个规则的函数来描述。