[图形学] 经典算法 - Kajiya三维纹理渲染毛发

简介

        渲染复杂度高细节丰富的场景一直是图像绘制的重要目标。一个想法是引入不同尺度的层次,每一层次对应一种精度几何模型。因此那些复杂的小物体可以被归类为可被简化的几何物体。

        但是,绘制毛皮表面依然面临着一个重大的问题,传统的方法会产生一个严重的走样问题。我们认为这是几何物体的尺度定义不正确导致的。还有一种方法是把精细的几何物体作为纹理而不是几何物体来看待。我们在此将讨论这种方法。

        本文描述了一种新型的纹理映射,称作texel,它是按照体积密度来计算的。texel是一个三维的纹理映射,包含法线、切线和次法线。光照模型的参数根据体积自由分布。一个texel和特定表面的几何形状没有关联。实际上,它的目的是包含在特定体积中的高复杂度的曲面集合,由于texel的渲染时间和几何表面的复杂度无关。事实上,使用texel后,我们可以摒弃通常的几何模型表面概念。也就是说,我们可以直接渲染texel,它能用于任意定义的表面几何体。

        我们将使用texel的概念来描述毛皮表面,并提出一种渲染这类表面的算法。

高精度物体渲染概述

        针对高精度的模型场景的渲染,已经有了不少尝试的解决方案。一种方法是使用暴力运算来解决这一问题,比较早的工作是由Csuri做出的,它用大量多边形生成了烟和毛发的图像。最近,Weil使用上千个lambert圆柱渲染布料。不幸的是,在较大尺度下,微观几何表面会引起严重的走样现象,它们无法通过传统的反走样算法来消除。这些图像看起来会比较破碎,也就是说,对于头发而言,看起来会像刺。

        暴力算法是失败的,因为我们应该通过纹理和光照模型来绘制我们所需要的细节,而非几何体的堆叠。我们可以利用像画家使用的视错觉来表现,来暗示场景中的细节远远超过了图像的分辨率。当一个人走得更近来观察画作时,画家的伎俩就会被识破 —— 此时绘画中细致的物体,只呈现出无意义的色彩斑点。

        最为成功的渲染高复杂度场景的尝试是基于粒子系统的。我们相信他们的成功是因为粒子系统体现了无几何图形绘制的思想。沿着粒子系统的思路,我们使用光照模型和纹理来直接渲染像素,而不通过细节的几何体。从某种意义上来说,本文将粒子系统推广到了光线追踪。正如读者很容易看到的,虽然我们的渲染算法是非常不同的,但粒子系统和texel是互补的,例如,可以使用粒子系统产生texel模型。事实上,本篇文章经过修改后,可以独立于粒子的数量进行粒子系统的渲染。

        Miller提出了一种几何和光照模型结合的办法,同样出于本文中绘制毛绒动物的目的。但是,和粒子系统一样,算法的几何体复杂度取决于头发的数量。texel的概念来自于Blinn渲染体积密度的思想。Bllin描述了一种绘制大量均匀分布在平面内的微观球形颗粒来描述外观,以生成云、尘土以及土星的光环。因为Blinn对大气定向运动感兴趣,他分析整合了它的方程得到了一个简单的光照模型。

        对于Kajiya和Von Herren而言,Blinn的方程是为了通过直接计算来求解各向异性材质,它本质上是光线追踪的体积绘制技术。由于我们的工作基于他们的早期成果,现在我们将简要地讨论一下Kajiya和Von Herzen的方程。

        当一束光穿过球形粒子时,它会发生散射和衰减。衰减主要取决于光线体积的局部密度,而散射依赖于例子散射光的密度和每个粒子的反照率。由于粒子在某些方向上会部分遮挡散射,散射的数量在不同方向上发生变化。这种散射作用然后被其它粒子衰减以及重新散射。

        这一模型忽略了散射粒子周围的衍射。

        在光线追踪中,我们跟随来自眼睛的光线向后朝向光源的位置。由于粒子遮挡引起的沿光线逐渐衰减是根据从眼睛发出的射线上的每个点来计算的。在光线穿过粒子体积的每个点,我们计算向眼睛方向散射的光的量,然后将所有值加起来得到达到眼睛的总光量。在这项技术中,我们使用Blinn方程的反照率和单散射来近似。也就是说,我们假设来自多重散射的贡献是可以忽略不计的,并假设光从光源到眼睛只散射一次。这个假设对于低反照率粒子而言准确性较好,并且会随着反照率的增加而受到影响。

        

        图1显示了该情况的示意图。上图是一个包含了粒子的体积,它被一条射线穿过,线上每个点的密度为P(x,y,z)。到达眼睛的光线沿着R进行计算。对于距离t上的点P = (x(t), y(t),z(t)),每个光源光照l(i)乘以相位因子p(cos theta)的结果反映了有多少光从光源散射到光线中。然后,这个点上的亮度还会经过粒子密度p的加权运算。由介质引起的点P和A之间的衰减可由射线上粒子密度的积分得到,方程为:

        

        方程1计算了密度p的透明度T,沿着每个单位距离ds的密度累积乘以透射系数。系数将粒子的密度转换为衰减系数。值tfar和tnear是参与运算的密度的远近距离。

        方程2根据三个因子对沿射线(x(t),y(t),z(t))的每个dt的亮度进行积分来计算亮度B。第一个因子将介质中的光线衰减到表面,粒子密度体积里深埋了许多被其它粒子隐藏的明亮粒子,因此累积的透射系数低,并且对于最终的像素,粒子并不会贡献太多的光。请注意,这个系数是根据等式1来计算的。第二个因子将到达粒子的每个光源的光强l(i)(如等式1那样作为透射率给出)乘以每个粒子的照明模型,这由相位因子p(cos theta)给出。这个相位因子是光和眼睛之间的夹角的函数,它代表了散射光的遮挡量,就像月相一样。第三个因子根据给定点的粒子密度来加权亮度。少量明亮的粒子贡献的光比大量暗淡粒子要少。

       有多种方式计算光照分量I(i)。Blinn假设材质是各向同性的,并计算每个光源从点P到C的介质透明度。 Kajiya 和 Von Herzen则认为光源在无限远的距离,并为沿着一个平行的波阵面预计算体积中每个点的强度。Rushmeier和Torrance求解一个Ii域上的线性方程。

       继Blinn之后,很多人对体积密度这一领域进行了扩展:Voss(1983), Max(1983), Kajiya and Von Herzen(1984),
Max(1986b, 1986e), Rushmeier and Torrance(1987), 以及 Nishita,Miyawaki and Nakamae(1987)。他们的算法都是在Blinn的原始工作上进行扩展,用于绘制非均匀分布密度的物体,考虑高反照率粒子的解决方案,以及更一般的几何形状。Rushmeier and Torrance(1987)的工作是至今为止最为复杂的:它计算了多次散射后光的物理精确分布——尽管使用的是各向同性散射的模型。

        近年来,科学可视化的普及带动了大量在体积渲染上的研究。例如 Sabella(1988), Upson and Keeler (1988), Drebin, Carpenter, 以及 Hanrahan(1988)。本文介绍的技术可以直接用于矢量场的体积绘制。特别地,这项工作的一个结果和体积渲染有所关联,即阴影的重要性。在结果的小节中,我们渲染了一个没有阴影的相同纹理。如图11,12所示,在不考虑阴影的情况下进行渲染会造成一种不切实际的情况,导致我们的视觉系统不能很好地解释这一画面。

        我们还指出,本文提出的技术非常适合光线追踪/分布式光线追踪/渲染方程的框架。也就是说,texels可以和光线追踪可控的各种各样的基元(primitive)进行混合。我们尚不清楚texel是否和图像渲染的光照兼容。

Texels

        Kajiya and Von Herzeu(1984) 提出,体积密度可能能够呈现除了尘埃、烟尘颗粒之外的许多复杂物体:将包含诸如毛发和毛绒表面等现象。我们开始尝试推广这项工作。在研究过程中,我们发现使用体积密度来模拟表面的想法并不完全合适。虽然在积极密度内使用照明模型而非球形粒子的思路是正确的,但是我们已经发现,不能简单地用表面照明模型来代替粒子照明模型,因为表面散射的物理过程和粒子散射的物理过程有着很大不同,因此必须推导出控制渲染过程的新方程。

        为了推广体积密度,我们现在介绍texels。在实际应用中,texel是一个三维数组,参数与一组微观表面的视觉特性近似。如果用texels来代替几何图形,比如山上的树木,那么像树叶树枝这样的微观表面将存储到体积数组中。在空间中的每个点,都存储了多项数据。首先是微观表面的密度,在某些点上,空间是空的;在另一些点上,有叶子密集的数组。第二项是整个空间的光照模型。在texel中,每个叶子不再存储为多边形,而是用散射函数来代表叶子的集合,散射函数模拟了光是如何从体积单元包含的表面集合中散射的。这个散射函数是由一对数据来表示的,第一个是组织,它代表了每个单位微观表面的主要朝向,其次是反射率函数。

        texels可由多种方式产生。对于很多有趣的情况,我们还没有研究过产生texel的方式。例如,可以使用某种三维扫描转换技术,将树的几何结构采样成三维数组。然而,我们还没有完成这项工作。为了表现毛皮,texel的生成是比较简单的,我们将在这一节中给出。

        texel用于模拟包含了不少表面的体积单元,而非球形粒子。因此texel的第一个分量是标量密度p,他不表示相对体积,而是表示包含在体积单元内微观表面的相对投影面积的近似值。texel的第二个分量是体积单元中微观表面的局部朝向B。第三个分量是光照模型部分,它决定了光是如何从表面散射的。

        定义。texel是一个三元组,即一个标量密度,一组向量,以及一个光反射函数

        标量密度p描述了微观表面覆盖的体积单元的投影单位面积。它本应是考虑到视线的张量,但是我们采用了近似法,所以将其设计为各向同性的标量。

        向量组B描述了texel里表面的局部方向。它是一个坐标系的基底N-T-B,也就是法线,切线和次法线。

        双向反射方程描述了其中包含的表面类型。我们可以将和B组合到单个各向异性照明模型场中,但是我们在这里将它们分开了,这是因为其中一个分量在整个体积中是常数时,另一分量会变化。

        texels是体积密度的一种自然的扩展。因为在体积密度中,球体是基于物理以及各向同性的,所以反射场是均匀的。因此,它们不需要分布在整个密度中,而是可以被建模为单个量。texel就能很好地描述这一点。

渲染texels

        如何修改体积密度来模拟头发?一种朴素的方法是仅仅重新定义密度p,来反射每个体积处的头发密度。计算对应于圆柱而非球体的散射光照模型。不幸的是,这种直接的方法虽然在某种程度上是对的,但也有缺点。

        为了深入理解为什么体积密度不适合渲染微观物体,我们考虑通过体积密度渲染单个平面表面。假设表面被存储为体积密度,它平分了整个立方体(如图2)。表面的光学深度很高,它模拟了一个不透明的表面。假设粒子照明模型的相位粒子是方程1和2中的lamber表面照明模型。现在我们不使用方程1,2来计算表面的透明度和亮度。

        对于透明度计算,即使光学深度参数设置的很高,密度在指数的线性积分也会非常小,这是因为表面是无限薄的,所以线性积分只将在一个点上穿透表面,也就是0点处。

        亮度计算也会出现同样的问题。亮度积分函数产生一个有限的值,它对沿射线的积分贡献为0,因为亮度积分函数只在单个点处为非零。

        这个表面的透明度和亮度都将是0——这意味着一个看不见的表面。显然,我们需要对体绘制进行一些修改,使其能够绘制表面。问题在于微观表面的相对体积并不像粒子密度那样可以决定表面的亮度和不透明度,并且可以反射其入射光的100%,而它的相对体积将为0。因此,我们使用的所谓密度是由Dirac函数给出的,这一点再加上一个更通用的光照模型,就是texel概念的精髓。

        texels以类似于体积密度推广的形式呈现。同样的,方程模拟了图1所示的情况。texel包含了许多表面,表面上投影区域密度为P(x,y,z),每个点都被射线穿透。达到眼睛的光沿着射线R进行计算。在射线上距离为t的点P = (x(t),y(t),z(t)) 处,每个光源的光强L(i)乘以双向反射函数,表示了从光源到射线散射了多少光。然后该点上的投影区域密度将对亮度进行加权。由介质引起的点P和A之间的衰减由射线的密度之和给出。

     texel光照的方程如下:

        方程3,4和方程1,2非常类似。方程3和1的区别在于用求和取代了线性积分。我们使用总和,是因为可以整合Dirac函数在每个微观表面上的贡献。

        方程4和方程2的关系也非常明显,同样是用求和取代了线性积分。第一项代表了图1中沿着射线段AP的衰减,第二项模拟微观表面上的散射。在方程1中有一项包含了每个光源,到达微观表面的光照I(i)乘上微观表面的双向反射函数。最后,第三项,乘以投影区域密度来缩放反射光强度。

        texels的投射方程3是一个总和而非积分。这个总和是在每个表面上沿着光线的密度进行的,如果这个和是无限的,那么传输系数为0,表明密度是完全不透明的。亮度方程4也是一个总和而非积分,这是因为,在每一个和光线相交的表面上,我们都在该点上增加了表面的亮度贡献。

        等式4似乎总会得到一个无限的量,但请记住,总和的项在没有表面的地方为0,而在任一表面之后,光学深度将很高,并且衰减所有贡献到0。因此,这个和是有限的。

        我们可以用方程1递归计算入射强度I的计算,也就是说,光线从点P射向每个光源i(如图1)。方程1可以计算出透射系数。强度I(i)仅是光源沿着线段PC透射系数衰减的亮度。

        如果通过加上沿着原始射线的每个点对应的项来评估总和,则刚刚描述的算法的计算不会太耗时。在下一节提出的算法将通过一种蒙特卡洛处理来近似这些和,根据光线跟踪的思想来计算射线随机采样的期望值。

Texel渲染算法

        texel渲染算法使用沿着射线的随机样本的期望值来近似,从而计算上述和。为了求得从给定光线向后发射的光的强度,我们计算光线和每个texel边界的交点,然后沿着交点射线的距离形成了从t(near)到t(far)的间隔,如图1中的A,D所示。为了能够计算总和,我们使用称为分层采样的技术。我们把光线分成一个个片段(如图1中绘制的那样)。在每个区段中,随机选择点来计算散射项,例如点P。光照I(i)是递归地朝每个光源射出一条射线来计算的,正如前面讨论的。最后计算段的总和,来近似方程3,4中的量。

        1.将光线和所有的texel边界求交,找到每一个texel的t(near)和t(far)。从前到后的位置排序所有交点,并和距离匹配。找到所有线段中最小值,使得Tnear = min[t(near)],同样地,找到Tfar = max[t(far)]。

        2. 将从Tnear到Tfar的射线分成多个长度为Li的线段Si,其中1/L是一个相对的长度,即使用用户设置的世界坐标中每单位距离的采样数(最后一段可能比L要短)。

        3.统一设置透明度。

        4.对于每个线段:

                4.1 从采样点向每个光源发射阴影光线,来计算到达该点的光的总量。

                4.2 根据光照模型和照明强度来计算亮度,并乘以透明度给出像素的总体亮度贡献:

                4.3 用乘以透明度,即线段的透射系数。

        5. 在末端的线段上,像前文所提一样计算亮度,但是需要根据线段的分数长度进行归一化。

        在上述算法中需要步骤5来避免蒙特卡洛计算中的偏差。如果末端线段被认为是完整长度的线段,那么平均值将被丢弃,这会使得体积的边缘看起来比表面稍暗。

        这一章节讨论了渲染单个texel的算法。然而,为了绘制毛绒物体的图像,必须执行四个步骤。也就是texels的创建,texels到世界空间的映射,光线和texels求交,以及光照模型的计算。

       

为毛发生成texels

        我们现在讨论生成毛发片段texel的方法。一般的问题在于生成飘逸的长发。可以使用粒子系统记录三维数组来跟踪单个头发的运动轨迹。粒子将会留下一个反走样的密度轨迹,并和之前的密度相加。

        可以通过仅在每个点存储密度p和向量组B(法线/切线/次法线)来简化毛发的texel。因为双向反射函数对于每个头发都是固定的,相同的(如果头发不变色的话)。因此,不必将其存储在每个数据结构中。对于光照模型的推导,我们可以把一个人的头发看做一个无限薄的圆柱表面,因此,向量组B所需的唯一元素是沿着头发的切向向量,而其余的部分,法线以及次法线,不会进入光照计算,因而被省略。因此,产生毛发的粒子系统不仅会留下密度轨迹,还会存储表示p的速度方向的切向量。

        本文中给出的泰迪熊模型使用了一个单一texel在熊的皮肤上重复绘制。texel的内容是使用粒子系统方法的一个非常简化的版本生成的。泰迪熊的所有毛发都是直线,指向同一个方向,即垂直于头皮的方向(在texel坐标空间)。这意味着毛发将沿着存储texel的三维数组的轴线。因此,切线向量都是相同的,因为它们都垂直于头皮。因此,它们也被排除在体积结构之外。

        熊的毛发texel被存储在一个40x40x10的数组里。数组的内容是基于以下原则设计的:

        1. “毛发”按照Possion disk来分布。

        2. Possion disk使用圆环拓扑进行创建,因此单个纹理可以在不显示接缝的情况下覆盖整个熊的表面。

        3. 动物的皮毛通常有两层,“外层”以及"内层"。内层使用短毛皮覆盖,外层则是稀疏的长毛皮。我们发现这是一个避免毛发看上去像刷出来的重要的特征。

        一个建模程序允许我们搜索参数空间并向我们展示texel的顶部和侧面投影。我们从审美角度(带有随意性),创建了图15和16中的texel。

texels映射到世界空间

        通过在熊的表面覆盖texel,我们创建了一只被毛皮覆盖的熊,毛发的分布自然平滑而又具有随机性。然而,texel表达为一个三维数组,至少在texel空间中,它表现为一个立方体。texel需要连续地映射到熊的形状上,以避免缝隙。

        泰迪熊是使用一种叫做生成模型的新技术来建模的。每个身体部分(头部,身体,耳朵,手臂,腿部和鼻子)都是通过一个设计一个从矩形(由u,v表示)到世界坐标R^3的参数映射来构建的。如果我们使用多边形来渲染这只熊(就像我们对熊鼻子的渲染一样),我们会把这个矩形切成包含nxm个小正方形的网格,每个网格都会逐顶点按照转换到世界坐标系。最终渲染通过双线性插值得到的对象(每个正方形近似用两个三角形表达)。图3演示了这种方法,为了简单起见,图片只显示两个维度。可以很容易推广到三维。

        texels立方体用同样的方法映射到世界空间。参数化的矩形被切割成nxm的小正方形,每一部分被映射到世界空间,并且使用texel的基础进行标识(图4)(在泰迪熊的例子中,一个texel是在整个表面上不断复制的)

        由可生成的模型定义的映射仅对于每个texel基定义了会发生什么。texel的第三维度(高度)也需要映射到世界空间,这一映射决定了熊的毛发是直立的还是躺下的。将扩展到texel第三维度仅需要为texel的角进行定义。一旦texel的角点也被映射,它们就不再是盒子状的了。此外,相邻texel之间的间隙也会消失(图5)。texel的线性插值将在接下来的章节介绍,在此我们假设texel里向有着相同方向的毛发为一个角点。

        我们创建一个建模的程序,允许设计师来操作texel角点的朝向。这个程序从每个texel的角点开始直接计算(每个texel的角点对应头皮一个表面法线)。然后建立全局傅里叶映射来扰动角点。

       

光线和texels求交

        在texel空间中,texel是作为一个立方体存在的。如上所述,我们将texel映射到世界空间中,将立方体的六个面转化为双线性块。光线和texel的交点是通过在世界空间中将光线和六个面相交得到的。

        将光线和双线性块相交

        对于每个双线性块的边缘,包括面体上所有水平和垂直的横截面都是直接。而双线性块的其它其它截面都是二次曲面。因此光线和块相交计算涉及到二次方程的求解是合理的。

        射线可由方程R = at + b(0<=t)定义。三维向量a,b分别代表了原点和射线的方向余弦。一个双线性块可由公式 P = Auv + Bu + Cv + D(0<=u<=1,0<=v<=1)来表达,其中A,B,C,D都是三元组。

        射线R和块P的交点在R = P时产生。我们可以列出以下三个方程:

        这些方程需要重新排序保证第一个方程有着最大的D系数。这可以保证,在块与轴对齐的情况下,方程的分母将是合理的(从而避免浮点溢出)。

       第一个方程按t来求解:

       代入下面两个方程可以消除t,从而得到两个方程:

       上面两个方程可以分别乘以F3和F2,然后可以消除uv项,得到一个u,v的线性方程。将u当做一个值可以得到一个关于v的方程,一旦v确定,u便能确定,t也是一样。

        当我们求解这个二元一次方程(形式为ax^2 + bx + c = 0)时,有可能平方项的系数非常小,这在双线性块四个点共面的时候可能发生。由于我们只求解0<=u<=1的值,在a的值很小的时候我们可以使用以下式子计算:

        如果方程不成立,则根超过范围-1 < u < 1,并且不需要计算。这一简单的测试可以避免浮点数溢出。

将光线-texel交点映射到texel空间

        一旦计算出了光线和texel的交点,它们需要映射到texel空间。然后可以通过texel数组进行三线性插值得到texel的属性(如密度以及切线向量)。

        为了计算映射,我们需要对所有交点进行排序。理想情况下,它们是成对出现的,第一个(近处)表示进入texel的光线,第二个(远处)表示离开texel的光线。这些交点的形式为(f(near),u(near),v(near),t(near)), 以及(f(far),u(far),v(far),t(far))。其中f是相交面的下标,(u,v)是块在面f上的坐标,t是交点沿着射线的距离。

        每个交点都需要重新映射回texel空间,以(x(near),y(near),z(near),t(near)),(x(far),y(far),z(far),t(far))的形式。其中(x,y,z)是交点单元texeld的坐标,t值保持不变。

        texel空间的交点(x,y,z)坐标将会落在一个单位立方体里,至少有一个分量为0或者1,除了t<0处的交点。在这一例子中,对于t=0时,交点的(x,y,z)坐标需要通过插值来校正来匹配射线上的点。

        为了渲染场景,shader需要知道在射线上每个点的texel值。因为t参数在从texel空间到世界空间映射的过程是不变的,我们可以使用它插值来计算任意t处的texel空间坐标。这三个分量为:

毛发的光照模型

         单个毛发的光照模型包含两个组成部分:漫反射和镜面反射。漫反射是由应用于一个非常小的圆柱体的lambert模型推导出的,镜面反射近似于一个应用于圆柱曲面的phong反射模型。

        定义光照模型更严格的方法是按照Kajiya(1985)、Cabral、Max和Springmeyer(1987)或Krueger(1988)的方式来定义。他们的沦为论文了将微观表面直接转换为光照模型的算法。然而,我们发现光照模型的细节的形式对图像的质量并不那么关键。通过几个例子测试,我们的预设方法已经足够了。

        绘制毛发的光照模型的几何结构如图6所示。单个毛发是由位置x0和切线矢量t指定的线段。光线L从x0点指向光源。视线向量e指示了散射光向眼睛的方向。所有的向量都将被归一化。L在垂直于t的平面的投影L'形成了第二个基向量,第三个基的向量b是垂直于前两个基的向量。

        漫反射分量

         毛发的漫反射分量是沿着一个朝向光源的半圆柱体应用Lambert表面模型得到的,如图7所示,我们在光源可见的半圆形上进行积分。表面的背面未被照亮。我们可以很容易算出三个向量t,l',b构成的正交基。第一个基为t,它垂直于texel单元,第二个基为l',它是光线向量在texel的法线平面上的投影。l'可由下式计算:

        垂直于t和l‘的b的计算方法非常简单:

         这三个向量在图6中都有标注。

        圆柱单位长度上的光照总量是沿着阴影终端进行半圆形积分(如图7)。让我们设当前绕圆柱的角度为,范围在0~Pi之间。圆柱的n关于的方程为:

        lamber模型给出的反射光强为,其中kd是漫反射系数。为了求得单位长度上的光的总量,我们沿着半圆形进行积分。沿着圆柱的线性积分元ds可由来表达,记为,因此,可得:

        kd是和l,l'无关的量。将l'的定义代入上式得到一个漫反射的简单表达式:

        因此,我们得到,漫反射分量和光和切线矢量之间的正弦成正比。此时,如果头发的正切指向光源,头发将是黑色的,这和现实是相符合的。

       镜面反射分量

       计算头发的高光需要引入镜像。我们可以从ad hoc Phong镜面反射以类似的方法计算。但是,过程会更加困难,结果模型也会相当复杂。因此,我们设计了一种特殊的镜面模型,它的思想和修改后的Phong模型类似,用于近似模拟头发周围的衍射,该模型在图8中展现。

        任何照向头发的光都会沿着切线形成镜像角。由于圆柱上的法线垂直于切线的所有方向,所以反射光为独立于视线的方位角分量。反射光形成一个圆锥,其顶点处的角度等于入射角,如图8所示,实际上的高光强度可以表达为:

        其中,ks是镜面反射系数,e是指向眼睛的向量,e'是圆锥靠近眼睛向量的镜面反射向量。p是phong指数,用于指定高光的亮度。当眼睛矢量包含在反射椎体,对Phong的依赖下降时,亮度是最大的。

       为了计算这一模型,我们注意到,需要计算的唯一量是相对于切线向量的入射角和反射角

       我们可以从原始向量中很快求得这些值。

结果

        图9展现了毛发的单个texel。除了最基本的平面,没有使用几何模型来创建图像。图10是图9的近距离观察,我们发现这里并不存在画家视错觉的现象。我们需要将texel的表达切换到实际的几何体结构上。

        图11,12,13,14展现了texels转换后的多个测试图像,绘制的是一个毛绒的表面。这些例子展示了texel的角点没有经过变形时的结果。

       图11和12是相同的,区别在于11关闭了阴影,所以每个部分都被照亮了。显然阴影的自遮蔽是texel真实感的重要来源。

       图15和16是泰迪熊的两个版本,每个熊的几何模型都是相同的,使用了不同的傅里叶系数来定义每个局部texel形式。。图15中使用了更大,更少的texel。每个图像的处理器时间基本相同,分辨率都为1280x1024,没有反走样处理。

       准确的CPU时间测量还有问题,因为每个图像是在大型IBM主机网络上同时渲染的,我们总共使用了12个3090处理器和4个3081处理器,平均下来,每个处理器大致耗费了30%~50%,总时间约为2小时。

更多的工作

        将几何体转化为文理的问题仍未解决。这篇文章仅仅是该问题的一个开端。一个从任意复杂几何模型生成texel密度的自动化方法现在仍是无法实现的。我们猜测几何测量理论可能可以为这个问题提供一些思路。

        将texels应用到其他复杂场景的问题也是一个开放的问题:考虑渲染一个山上覆盖的森林,使用合适的texel为树和灌木建模,而不使用多边形。当texels自身非常小时,可以把多个texels合成一个大的texel,从而增加密度并合并照明函数。

        我们没有建模长发或者卷发,仅仅考虑了毛皮。这会是一个有趣的建模工作,特别是当我们决定包含动画的长头发的动态行为时,我们相应,一旦建模问题得到解决,本文提出的方法将可以应用到渲染长发上。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值