首页 > 独自研究 > 忽然想到——No.1

忽然想到——No.1

    上午是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 /~

分类: 独自研究 标签:
  1. 2009年4月6日10:00 | #1

    吐槽不能……

  2. DeepFar
    2009年4月23日10:36 | #2

    菠萝对SSS的执念还真是深啊…如果想追求最真实皮肤的效果,你可以看这篇文章,这个是最新的了(而且也是我见过的最复杂的orz)。里面提到了一种新的SSS实现方法,不过个人觉得这个有点过于极端了…

    http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html

  1. 2012年1月20日19:00 | #1
  2. 2012年1月26日00:10 | #2
  3. 2012年1月26日01:13 | #3
  4. 2012年1月26日01:20 | #4
  5. 2012年1月26日01:58 | #5
  6. 2012年1月26日02:36 | #6
  7. 2012年1月26日02:53 | #7
  8. 2012年1月26日03:08 | #8
  9. 2012年1月26日03:15 | #9
  10. 2012年1月26日04:04 | #10
  11. 2012年1月26日06:11 | #11
  12. 2012年1月26日09:26 | #12
  13. 2012年1月26日21:08 | #13
  14. 2012年1月27日02:43 | #14
  15. 2012年1月27日04:25 | #15
  16. 2012年1月27日05:17 | #16
  17. 2012年1月27日05:35 | #17
  18. 2012年1月27日06:18 | #18
  19. 2012年1月27日07:47 | #19
  20. 2012年1月27日09:30 | #20
  21. 2012年1月27日12:05 | #21
  22. 2012年1月27日19:57 | #22
  23. 2012年1月27日21:50 | #23
  24. 2012年1月28日01:57 | #24
  25. 2012年1月28日06:10 | #25
  26. 2012年1月28日07:49 | #26
  27. 2012年1月28日16:47 | #27
  28. 2012年1月28日17:19 | #28
  29. 2012年1月28日22:13 | #29
  30. 2012年1月28日23:09 | #30
  31. 2012年1月29日02:42 | #31
  32. 2012年1月29日04:54 | #32
  33. 2012年1月29日05:43 | #33
  34. 2012年1月29日06:39 | #34
  35. 2012年1月29日22:12 | #35
  36. 2012年1月29日23:19 | #36
  37. 2012年1月29日23:47 | #37
  38. 2012年1月30日00:28 | #38
  39. 2012年1月30日01:01 | #39
  40. 2012年1月30日02:04 | #40
  41. 2012年1月30日02:32 | #41
  42. 2012年1月30日03:54 | #42
  43. 2012年1月30日05:36 | #43
  44. 2012年1月30日06:29 | #44
  45. 2012年1月30日06:55 | #45
  46. 2012年1月30日15:34 | #46
  47. 2012年1月30日15:58 | #47
  48. 2012年1月30日17:22 | #48
  49. 2012年1月30日19:41 | #49
  50. 2012年1月30日20:20 | #50
  51. 2012年1月30日21:51 | #51
  52. 2012年1月30日22:19 | #52
  53. 2012年1月31日05:46 | #53
  54. 2012年1月31日08:50 | #54
  55. 2012年1月31日18:27 | #55
  56. 2012年1月31日18:35 | #56
  57. 2012年1月31日20:02 | #57
  58. 2012年1月31日20:26 | #58
  59. 2012年1月31日21:06 | #59
  60. 2012年1月31日22:03 | #60
  61. 2012年1月31日23:10 | #61
  62. 2012年2月1日01:30 | #62
  63. 2012年2月1日03:41 | #63
  64. 2012年2月1日04:16 | #64
  65. 2012年2月1日04:44 | #65
  66. 2012年2月1日04:53 | #66
  67. 2012年2月1日05:27 | #67
  68. 2012年2月1日06:04 | #68
  69. 2012年2月1日06:41 | #69
  70. 2012年2月1日07:59 | #70
  71. 2012年2月1日15:29 | #71
  72. 2012年2月1日15:57 | #72
  73. 2012年2月1日16:51 | #73
  74. 2012年2月1日17:32 | #74
  75. 2012年2月1日18:22 | #75
  76. 2012年2月1日18:27 | #76
  77. 2012年2月1日20:44 | #77
  78. 2012年2月1日21:47 | #78
  79. 2012年2月1日22:38 | #79
  80. 2012年2月1日23:29 | #80
  81. 2012年2月2日04:19 | #81
  82. 2012年2月2日04:30 | #82
  83. 2012年2月2日04:49 | #83
  84. 2012年2月2日05:02 | #84
  85. 2012年2月2日05:25 | #85
  86. 2012年2月2日05:34 | #86
  87. 2012年2月2日06:13 | #87
  88. 2012年2月2日07:00 | #88
  89. 2012年2月2日07:40 | #89
  90. 2012年2月2日08:01 | #90
  91. 2012年2月2日08:13 | #91
  92. 2012年2月2日08:41 | #92
  93. 2012年2月2日15:11 | #93
  94. 2012年2月2日15:50 | #94
  95. 2012年2月2日16:34 | #95
  96. 2012年2月2日16:43 | #96
  97. 2012年2月2日17:24 | #97
  98. 2012年2月2日17:46 | #98
  99. 2012年2月2日21:01 | #99
  100. 2012年2月3日06:14 | #100
  101. 2012年2月3日08:41 | #101
  102. 2012年2月3日15:04 | #102
  103. 2012年2月3日15:46 | #103
  104. 2012年2月3日16:30 | #104
  105. 2012年2月3日17:09 | #105
  106. 2012年2月3日18:26 | #106
  107. 2012年2月3日19:17 | #107
  108. 2012年2月3日20:26 | #108
  109. 2012年2月3日20:51 | #109
  110. 2012年2月3日21:23 | #110
  111. 2012年2月3日22:02 | #111
  112. 2012年2月4日01:32 | #112
  113. 2012年2月4日03:14 | #113
  114. 2012年2月4日04:10 | #114
  115. 2012年2月4日11:47 | #115
  116. 2012年2月4日15:28 | #116
  117. 2012年2月5日11:02 | #117
  118. 2012年2月5日12:02 | #118
  119. 2012年2月5日12:25 | #119
  120. 2012年2月5日12:38 | #120
  121. 2012年2月5日20:31 | #121
  122. 2012年2月5日22:15 | #122
  123. 2012年2月5日23:12 | #123
  124. 2012年2月6日00:52 | #124
  125. 2012年2月6日02:40 | #125
  126. 2012年2月6日03:53 | #126
  127. 2012年2月6日05:04 | #127
  128. 2012年2月6日07:49 | #128
  129. 2012年2月6日11:19 | #129
  130. 2012年2月6日11:40 | #130
  131. 2012年2月6日12:19 | #131
  132. 2012年2月6日17:08 | #132
  133. 2012年2月6日17:20 | #133
  134. 2012年2月6日18:28 | #134
  135. 2012年2月6日19:07 | #135
  136. 2012年2月6日19:47 | #136
  137. 2012年2月6日20:14 | #137
  138. 2012年2月6日23:19 | #138
  139. 2012年2月6日23:25 | #139
  140. 2012年2月7日00:28 | #140
  141. 2012年2月7日01:07 | #141
  142. 2012年2月7日03:30 | #142
  143. 2012年2月7日06:17 | #143
  144. 2012年2月7日06:27 | #144
  145. 2012年2月7日06:44 | #145
  146. 2012年2月7日07:12 | #146
  147. 2012年2月7日07:45 | #147

Spam protection by WP Captcha-Free