(译)Real-Time Hair Simulating And Rendering

最近研究头发实时渲染,发现一篇比较好的文章,因此翻译出来,一方面增强自己对原论文的理解,另一方面希望能对需要的人有所帮助。原论文传送门。我翻译水平一般,尽可能认真严肃的翻译,如有错误,还望提醒。

PartI

我(原作者)决定分三部分尽可能详细讲解Marschner论文《Light Scattering from Human Hair Fibers》中研究的内容。

首先,我得提醒你为了理解论文,你必须具备一定的物理学和数学背景而不是shader语法本身。比如原论文经常提到 Snell’s law (我理解是菲涅尔定律)或者probability density functions(概率分布函数)。

Marschner提出的模型主要优点是基于光线通过头发纤维时发生的真实的物理现象。所以我们先学习一下头发丝在电镜下的样子。

将每一根头发丝当成半透明的圆柱,得到以下模型:

模型显示头发上独特且非常明显的反射是R,TT和TRT。

R——光线从头发丝表面反弹给观察者
TT——光线折射进头发然后折射给观察者
TRT——光线折射进头发丝,再内部反射后最终折射给观察者

在整个论文中使用的符号是基于切线空间的(我以前就在坐标系上面吃过亏)

这里是Marschner头发渲染模型所需的所有变量:

u—头发的切线方向,方向是从头发根部到顶部。
w—头发的法线方向,面向观察者。
v—头发的次法线方向,基于v和w计算出来的右手坐标系方向(这点我弄错了)。v-w是法平面。
wi—光照方向。
wr—摄像机(观察者)方向(有待验证,我是按照Worf96的建议将其处理成光线散出的方向)
θi,θr—与法平面的倾角(0°垂直于头发,u为Pi,-u为-Pi(这里的Pi应该指90°))。
φi,φr—围绕头发的方位角(measured so that v is 0 and w is +PI)。

还有几个被用到的参数:

θd = (θr-θi)/2 —差分方位角
φd = (φr-φi)/2—相对方位
θh = (θi+θr)/2—半角
φh = (φi+φr)/2—半角

当然,还有一些头发丝的常量参数,这些参数可以在原论文的Table1(第8页)找到。

心中有了这些后,我们能近似得到以下头发光照模型:

S = SR + STT + STRT,
Sp = Mp (q , q ) x Np (q , f ) for P = R, TT, TRT

接下来我们只要找到谁是M和N。

PartII

在上节中我提到在Marschner的论文中被提到的两个函数

S = SR + STT + STRT,
Sp = Mp (q , q ) x Np (q , f ) for P = R, TT, TRT

M部分

这实际上只是概率分布函数,而且最佳的选择是高斯分布函数(或者叫Normal Distribution)。

M部分的运算如下:

MR (θh) = g( Beta R , θh – Alpha R).
MTT (θh) = g( Beta TT , θh – Alpha TT).
MTRT (θh ) = g( Beta TRT , θh – Alpha TRT).

N部分

N部分的运算实际上有点诡异。这里是其主要步骤:

转化为Miller-Bravais index

这是为了改变2D物理的折射指数,目的是简化三维圆柱的光线在二维横截面上面的处理。在研究了Snell`s Law后我们确定了折射系数如下:

解决cubic equation(立方体函数)

记住如下图片:

我们需要寻找出谁是入射角,然后我们能得出如下的近似模拟方程:

解决菲涅尔方程

菲涅尔方程被用来模拟无衰减情况下的反射模型。(一直不理解的菲尼尔方程难道是这样?有待验证)

吸收因子

这其实非常简洁,仅仅是:

衰减因子

这是获得融合了反射和吸收因子的,因此Marschner的论文称其为“吸收和反射衰减”。

第一个导数是:

N部分(最终版)

N函数为:

NR (q , f )
= NP (0, q , f ).
NTT (q , f )
= NP (1, q , f ).
NTRT (q , f d ) = NP (2, q , f ).

在最后部分,Marschner为了避免奇异情况,建议了一个更复杂的计算模型。但我实现下来看,我不能说这有多大的帮助。所以我坚持原始的NTRT算法。

整个模型

用一个方程来总结整个Marschner头发模型:

PartIII

这是Marschner Shader的最后一部分。我将介绍如何有效的处理这个光照模型,怎么增加环境光和漫反射光,并且在最后一部分我也将提供生成Marschner查找贴图的代码资源和展示一个我在CS中的效果。

查找贴图

由于在shader中要进行大量的运算,最佳的运算就是使用查找贴图,进而尽可能的减少刷新。

我们很容易注意到Marschner的论文中,除了定义的常量,M函数值取决于θi和θr,N函数取决于θd和φd。尽管这或许在开始是一个好的优化,考虑到所有角度必须是从反三角函数中运算得到,比如acos和asin,这些都不是一开始就能得到的,因此直接通过cos和sin建立索引贴图听起来是个不错的想法。
所有角度上的正弦值和余弦值获取方法都能在GPU Gems2上被找到,第23章

  • sin q = (light · Tangent),
  • sin q = (eye · Tangent).
  • lightPerp = light – (light · tangent) x tangent,
  • eyePerp = eye – (eye · tangent) x tangent.
  • cos f = (eyePerp · lightPerp) x ((eyePerp · eyePerp) x (lightPerp · lightPerp))-0.5

至于θd,如果我们注意到θd取决于θi和θr,在弄清楚之后我们能从查找贴图上使用一个通道来索引这两个值。
创建这两张图的最简单方法是生成一张M函数贴图和N函数贴图(包含Mr,Mtt,Mtrt和θd)。然而在原始论文中Ntt和Ntrt都只有三个通道,但我们考虑到吸收率也有一个通道,我们就能简化到只有一个通道( but
they can be reduced to only one channel if we consider the absorption to have one channel as well.)。

环境光和漫反射光

Marschner光照模型只是指定了灯光的反射部分,所以为了获得好的视觉效果,我们为这模型增加环境光和漫反射光。
我使用的灯光来自于Nalu Demo,更详细的介绍:传送门

[plain] view plain copy

print?

  1. /* Compute diffuse lighting with phi-dependent component */
  2. float diffuse = sqrt(max(0.0001, 1 - uv1.x * uv1.x));
  3. /* Pass colors */
  4. float4 diffuseColor;
  5. diffuseColor.rgb = diffuse * objColor.rgb * DiffuseCol;
  6. diffuseColor.a = objColor.a;
  7. float3 ambientColor;
  8. ambientColor = objColor.rgb * AmbientCol;
  9. float3 lighting = (( M.r * N.r + M.g * N.g + M.b * N.b ) / (cos_qd * cos_qd));
  10. lighting += diffuseColor.rgb;
  11. OUT.xyz = lighting + diffuseColor.rgb * 0.2 + IN.AmbientColor;

到此翻译结束。

时间: 2024-08-06 07:57:09

(译)Real-Time Hair Simulating And Rendering的相关文章

[原][译][osgearth]样式表style中参数总结(OE官方文档翻译)

几何Geometry 高度Altitude 挤压Extrusion 图标Icon 模型Model 渲染Render 皮肤Skin 文本Text 覆盖Coverage 提示: 在SDK中,样式表的命名空间是osgEarth::Symbology 每个符号类是在AltitudeSymbol中,属性通过LineSymbol::strokeWidth() 访问器可用 值类型 float: 实数 float with units: 有单位的实数, e.g. 20px (20 pixels) or 10m

39. Volume Rendering Techniques

Milan Ikits University of Utah Joe Kniss University of Utah Aaron Lefohn University of California, Davis Charles Hansen University of Utah This chapter presents texture-based volume rendering techniques that are used for visualizing three-dimensional

各大浏览器内核介绍(Rendering Engine)

在介绍各大浏览器的内核之前,我们先来了解一下什么是浏览器内核. 所谓浏览器内核就是指浏览器最重要或者说核心的部分"Rendering Engine",译为"渲染引擎".负责对网页语法的解析,比如HTML.JavaScript,并渲染到网页上.所以浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定这浏览器如何显示页面的内容和页面的格式信息.不同的浏览器内核对语法的解释也不相同,因此同一的网页在不同内核的浏览器显示的效果也会有差异.这也就是网页编写者在不同内核的浏览器

【转】Transparency (or Translucency) Rendering

From:https://developer.nvidia.com/content/transparency-or-translucency-rendering Like many other visual effects, games attempt to mimic transparent (or translucent as it's often synonymously referred to in the games industry) objects as closely as po

各大浏览器内核(Rendering Engine)

记得刚开始写网页的时候,听童鞋们说各大浏览器的内核,也是懵懵懂懂的,知一不知其二,今天特地查一下: 内核只是一个通俗的说法,其英文名称为“Layout engine”,翻译过来就是“排版引擎”,也被称为“页面渲染引擎”(下文中各种说法通用).它负责取得网页的内容(HTML.XML.图像等等).整 理信息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机.所有网页浏览器.电子邮件客户端以及其它需要编辑.显示网络内容的应 用程序都需要排版引擎. 浏览器最重要或者说核心的部分是“

[译]背景:着色的物理和数学(1)

(译者注:本文是翻译的Naty Hoffman的<Background: Physics and Math of Shading>.我希望通过翻译此文,彻底理解PBR的原理.某些我实在不知道如何恰当翻译的地方,就把英文原文也放上了.原文太长,因此分几部分依次放上来.) 在本课堂讲义中,我们将复习基于物理的渲染(Physically Based Rendering)模型的基础.首先,定性地描述PBR的物理学基础.然后,定量地描述PBR的数学模型.最后,探讨如何将这些数学模型实现为着色代码. 着色

[译]可见性判断之门系统

本文翻译一下<Mathematics for 3D games programming and computer graphics>第3版第8章“可见性判断”中的门系统(Portal Systems)这一节的一部分. 在清华大学出版社出版的詹海生译的中文版中,缺少了对此章节关键一段的翻译.可能是作者疏忽,可能是别的什么,不过下面这个中文版的图我就不能忍了. 看看两者有什么关键区别: 我就怀疑译者没弄懂这个门系统的原理,这不是误人子弟吗?虽然我也一知半解,但是我不会搞个山寨版图片放进去.哎以后还

译:SOS_SCHEDULER_YIELD类型等待在虚拟机环境中的增多

原文出处:Increased SOS_SCHEDULER_YIELD waits on virtual machines 注: 原文的用词是Increased,想译作增强(增长),或者加强,这么译起来是褒义词,而原文要表达的Increased并没有褒义的含义,最起码是一个中性的含义,想来想起用一个“滋长”偏编译的含义还是比较合适的,感觉还是有点过于贬义了,还是用最通俗的增多吧.个人英语水平有限,另外就是对于文中提到的“rdtsc周期”也不是非常清楚,翻译的也不是很清楚,权当是自娱自乐.总是原文的

《100种过度医疗大公开》:转译自日文版,日文版依据的是美国的“Choosing Wisely”项目。三星推荐

本书转译自日文,日文版则是在美国的“Choosing Wisely”项目中选择了100个相对常见的过度医疗项目做解说.Choosing Wisely项目,是由美国多个专业医学组织发起的列出过度医疗项目的活动. 日文作者是兽医专业的新闻记者,中文译者不是医学专业人员,个别专业词语翻译有误,“随机对照试验”翻译成“随机比较试验”了,有些句子翻译的也比较别扭.基于以上两点,这本书的权威性可信度我认为都不算太高,只能给三星.感兴趣的话还是应该直接上网看英文原版. 以下是书中部分信息的摘抄: 1:以美国内