Skip to content

三 uv 映射

  • 把一个通用的材质贴图赋予给一个经过拉伸的模型,比如山体之类,会发现贴图也被拉伸了
    • 或者原模型没有 uv
    • 这就可以通过三 UV 映射来解决
    • image.png|400
  • 在三个平面分别采样,之后融合在一起,而不使用模型自身的 uv
  • 三平面UV 映射的核心原理是通过在模型的三个主要平面(X、Y、Z轴)上分别投射纹理,并根据表面法线的方向混合这些纹理 image.png

真实感材质

通用材质模型

  • 数据驱动材质模型编码了真实世界的材质, 更好地保证了材质的物理真实性. 因为不需要运行时通过计算模拟光线与表面的交互, 计算效率比解析模型高且稳定, 不会因为如消光系数等参数的变化而变低.
  • 数据驱动材质模型也有着很多弊端, 如存储消耗大, 即使这些模型都对数据进行了压缩, 但相比只需要存参数的参数材质模型仍需要大量存储空间. 并且基于真实世界数据的模型难以编辑调整, 虽 然有些工作提供了可编辑的参数, 但这些参数 不是很直观, 难以交给美工来使用. 由于基于深度 学习的方法无法保证材质模型的能量守恒, 因此 网络可能会产生无法预料的误差.

  • 目前材质测量的数据仍然较为缺乏, 导致很难生成泛化性较高的模型, 因此模型表达的材质空间并不能超出数据库内的那些材质

参数材质模型

  • 能够描述大部分的现实材质类型
  • image.png|500

Microfacet

  • 假设物体表面由许多微小的、理想的反射面组成
  • \(\omega_{m}\) 表示微表面的法线发型,\(n\) 表示宏观标签法线方向
    • 通过调整微表面法线方向来模拟光线在真实物体表面的复杂反射、折射和散射行为
  • BRDF: \(f_\mathrm{r}\left(\boldsymbol{\omega}_\mathrm{o},\boldsymbol{\omega}_\mathrm{i}\right)=\frac{\mathrm{NDF}(\boldsymbol{\omega}_\mathrm{h})G(\boldsymbol{\omega}_\mathrm{o},\boldsymbol{\omega}_\mathrm{i})F(\boldsymbol{\omega}_\mathrm{o})}{4(n\cdot\boldsymbol{\omega}_\mathrm{o})(\boldsymbol{n}\cdot\boldsymbol{\omega}_\mathrm{i})}\)
    • \(\omega_{0}\) 表是光线出射方向
    • \(\omega_{i}\) 是光线入射方向
    • \(\omega_{h}\) 是半程向量
    • \(n\) 表示宏观表面的法线方向
    • \(NDF\) 法线分布函数定义表面上法线在各个方向上的分布状况
    • \(G\) 模拟表面的互相集合遮挡与阴影
    • \(F\) 菲涅尔项描述光线进入不同介质时反射率随着入射角度不同时的变化情况

Microflake

  • Microflake 模型难以处理织物、珠光等具有各向异性结构的体积或半透明材质
  • 该模型是一个基于双面镜面反射的片状模型,通过模拟这些片元的分布来决定材质,可以很好的表示材质的各向异性
    • image.png|350
    • 不同方向上具有不同的相位函数及消光系数
  • 相位函数:描述光在散射过程中方向变化的函数,表示收入射光的方向与散射光的方向之间的关系 \(f_{\mathfrak{p}}\left(\boldsymbol{\omega}_\mathrm{i}\to\boldsymbol{\omega}_\mathrm{o}\right)\)
  • 消光系数:描述光在传播 过程中由于吸收和散射作用导致光强减弱的度量,即介质对光线总的“阻碍”能力 \(\sigma_{\mathrm{t}}\left(\omega\right)\)
  • 满足互异性:\(\sigma_\mathrm{t}\left(\boldsymbol{\omega}_\mathrm{i}\right)f_\mathrm{p}\left(\boldsymbol{\omega}_\mathrm{i}\to\boldsymbol{\omega}_\mathrm{o}\right)=\sigma_\mathrm{t}\left(\boldsymbol{\omega}_\mathrm{o}\right)f_\mathrm{p}\left(\boldsymbol{\omega}_\mathrm{o}\to\boldsymbol{\omega}_\mathrm{i}\right)\)
    • 能量守恒:\(\int_{S^2}f_{\mathrm{p}}\left(\boldsymbol{\omega}_{\mathrm{i}}\to\boldsymbol{\omega}_{\mathrm{o}}\right)\mathrm{d}\boldsymbol{\omega}_{\mathrm{o}}=1\)
  • image.png|400

Micrograin

  • 用于模拟多孔隙材质,明确的模拟了微晶粒的分布
  • 描述多孔层和平整材质结合产生的 BRDF 建模为不透明的半椭球在任意平整材质上的分布
  • image.png|400
  • \(f_\mathrm{r}\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right)=w^+\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right)f_\mathrm{r}^\mathrm{S}\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right)+\\\left(1-w^+\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right)\right)f_\mathrm{r}^\mathrm{B}\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right).\)
    • \(f_\mathrm{r}^\mathrm{S}\left(\omega_\mathrm{i},\omega_\mathrm{o}\right)\) 表示多孔层的 BRDF
    • \(f_\mathrm{r}^\mathrm{B}\left(\omega_\mathrm{i},\omega_\mathrm{o}\right)\) 表示平整层的 BRDF
    • \(\omega^+\) 表示从入射方向 \(\omega_{i}\) 到出射方向 \(\omega_{o}\) 的光路中只与表面微晶粒相互作用的光路比例

Layered

  • 用于模拟具有多层复杂结构的高效模型,适用于没有明确界限的复杂材质,如油漆涂层、人类皮肤等多层
  • Layered 材质是其他各种材质表 达模型的组合

  • 近似 Layered BSDF 模型:简化了 Layered 材质内部的光线传输计算,将表面反射率近似为由方向反射率、入射方向和粗糙度得出的多波瓣的总和

  • 基于预计算的 Layered BSDF 模型
  • 随机游走 Layered BSDF 模型

数据驱动的材质模型

  • 直接利用真实测量的数据,可以更精确的捕捉材质细节,外观更为逼近真实材质的效果

传统数据驱动方法

  • 基本步骤
    • 首先从材质样本中获取高精度测量值
    • 然后将输入测量值降维并拟合到潜在空间表示模型
    • 最后将该模型用于重现高维外观数据
  • 基于深度学习的方法

  • 传统数据驱动方法通常依赖于输入材质样本的数据一致性, 限制了其的效率。深度学习的发展, 使得从大量数据集中获取高效的材质特征表示成为可能, 这样的表征模型具有通用性, 能够更好地捕捉数据集的一致性特征, 而不仅仅局限于特定样本
  • 端到端训练的神经网络可以从一张或少量输 入图片中恢复物理上可信的材质图

特殊材质模型

  • 对于特殊材质如毛发、布料、皮肤、亮片, 可以采用定制化的建模手段获得更精准和高效的外观效果模拟.

毛发材质

  • 将毛发建模为粗糙电介质圆柱体, 将光线与毛发的交互分解为多个散射波瓣
  • \(f\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right)=M\left(\theta_\mathrm{i},\theta_\mathrm{o}\right)N\left(\boldsymbol{\varphi}_\mathrm{d}\right)A\left(\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{o}\right)\)
    • \(\theta_{i}\theta_{o}\) 分别表示光线入射方向和出射方向在圆柱体侧面上的投影角度,即纵向角
    • \(\phi_{i}\phi_{o}\) 表示光线入射方向与出射方向在圆柱体横截面上的投影角度,即方位角
    • \(M\) 表示纵向散射函数,\(N\) 表示方位散射函数 \(\phi_{d} = |\phi_{o}-\phi_{i}|\)
    • \(A\) 表示光线在毛发内部被介质吸收的部分
  • 动物毛发的髓质成分更多,通过引入双圆柱毛发模型可以捉到动物毛发中明显的扩散与饱和的外观, 这是传统毛发渲染模型无法做到的
    • image.png|450

皮肤材质

  • 皮肤由多层结构构成:表面油脂层贡献了皮肤外观的反射部分, 而油脂层下面的表皮层和真皮层则贡献了次表面散射部分. 此外皮肤表面还有褶皱、毛孔、雀斑灯细节
  • 皮肤渲染模型基于次表面散射方程、体积路径追踪和体积光子映射
  • 驻留的皮肤渲染方程为 BSSRDF(BSDF 是 BSSRDF 的一个特例,假定光线在表面上的入射点和出射点是同一位置)
  • \(S\left(\boldsymbol{x}_\mathrm{i},\boldsymbol{\omega}_\mathrm{i};\boldsymbol{x}_\mathrm{o},\boldsymbol{\omega}_\mathrm{o}\right)=\frac1\pi F_\mathrm{t}\left(\eta,\boldsymbol{\omega}_\mathrm{i}\right)R\left(\left\|\boldsymbol{x}_\mathrm{i}-\boldsymbol{x}_\mathrm{o}\right\|\right)F_\mathrm{t}\left(\eta,\boldsymbol{\omega}_\mathrm{o}\right)\)
    • \(F_t\)表示光线在皮肤边界的菲涅尔反射项
    • \(\eta\) 表示光线的入射方向与出射方向
    • \(x_{i}x_{o}\) 表示光线的入射点和出射点
    • \(R\) 项表示偶极子光源产生的漫反射率,使用表面上 2 点之间的空间距离 \(\left\|\boldsymbol{x}_\mathrm{i}-\boldsymbol{x}_\mathrm{o}\right\|\) 评估光线 在 2 点传输过程中发生的多次散射

布料材质

  • 直接用线来表示布料开销太大,使用基于表面的模型,通过 BRDF 或 BSDF 及纹理来模拟丝线结构
  • 表面散射公式 \(f_{\mathrm{r,s}}\left(t,\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{r}\right)=F_\mathrm{r}\left(\eta,\boldsymbol{\omega}_\mathrm{i}\right)\mathrm{cos}\left(\phi_\mathrm{d}/2\right)g\left(\gamma_\mathrm{s},\theta_\mathrm{h}\right)\)
  • 介质散射公式 \(\begin{aligned}&f_{\mathrm{r,v}}\left(t,\boldsymbol{\omega}_\mathrm{i},\boldsymbol{\omega}_\mathrm{r}\right)=F_\mathrm{t}\left(\eta,\boldsymbol{\omega}_\mathrm{i}\right)F_\mathrm{t}\left(\eta^{\prime},\boldsymbol{\omega}_\mathrm{r}\right)\cdot&\frac{\left(1-k_\mathrm{d}\right)g\left(\gamma_\mathrm{v},\theta_\mathrm{h}\right)+k_\mathrm{d}}{\cos\theta_\mathrm{i}+\cos\theta_\mathrm{r}}A\:.\end{aligned}\)
    • \(t\)表示布料线条切线方向
    • \(F_r\)\(F_t\) 分别表示表菲涅尔的反射与折射项
    • \(\phi_{d}\) 表示光线在圆柱体横截面的投影方位角
    • \(\theta_{i}\theta_{r}\)分别表示光线的入射 方向与出射方向在圆柱体侧面的投影纵向角
    • \(\gamma_{\mathbf{s}}\gamma_{\mathbf{v}}\)分别表示表面散射与介质散射中的高斯函数参数
    • \(k_{d}\)表示一个可调节的各向同性参数
    • \(A\) 表示可调节的颜色参数

亮片材质

  • 具有细微的表面结构,从而呈现出闪烁的外观,具有大量复杂的细节
  • \(D_{\mathfrak{p}}\left(\boldsymbol{\omega}\right)=\int_{\mathbb{R}^2}G_p\left(\boldsymbol{x}\right)G_\mathrm{r}\left(\boldsymbol{n}\left(\boldsymbol{x}\right)-\boldsymbol{\omega}\right)\mathrm{d}x\)
    • 通过对像素覆盖区域 \(G_p\) 内的所有点 \(x\) 出的法线与目标方向的相近情况 \(G_r\) 进行积分,对该 区域内的法线分布进行描述
    • image.png|329

颗粒材质

  • 通常是指肉眼可见的颗粒
  • 由于颗粒的肉眼可见性, 传统的介质渲染方法并不适用, 为了避免对组成颗粒材质的颗粒进行显式的光线追踪, 通过预计算, 将颗粒材质中的光线传输统计性质记录在壳传输方程 \(T_\mathrm{r}\left(x,\omega;y,\omega^{\prime}\right)=p\left(\left(y,\omega^{\prime}\right)|\left(x,\omega\right)\right)\)
    • 光线在颗粒材质中从点 \(x\)\(\omega\) 传播,经过在颗粒中的传播过程,最终在店 \(y\) 处向方向 \(\omega`\) 传播时首次离开以 \(x\) 为球心,\(r\) 为半径的球的概率
    • image.png|285

材质模型的高效渲染方法

  • 完全独立于材质模型求解积分在很多情况下会效率低下,因此人们针对材质模型开发特定的采样策略, 或采用预过滤技术来近似估计某一区域内的积分值, 以优化渲染流程的整体性能

点采样

  • 在渲染中为了计算物体表面一个点的颜色,需要考虑来自周围环境不同方向的光线,而由于方向无限多考虑所有方向的光线是不现实的,通过"采样"来选取一些代表性的方向进行计算
  • 重要性采样:选择对结果共享更大的光线方向,提升效率降低噪声,提升渲染质量
    • 因此向材质更亮、更反射等影响大的方向多采样样本
    • 一个方向被选择的概率最好和材质的反射特性成正比
  • 更好的方法是直接对材质特性×入射光强度的乘积进行采样,这样既考虑了材质,也考虑了光源方向的明暗信息,避免了浪费样本。

隐式材质的采样方法

  • 显式材质:有明确的数学公式,能通过公式计算出应该向哪些方向多采样(比如常见的 Phong 高光模型)。
  • 隐式材质:没有明确公式,多是数据驱动或者神经网络生成的材质模型。要确定如何重要性采样就比较复杂,需要特殊设计的方法。

  • 模型拟合法

    • 把复杂的隐式材质近似成简单的数学模型(比如Blinn-Phong模型、高斯波瓣模型),然后就能用简单模型的公式来指导采样。
    • 有些研究还会用神经网络(比如多层感知器MLP)预测这些简单模型的参数,这样就能适应更多样的材质变化。
  • 生成模型法(正则化流)
    • 使用机器学习方法学习一个简单分布(容易采样)与复杂真实分布(材质反射特性)之间的映射关系。学会后,我们就可以从简单分布中采样,然后通过映射得到符合真实材质分布的样本。
  • 直方图方法
    • 用一些基本的直方图(类似于把方向空间分割为很多小格子)表示材质的反射特性,然后用神经网络预测如何组合这些直方图,以适应不同位置和入射角度的材质变化。

预过滤

  • 渲染一个像素时,实际上它覆盖了物体表面的一小片区域,而不仅仅是一个点。在理想情况下,我们要计算这一小片区域里所有点的光照效果,然后取平均,才能获得真实且平滑的效果。但显然,每个像素实时计算这么多点的光照效果是很慢的。为了解决这个问题,我们就有了“预过滤”方法。
  • 预过滤:提前对材质纹理进行处理,让渲染时能快速又真实地显示材质外观,而不用现场做大量复杂计算。
  • 传统的方法(mipmap)
    • 提前对纹理图片做处理,生成一系列不同分辨率的纹理图,在实际渲染时根据物体与摄像机的距离,选取合适大小的纹理来使用,这样就避免了每次渲染时再实时计算平均值。
    • 缺点:线性算法,对颜色进行平均。但是现实的光照效果(比如反射、高光、阴影)其实不是线性的,直接用线性平均处理纹理再计算光照,最终效果就会不够真实。
  • 改进的方法
    • LEAN方法:针对材质的微观细节,通过更复杂的数学模型(高斯分布)来做过滤,更好地保留了材质的光泽感。
    • LEADR方法:在LEAN基础上又考虑了阴影和遮挡的效果,更真实。
  • 也可以利用深度学习:利用神经网络自动学习纹理的过滤方式,生成更高质量、更真实的材质外观。