存档

‘独自研究’ 分类的存档

山寨葱技术——VocalTune

2009年7月30日 pineapple 3 条评论

因为是山寨技术,所以请不要有任何期待。

总之,事情是这样的。VOCALOID2出现后一段时间,日本那边出现了一个叫做VocalListener的技术研究项目。这个项目的目标是让用户上传一首自己歌曲,然后变成VOCALOID的文件返回给用户,而这个VOCALOID的文件的输出效果尽可能趋近于用户上传的歌曲的效果。其原理就是将VOCALOID合成输出的歌声与用户提供的人声进行主要是音量和音高上的对比,找出差值,并利用这些差值来生成VOCALOID中的控制参数(比如DYN与PIT)。在VocalListener出现后不久,日本那边便产生了一股VOCALOID技术研究热,也出现了各种各样的模仿VocalListener的技术/软件。

以上那些,差不多已经说明了本文的性质。简单的说,被我称作VocalTune这东西就是一VocalListener的山寨。下面有个演示视频

http://www.acfun.com/html/music/20090722/38890.html

或者

http://you.video.sina.com.cn/b/22894978-1630562311.html

(注:视频前部分大部分时间在进行原唱的消伴唱处理。2:02左右出现的那个命令行窗口才是VocalTune的正体)

VocalTune的原理与VocalListener差不多,都是通过对比人声与VOCALOID输出歌声来获得参数。使用snack库来分析歌声的频率。因为人的听觉中,频率高一倍的话,音高就刚好高一个八度,所以将人声与VOCALOID歌声的频率值求2的对数后并想减。然后,现在音乐理论中,一个八度被分为12个半音,几乎是按照对数平分的。也就是说,增加一个半音高,频率的对数就几乎刚好增加1/12。结合VOCALOID中PIT与PBS两个参数的含义(PBS表示PIT影响的半音数),我们便可以用分析出的频率对VOCALOID的参数进行调整。

现在VocalTune的很不完善,界面也很不人性化。不过够用了。写这个东西的动机主要是觉得好玩,其次是自己这边有潜在的需求。

本体暂时不放了,修修再放出…

最后放MP3:http://www.yyfc.com/play.aspx?reg_id=2173027&song_id=3142370

还有应景的两张赶图…

shizumeuta

shizumeuta2

HDR相关

2009年5月22日 pineapple 没有评论

呃那啥,HDR在GeForce7上面是个头痛的问题。GF7虽然支持fp16的渲染目标,却无法在使用fp16渲染目标的同时打开MSAA。其原因就不深究了,网上早有说明,总之事实如此。

HL2在Lost Coast中加入了HDR支持,不过因为当时MSAA和fp16冲突,Value并没有使用很直观的fp16方法来实现HDR,而是用了普通的int8来实现,其做法就是将光照信息编码压缩到RGBA的总共32bit里面。不过这有个问题,在Alpha混合的情况下处理起来会很麻烦,因为编码也会用到alpha通道。

然后,GeForce7600(或者说DX9c?)的显卡支持int16也就是每通道16位整数的渲染目标,但是在dx9c中int16并不支持alpha blending,于是pass。再考虑A2R10G10B10的渲染目标,此格式是支持alpha blending的,而一般的alpha blending只用到dest alpha(也就是贴图中的alpha通道)并没有用到framebuffer中的alpha通道,所以那个A2并不会影响到alpha混合的精度。据df叔所说,A2R10G10B10在XB360上会出现alpha混合的问题,而在他的PC(NV卡)上似乎没问题。于是我们也无从知道是不是PC上的NV卡就没问题,更不知道A卡如何了。

接下来还可以考虑MRT。GF7600是DX9c显卡,支持Shader Model3,也就是说可以一次性渲染到4个渲染目标。我们不做Deferred Shading,所以4个RT绰绰有余了。渲染到2个int8的RT,其中一个RT用RGB三个通道存储色相(剩下的一个留作alpha),第二个RT使用一个通道来存储一个倍数。在进行HDR相关的计算的时候,将第一个RT中的RGB值乘以第二个RT中的倍数的到完整范围的色彩。至于剩下的通道嘛…存点其他的东西啦,自发光度什么的…

 

最后,我觉得用什么技术实现并不是最大的问题,最大的问题是60FPS的怨念啊….

分类: 独自研究 标签:

╮(╯▽╰)╭

2009年4月28日 pineapple 4 条评论

诡异释出

seaside_normal_sm

以上!

分类: 独自研究 标签:

忽然想到——No.2

2009年3月26日 pineapple 没有评论

好吧,还是SSS的东西。这次是法线贴图相关物。在最早的计划(CNB)中就试图用扭曲法线的方法来解决打肿脸的问题。(这里所谓扭曲法线,是指用非常规的normal map来扰动法线。) 不过收效甚微,嘛多半是方法不太对吧。而最近将SSS和原来扭曲法线的方法结合起来口胡,说不定可以得到个好点的效果orz。

以下的东西进过少量验证,还是不怎么可靠。

之前想到的方法仅仅是直接上法线贴图,结果是,之前“打肿脸”的的光照角度OK了,但是其他光照角度又“打肿脸”了。不过现在用法线贴图,是为了一定程度的模拟SSS的一些特征。在材质空间扩散这种模拟SSS的做法中,使用模糊来模拟光线在材质中的散射,而模糊这种做法,实质上降低了光照变化的频率。因此猜想,如果有其他方法可以降低这个频率的话,是否也可以一定程度上达到SSS的效果呢?

法线贴图一般用来添加表面细节,但是用作其他的目的也不错来着。比如用来扰动法线是表面看起来更加平滑(即是说,降低光照变化频率)。不过这个贴图该怎么做呢…烘焙就可以了。

提出以下两个方法制作这样的贴图:

1、高模(如果有)向低模烘焙法线,不过不是烘焙到常见的Tangent空间,而是烘焙到Local空间。接着在PS或者其他软件里面模糊处理这张法线贴图。最后用软件(比如万能的xNormal)把贴图从local空间转换到Tangent空间。

image =>image

2、另外建立一个高模,修改这个高模降低其表面变化频率。比如,一张人脸,可以把鼻子、嘴巴都弄平把颧骨附近relax一下。然后用这个高模向低模烘焙法线贴图。

image to image

ok,贴图做好了,但是该怎么用呢。一开始,我直接将烘焙出的法线贴图(用第一种方法得到的贴图)用在模型上,结果是

image

…虽然看起来平滑了,但是有些想要平滑的地方没有平滑(比如嘴唇下边的较暗部分),某些不想平滑的地方被平滑掉了。而且,鼻子和嘴巴处出现黑块儿。黑块儿出现的原因是,从几何结构上来说那块地方应该是处于shadow之中。效果不理想。于是一次性放弃第一种烘焙材质的方法(可控性低)和上面的法线贴图运用方式(和shadow map不怎么友好)。

先设想法线贴图的用法。

如果我们的模型是一个球体,那么根据光线角度与表面法线的夹角我们倒是可以很方便的伪造出次表面反射的效果,像这样。

image然而,这样的方法和shadow map不怎么友好。转变思路,次表面散射效果主要是由与光线进入表面以后在其内部散射,最后又离开表面进入摄像机。离开表面的光与在表面就被反射掉得光是叠加的。于是想,减弱普通光照模型的下的光照(光进入了表面),然后后在适当的地方加上一些光(光离开了表面)。对于球体,可以直接用dot(normal,lightDir)的方法找到适当的位置,而在更复杂的表面上,这个方法就不怎么好用了。like this…

image

(鼻子下部分应该有光透过,不过却没有)

于是,结合法线贴图降低表面变化频率的想法,用第二种方法烘焙贴图,这次建立的烘焙用高模把鼻子弄平了,嘴唇也平掉了,好吧其实是偷懒,实际上应该更仔细的对待这些部分。效果如下:

image鼻子透过光了!虽然没有真正的SSS(或者比较接近真实的伪SSS)那么好,但是效果也不赖。

最后再加上glow。

image

好吧,glow是作弊,不过看起来还不错。

image

对比用的未扭曲法线版本(当然,也有glow)….感觉还是前者比较有通透感。

最后,其实嘛…我作弊了(拖

正面光时候的效果并不太好,是否能够通过一些调节来解决,就不清楚了╮(╯▽╰)╭。

不能继续偷懒了orz….

OK,可以吐槽了orz…

分类: 独自研究 标签:

忽然想到——No.1

2009年3月25日 pineapple 2 条评论

    上午是UNIX课,因为要点到(实际上也点了),所以不得不去。于是上课开始YY游戏里面的渲染效果。除了还没有想好的场景风格以外,最为头痛就是人物皮肤的表现了。最开始考虑的是最简单的Cel Shading,也就是卡通渲染了。这个主意不错,至少在光照从正面照过来的时候不错。

front-light

(It works)

 

    然后我把光源移高一点,往旁边偏一点。

image

(image

 

    我对无故打肿主角的脸这种事情没有兴趣。不过传统的TV动画的光照模型是高度扭曲过的,要想做得像动画一样不容易啊。很重要的,另外一个原因让我对传统的Cel Shading失去兴趣,那就是Cel Shading会干掉很多的细节。于是把视线转向真实渲染(PR)和非真实渲染(NPR)之间的中间地带。从思路上讲,就是把PR中的技法用到NPR中去。反映到具体画面上就是一些看起来很“湿润”(别想歪)的ACG系CG的效果。

比如这张的效果(脸):

http://www.pixiv.net/member_illust.php?mode=medium&illust_id=3129353

(由于版权原因,只能放出URL。而且很可恶的是没有账号不能看…

等下有空自己来仿一个)

    稍微分析一下这样的效果的组成。答案是,非常重的“次表面散射(Sub-Surface Scattering即SSS)”效果!对,就是那个传说中的SSS(啥?)。不过这里的散射度放倒PR的情况中去的话,就是严重的过度SSS了。如果用看PR的眼光来看这个皮肤,就像是个蜡块。

 

    于是引出了正题——SSS效果(死)。不过以下都是妄想,没有经过论证,也暂时没办法论证。主要目的是记下思路等以后有时间的时候实现,比如在游戏正体开始填充阶段的时候。

 

    关于SSS,在很早之前(还没有开始这个项目之前)就了解过,不过关于实时SSS方面的信息和知识,则是在这个项目开始后才开始关注的。专家们已经提出了很多实时SSS的方法,比如Spherical Harmonics(球谐函数、PRT)、Texture Space Diffusion、Translucent Shadow Maps等等。但是,TSM要求特殊的Shadow Map,而且还可能对Shadow Map做down sample;Texture Space Diffusion需要将光照先渲染进贴图,还要加工这个贴图;而PRT则是计算了整个光照对应情况,而且需要大量预计算时间。这些要么和OGRE的渲染流程相处不怎么河蟹,要么不够灵活(或者说是太麻烦?)。于是一直苦闷,想要找到一种效果不必那么好,只需要刚好能在人物的脸上使用就够的SSS或者伪SSS算法。

    上课无聊,只好各种YY,忽然阀门一转,回想起之前在查找shader新技术的时候找到的运用在HL2中的Radiosity Normal Map——辐射法线贴图RNM。RNM的思路是用贴图记录下某个点对各个方向的不同属性,虽然HL2中的RNM是用来记录辐射度以实现GI的,但是这并不表示RNM只能用来做这样的事情。如果我们吧RNM的那些基向量关于切平面对称一下呢?贴图中的每个分量都是向着物体内部的,每个分量的大小表示的是这个方向附近一块区域的衰减程度。

 

    具体是这样的

image

    考虑上图的情况。光照从上向下。下面的是当前渲染的像素。像素上的三个向量是RNM中的基,是处于切线空间的三个固定向量,虽然图上画的是3个向量,但是实际上我准备使用4个向量,基本上就是HL2的RNM的三个再加上一个和法向量相反的向量。总之,在这三个向量指向的物体的另一面的一块区域内设置采样点,计算每个采样点到渲染像素的距离(或者衰减系数toka)的平均值。将这个平均值记录下来(相当于基中向量的长度),四个值刚好对应四个通道,可以用RGBA的贴图来存储。

    渲染的时候,将基中的每个向量乘上上一步中预制的长度值。再将光照方向变换到切线空间,并与基中的每个向量依次saturate(dot),然后将这些结果值加起来。如此就得到了某个像素在某个光线角度时从内部反射出来的光强度,在这里我将其称为补光。接下来我们可以计算一般的带shadow的光照,最后把这个补光加到基础光照上面去。

 

考虑三种情况

image

1、点发线方向和光照方向很接近。

l为光照方向的向量取反,a1 a2 a3分贝为三个基向量

则saturate(dot(a1,l))=0

saturate(dot(a2,l))=0

saturate(dot(a2,l))=0

最后得到的补光为0

 

image

2、点向量方向与光照方向几乎垂直

这时候

saturate(dot(a1,l))>0

saturate(dot(a2,l))约等于0

saturate(dot(a3,l))=0

得到的补光>0

这里会出现这样的情况

image

    此时点发线、基向量和光照方向都相同。但是明显右边的情况下,入射光衰减的更重,因此, 点P处的补光应该是左>右。造成这样的区别的原因是,物体的几何结构的区别。而实际上,我们在计算基向量长度的时候就已经将物体的集合结构计算进去。因此,此处a1本就应该反映出其附近的衰减程度,也就是说这里的a1向量,左边的应该比右边的长。(好吧,我的表述能力很差,我的意思是。我们之前预计算的贴图会让我们得到近似正确的结果)。

 

然后是

3、点法线与光照方向几乎相反

image这时候三个基向量与l的点积都>0。一般这样的情况是怎么出现的呢…

我想,大概是这样

image 也就是渲染的像素处于背光面。这时候的a2值不会太长。为什么?

因为计算a1a2a3长度的时候我们可以调整衰减的情况…

image

比如这样…这个要根据实际的光照模型来弄。

 

总之,就是利用RNM的原理,来做3S的方法。最后,这个方法其实只对没有变形的物体有效,但是对于脸这样形变并不是很严重的表面大概也适用吧。

 

上课orz /~

分类: 独自研究 标签: