• 其他语言



对毛发较短的生物的实时毛发渲染
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录

概述和实现
图 2. 一项简单的二维采样技术
上图展示了一项简单的二维采样技术,左侧是我们要作为模型的有意夸张的毛发。中间是我们用于对头发采样的一组壳。右侧是最终的一组壳。在壳线上方有一条线段的位置上有代表毛发的样本。这些位置将包含对毛发进行照明和着色处理的材质参数。阿尔法通道将被设置为不透明或半透明。没有毛发供采样的部分将是透明的(阿尔法通道将被设置为 0)。

我们的技术受到了 Jerome Lengyel 的论文《Real-Time Fur over Arbitrary Surfaces》(英文)中介绍的纹理、壳和鱼稽生成方法的启发。首先,我们使用 Intel IPP 技术生成壳和鱼稽的纹理。然后,创建鱼稽的几何形状。最后,将图像渲染到帧缓冲区中。将几何形状渲染到帧缓冲区以后,顶点着色器将计算壳顶点的位置。使用壳和鱼稽是因为它们是逼近光线跟踪实现4 的一种非常符合审美观的方式,并且证明适用于我们尝试模拟的短直头发。

第一次运行应用程序来程式化生成壳的纹理时,就必须创建纹理。然后生成鱼稽的纹理。每种纹理都写入到一个文件中。如果文件已经存在,则不需要运行这些算法。每次运行应用程序的时候,都会在渲染前生成鱼稽的几何形状。壳的几何形状是通过将原始顶点沿着顶点着色器中的法线向外移动而创建的。在后面的各部分,我们将给出关于步骤 1-4 的详细信息。步骤 5(渲染)是一个直接的实现,可在使用 DirectX9 顶点着色器和像素着色器的主流图形硬件上运行。总结起来,我们的方法包含以下五个组成部分:

  1. 使用 Intel IPP 生成壳的纹理
  2. 生成鱼稽的纹理
  3. 生成鱼稽的几何形状
  4. 生成壳的几何形状
  5. 使用组成部分 [1-4] 进行渲染
壳的纹理

图 3. 从高斯分布采样的五个壳
在上图中,五个壳是从使用基于高斯算法的阈值函数的高斯分布采样的。壳 0 是最左侧的壳。请注意,当我们将 shell 上移时,可以滤除更多的噪波。这样一来,当我们远离皮肤时,就可以有效地模拟毛发的变细过程。

鱼稽的纹理

鱼鳍纹理是通过对为壳层写出的一组纹理进行采样生成的。我们可以选择一个边缘,然后沿该边缘对纹理进行采样。如果我们确定将此作为头发,则将该头发的颜色渲染到纹理中。头发颜色将从纹理中的此位置扩展到下一个壳层。如果我们确定这是一个空空间,则不进行渲染。此过程将在一组纹理样本中持续下去。此纹理可用于每个边缘。

图 4. 壳纹理的应用
在上图中,我们可以看到在图 2 中应用壳纹理的结果。此图中没有使用任何 fin。

壳的几何形状

开始应用时,我们要为每个壳创建几何形状。壳的数量和壳之间的距离取决于采用的模型。每个壳创建时都用两个三角形按毛发应用到的网格的顶点组成一个四边形。要获得每个四边形的顶点位置,顶点位置将在顶点着色器中沿表面法向向外转换。在我们的演示中,每个壳间的距离是相等的,但在实际应用中可能会有差异。

鱼鳍的几何形状

鱼鳍几何形状是沿每个多边形的边缘创建的,需要在物体空间中创建一个指向四边形的边缘垂直线。边缘几何形状是在加载时创建的,用于每个帧。每个四边形都由两个三角形组成,使用以前面所述的方式创建的纹理进行纹理贴图。

运行时

由于在运行时之前就创建了几何形状和纹理,因此可以直接进行渲染。在运行时,首先渲染模型的几何形状;然后渲染几何形状,用前面各部分创建的纹理进行纹理贴图。我们可将每个壳的阿尔法通道值设置为 0.5。我们需要使用特殊的顶点着色器代码或像素着色器代码渲染壳,每个四边形都有一个纹理贴图通过阿尔法通道值来呈现“毛发”或“空白空间”。在渲染时,网格的顶点将沿着每个壳的法向向外推出。这种转换是在顶点着色器中完成的。了解此内容的最好办法就是查看本文中所附的示例代码。

噪波函数

Intel IPP 是为在 x86 CPU 上运行而进行了优化的一组例程。虽然它们优化的目的是获得高性能,但选择它们的主要原因是因为开发速度:这些例程易于集成,并可降低在我们的示例实现过程中出现缺陷的机率。具体而言,我们选择使用的函数为:

上一部分1  2  3  4  5  下一部分

第 3 页, 共 10 页