经常有人问我你最近在干什么,但一句话真的很难说明白,最近两个月一直在尝试将Skin Microstructure Deformation with Displacement Map Convolution这篇论文以离线渲染的形式搬运到现有三维工具中,优先就是maya。首先非常感谢论文发表团队无私的贡献了自己的研究成果及过程,附一个论文introduce:http://gl.ict.usc.edu/Research/SkinStretch/。
概述:在cg制作中脸部写实渲染一直是体现水准的领域,随着硬件、扫描技术及渲染器的进步,脸部写实的静帧渲染已经趋向完美,但脸部动作导致的皮肤微观结构拉伸挤压效果的模拟依然存在瑕疵,因为微观结构往往是由扫描贴图置换surface获得,而这个扫描贴图往往是单帧,静态的贴图只会跟着脸部UV移动,并不能产生动态的拉伸挤压效果。Skin Microstructure Deformation with Displacement Map Convolution这篇论文就高效的解决了这个问题。但论文中采用的是实时的方案,这种方案虽然效率高,执行快,但对于vfx公司来讲,能够生成动态贴图序列并输出才是最佳方案。我解决的就是这个问题。
以下简要记录一下我的实现过程。
一:使用maya变形器的过程中一般会有原始shape及变形shape两个模型,首先要做的是提取任一shape的顶点信息,再迭代获取顶点相连的三角面列表,将单一三角面信息存储为向量信息,再将该三角面向量翻转到TangentSpace,这样就可以在uv空间中计算原始shape到变形shape的transform矩阵了,平均该顶点相连的三角面列表的transform矩阵即可获得当前顶点的transform信息。
二:利用顶点transform信息,即可计算拉伸轴s、t及拉伸量了。旋转矩阵的计算及拉伸轴的计算都可以通过svd分解获得,2x3矩阵及2x2矩阵的svd分解都可以不借助计算库完成,所以整个过程会很干净。
三:获得所有顶点的s、t轴及拉伸量后,即可将着手片元处理了。在这里我并未利用opengl来绘制stmap图,而是自行写了一个片元函数来解决,大致思路是对模型中所有三角面遍历,翻转三角面到uv空间中,沿y轴进行扫描,逐行计算st轴及拉伸量。此处略。
四:现在已经有了st光栅化信息了,利用该信息,对原始置换贴图做两次卷积,即可获得动态贴图。实际上这一步是一个近似计算,因为此处只是近似的讲二维卷积算子分解为两个一维算子,但考虑算法复杂度的大幅优化,这种近似是可以接受的。
这四步就是我的基本实现步骤,完成这个研发项目的过程波折不断,既要冒着项目失败的风险,也要顶住其他因素的干扰。在最后时刻惊险完成的同时,也离开了公司。
放几张成果图吧:
冒险是件很有意思的事,但就到这里吧。