毛发渲染 ———— Interactive Fur Shaping and Rendering Using Nonuniform-Layered Textures部分翻译

来源:互联网 发布:迪拜旅游攻略大全网络 编辑:程序博客网 时间:2024/05/01 21:04

前人研究(再次原谅我的懒)

简介:
毛茸茸的表面是展现虚拟动物或者卡通风格对象真实感的关键。然而,由于存在大量的需要处理的稠密的皮毛纤维和少量需要被渲染的纤维,要实现现实的,动态的毛皮表面互动是非常具有挑战性的。为了简化这个过程,我们运用了nonuniform-layered representation of furry surfaces。我们的方法根据视点距离,夹角和毛发弯曲度,长度自动调整layers。

Uniform and nonuniform layered representation
Jerome Lengyel 提供了一种uniform-layeredrepresentation of furry surfaces,该方法避免了毛发的复杂几何细节和达到了实时渲染的帧率。在预处理阶段,他们通过粒子系统建立毛皮的一个patch的几何模型。并且从几个不同层级的Shell texture(半透明)对其采样。在实时渲染的时候,他们通过从模型表面向外移动原有的mesh,并且映射每个Shell到对应的layer的Shell纹理,以此生成多层同心的Shell。 然后从里到外对这些被贴图的Shell进行alpha测试,以此产生毛发效果、

然而,我们觉得不同的长度和弯曲度需要不同类型的layer来表现。 For instance, fur that appears long or has a large angle in relation to the viewing direction will need more layers to cover the gaps between layers (好懒..)其他情况则需要更少的layer,我们的方法定义layer的类型,将其用于表达毛发对象和为每个模型的多边形估计适当的类型。因此,可以通过layers来表现子模型表面的毛发。

Selecting Layers
Layer Selection 涉及到很多因素:视距,取向,毛发的长度,弯曲度(会影响毛发在屏幕上的投影长度)。投影长度越大,意味着更多的像素需要填充屏幕来表现毛发,所以就有需要更多的层。我们使用layer sequence n,2(n-1),4(n-3)..
下一层是上一层的2倍-1.使用这种数列,我们可以在不同layer之间简单地创建平滑的变换。我们当前的系统使用3种不同密度的层:16,31,61.实验表明从16到61足以表现复杂的毛发模型。使用更多的层会导致不必要的损耗。
在渲染之前,我们的方法根据毛发的投影长度将表面的三角形分成三类:tris-16,
tris-31,tris-61;tris-16 使用16层。一般来说,越靠近轮廓位置,尽管在背面,毛发也会变得可见。所以我们的方法会保留这些区域的三角形。为了控制这些保留区域,我们设置一个threshold(闕值):法线和视线方向的最小点积。在我们的实验中,我们设置改threshold为-0.2.Threshold31和Threshold61都是可以被用户调控的。屏幕上的毛发投影可能是一根曲线,为了简单,我们使用毛发投影的根部到尖端的距离来等价这些毛发投影的长度。

Rendering nonuniform layers

我们通过对一个16-layer group 中对其每一个layer之间插入一个layer,进而生成31-layer group,61 layer group 同理。将多层被贴图的片从里到外混合并渲染,实时渲染时,通过向外移动模型表面的顶点生成多层的片。而且每个layer映射到对应层的毛发纹理。对于n层的片,纹理映射需要n层的毛发纹理。这样,我们就在每个顶点计算n个偏移量来生成多层的片。

为了节省纹理内存和减少计算的消耗,我们在预处理时仅仅生成16层的fur纹理,并且,在实时渲染时,为每个layer计算网格顶点偏移。对于31,61layers,我们从相邻的16个层获得额外的层的纹理和偏移。为了执行偏移和内插值的操作,我们使用一个可编程的GPU顶点着色器。该渲染使用Kajiya/Banks光照模型去让毛绒表面产生阴影。我们使用GPU的片段着色器来计算每个像素的光照模型,以此达到良好的实现效果。

Eliminating vision pops

渲染过程中,如果模型发生移动,相同区域的毛发可能会从一个layer的类型变成另一个layer。这些layer的差异会导致视觉的突兀。为了消除这种视觉的突兀,不同类型的layer之间的转换需要有一个平滑的过度。这种差异只会出现在新增的层上,如果新增的层逐渐出现或者消失,我们就可以达到平滑过度的目的了。我们为那些新增的层定义一个渐进变化的β :

L是毛发的屏幕投影长度,Range代表过渡范围(Range

0 0