4子宫内膜厚15mm正常吗.com是什么类型的游戏

酒店餐桌椅尺寸是多大wduser_饭店餐桌尺寸 饭店餐桌尺寸 12 人台需要多大台面 10 人台需要多大台面 8 人台需要多大台面 12 人的桌子最少也要直径 2.5 米的。 10 个人的 2.2 米或者是 2 米直径的就可以了。","answer_user_header":"http://www。360aiyi。com/down/a7e4ddcb3088ece13cd1edd4d938449.jpg查看更多更多回答wduser_一般情况下,普通餐桌高度为75cm,桌面尺寸取决于桌子的类型。 酒店餐桌尺寸标准各有不同,根据做的人数的不同,桌的大小也不想相同。","answer_user_header":"http://www。360aiyi。com/down/a7e4ddcb3088ece13cd1edd4d938449.jpgwduser_您好,看房间大小。房间大的一般就放的 小房间的 就放760*760的 一般都放方桌。希望能帮到您","answer_user_header":"wduser_要考虑几点:1)每个人面前的空间多大,例如,每人分配60CM的圆周弧长,还是80CM,如果每人给60CM,周长就是480CM,就可以算出直径了。2)同样,看这个直径下,每人给多宽的桌面。","answer_user_header":"wduser_第一讲:关于圆桌 如果大厅、宴会厅的家具都是方形或长方形的,圆桌面直径可从150mm递增。在一般中小型包间中,如用直径1200mm餐桌,常嫌过大,可定做一张直径1140mm的圆桌,同样可坐8-9人,但看起来空间较宽敞。 如果用直径900mm以上的餐桌,虽可坐多人,但不宜摆放过多的固定椅子。如直径1200mm的餐桌,放8张椅子,就很拥挤。可放4-6张椅子。在人多时,再用折椅,折椅可在贮物室收藏。 第二讲:关于方桌 760mm x 760mm的方桌和1070mm x 760mm的长方形桌是常用的餐桌尺寸。如果椅子可伸入桌底,即便是很小的角落,也可以放一张六座位的餐桌,用餐时,只把需餐桌拉出一些就可以了。 760mm的餐桌宽度是标准尺寸,至少也不宜小于700mm,否则,对坐时会因餐桌太窄而互相碰脚。餐桌的脚最好是缩在中间,如果四只脚安排在四角,就很不方便。桌高一般为710mm,配415mm高度的坐椅。桌面低些,就餐时,可对餐桌上的食品看得清楚些。 第三讲:关于开合桌 开合桌又称伸展式餐桌,可由一张900mm方桌或直径1050mm圆桌变成mm的长桌或椭圆桌(有各种尺寸),很适合中小型单位平时和客人多时使用。 这种餐桌从 15世纪开始流行,至今已有500年的历史,是一种很受欢迎的餐桌。不过要留意它的机械构造,开会时应顺滑平稳,收合时应方便对准闭合。用一张圆餐桌,便可得到较好的空间调整。 使用圆桌就餐,还有一个好处,就是坐的人数有较大的宽容度。只要把椅子拉离桌面一点,就可多坐火,不存在使用方桌时坐转角位不方便的弊端。 第四讲:怎样确定餐椅尺寸? 餐椅太高或太低,吃饭时都会感到不舒服,餐椅太高,如400-430mm,会令人腰酸脚疼(许多进口餐椅是480mm)。也不宜坐沙发吃饭,餐椅高度一般以410mm左右为宜。餐椅坐位及靠背要平直(即使有斜度,也以2°-3°为妥)坐垫约20mm厚,连底板也不过25mm厚。有些餐椅做有50mm软垫,下面还有蛇形弹弓,坐此餐椅吃饭,不比上前述的椅子来得舒服。","answer_user_header":"wduser_一般尺寸在 希望帮助到您!","answer_user_header":"wduser_如果大厅、宴会厅的家具都是方形或长方形的,圆桌面直径可从150mm递增。在一般中小型包间中,如用直径1200mm餐桌,常嫌过大,可定做一张直径1140mm的圆桌,同样可坐8-9人,但看起来空间较宽敞。 如果用直径900mm以上的餐桌,虽可坐多人,但不宜摆放过多的固定椅子。如直径1200mm的餐桌,放8张椅子,就很拥挤。可放4-6张椅子。在人多时,再用折椅,折椅可在贮物室收藏。","answer_user_header":"wduser_要分,2人座 4人座 多人座","answer_user_header":"热门问答1234567891011121314151617181920查看更多21222324252627282930免费验房免费设计黄道吉日建材优惠家具定制酒店餐桌椅尺寸是多大wduser_要考虑几点:1)每个人面前的空间多大,例如,每人分配60CM的圆周弧长,还是80CM,如果每人给60CM,周长就是480CM,就可以算出直径了。2)同样,看这个直径下,每人给多宽的桌面。","answer_user_header":"查看更多更多回答wduser_一般情况下,普通餐桌高度为75cm,桌面尺寸取决于桌子的类型。 酒店餐桌尺寸标准各有不同,根据做的人数的不同,桌的大小也不想相同。","answer_user_header":"http://www。360aiyi。com/down/a7e4ddcb3088ece13cd1edd4d938449.jpgwduser_您好,看房间大小。房间大的一般就放的 小房间的 就放760*760的 一般都放方桌。希望能帮到您","answer_user_header":"wduser_饭店餐桌尺寸 饭店餐桌尺寸 12 人台需要多大台面 10 人台需要多大台面 8 人台需要多大台面 12 人的桌子最少也要直径 2.5 米的。 10 个人的 2.2 米或者是 2 米直径的就可以了。","answer_user_header":"http://www。360aiyi。com/down/a7e4ddcb3088ece13cd1edd4d938449.jpgwduser_第一讲:关于圆桌 如果大厅、宴会厅的家具都是方形或长方形的,圆桌面直径可从150mm递增。在一般中小型包间中,如用直径1200mm餐桌,常嫌过大,可定做一张直径1140mm的圆桌,同样可坐8-9人,但看起来空间较宽敞。 如果用直径900mm以上的餐桌,虽可坐多人,但不宜摆放过多的固定椅子。如直径1200mm的餐桌,放8张椅子,就很拥挤。可放4-6张椅子。在人多时,再用折椅,折椅可在贮物室收藏。 第二讲:关于方桌 760mm x 760mm的方桌和1070mm x 760mm的长方形桌是常用的餐桌尺寸。如果椅子可伸入桌底,即便是很小的角落,也可以放一张六座位的餐桌,用餐时,只把需餐桌拉出一些就可以了。 760mm的餐桌宽度是标准尺寸,至少也不宜小于700mm,否则,对坐时会因餐桌太窄而互相碰脚。餐桌的脚最好是缩在中间,如果四只脚安排在四角,就很不方便。桌高一般为710mm,配415mm高度的坐椅。桌面低些,就餐时,可对餐桌上的食品看得清楚些。 第三讲:关于开合桌 开合桌又称伸展式餐桌,可由一张900mm方桌或直径1050mm圆桌变成mm的长桌或椭圆桌(有各种尺寸),很适合中小型单位平时和客人多时使用。 这种餐桌从 15世纪开始流行,至今已有500年的历史,是一种很受欢迎的餐桌。不过要留意它的机械构造,开会时应顺滑平稳,收合时应方便对准闭合。用一张圆餐桌,便可得到较好的空间调整。 使用圆桌就餐,还有一个好处,就是坐的人数有较大的宽容度。只要把椅子拉离桌面一点,就可多坐火,不存在使用方桌时坐转角位不方便的弊端。 第四讲:怎样确定餐椅尺寸? 餐椅太高或太低,吃饭时都会感到不舒服,餐椅太高,如400-430mm,会令人腰酸脚疼(许多进口餐椅是480mm)。也不宜坐沙发吃饭,餐椅高度一般以410mm左右为宜。餐椅坐位及靠背要平直(即使有斜度,也以2°-3°为妥)坐垫约20mm厚,连底板也不过25mm厚。有些餐椅做有50mm软垫,下面还有蛇形弹弓,坐此餐椅吃饭,不比上前述的椅子来得舒服。","answer_user_header":"wduser_一般尺寸在 希望帮助到您!","answer_user_header":"wduser_如果大厅、宴会厅的家具都是方形或长方形的,圆桌面直径可从150mm递增。在一般中小型包间中,如用直径1200mm餐桌,常嫌过大,可定做一张直径1140mm的圆桌,同样可坐8-9人,但看起来空间较宽敞。 如果用直径900mm以上的餐桌,虽可坐多人,但不宜摆放过多的固定椅子。如直径1200mm的餐桌,放8张椅子,就很拥挤。可放4-6张椅子。在人多时,再用折椅,折椅可在贮物室收藏。","answer_user_header":"wduser_要分,2人座 4人座 多人座","answer_user_header":"热门问答1234567891011121314151617181920查看更多21222324252627282930免费验房免费设计黄道吉日建材优惠家具定制&figure&&img src=&https://pic3.zhimg.com/v2-cf12fcbf8d8bb8_b.jpg& data-rawwidth=&512& data-rawheight=&512& class=&origin_image zh-lightbox-thumb& width=&512& data-original=&https://pic3.zhimg.com/v2-cf12fcbf8d8bb8_r.jpg&&&/figure&&p&&b&玩了农药半年了,一直搞不懂英雄的伤害到底是怎么计算的,今早起床打了一把,然后终于没忍住上网查了下,以下是网上的一些总结加上个人的一些见解。&/b&&/p&&p&&br&&/p&&p&&b&物防和法防计算公式等完全一样,本文以物防为例。&/b&&/p&&p&&br&&/p&&p&&b&实际物防计算公式:&/b&&/p&&p&&b&实际物防=(防御方物防数值-攻击方固定穿透)*(1-攻击方穿透比例)&/b&&/p&&ul&&li&&b&假设防御方物防1300,攻击方固定穿透300(百穿铭文100+黑切200),攻击方破甲弓穿透比例45%&/b&&/li&&/ul&&p&&b&因此防御方的实际物防为()*(1-45%)=550&/b&&/p&&p&&br&&/p&&p&&b&实际伤害计算公式:&/b&&/p&&p&&b&实际伤害=攻击方输出*602/(防御方实际物防+602)&/b&&/p&&ul&&li&&b&假设攻击方输出1000,防御方实际物防按上文550算&/b&&/li&&/ul&&p&&b&因此实际伤害为/(550+602)=523&/b&&/p&&p&&b&PS:攻击方输出:如果为技能伤害那就是,技能固定数值+物攻数值*技能百分比&/b&&/p&&p&&b&
如果为普攻伤害直接就是,物攻数值&/b&&/p&&p&&br&&/p&&p&&b&免伤计算公式:&/b&&/p&&p&&b&免伤比=物防/(物防+602)&/b&&/p&&p&&b&物防100时免伤14%
&/b&&/p&&p&&b&200是25%
&/b&&/p&&p&&b&400是40%
500是45%&/b&&/p&&p&&b&600是50%
700是54%&/b&&/p&&p&&b&800是57%
900是60%&/b&&/p&&p&&b&1000是62%
1100是65%&/b&&/p&&p&&b&1200是67%
1300是68%&/b&&/p&&p&&b&1400是70%
1500是71%&/b&&/p&&p&&b&PS:以上为去零数值,并且并非为实际免伤,实际免伤需要用到的数据为实际物防,需要大家自行计算,实际免伤计算公式:实际免伤比=实际物防/(实际物防+602)&/b&&/p&&ul&&li&&b&依照上文假设:1300物防&/b&&/li&&/ul&&p&&b&因此免伤比为1300/()=68%&/b&&/p&&ul&&li&&b&依照上文假设:计算得到的550实际物防&/b&&/li&&/ul&&p&&b&因此实际免伤比为550/(550+602)=48%&/b&&/p&&p&&br&&/p&&p&&b&结论:&/b&&/p&&ol&&li&&b&经过我十几把多英雄1V1人机的测试,不算装备的加成,达到15级时,不同英雄的裸物防在(350 &img src=&https://www.zhihu.com/equation?tex=%5Cpm& alt=&\pm& eeimg=&1&& 30)上下浮动,裸法防固定169。&/b&&/li&&li&&b&因此ADC和法师正常出装不出肉的情况下,加上一双护甲鞋最多是(460&/b& &img src=&https://www.zhihu.com/equation?tex=%5Cpm& alt=&\pm& eeimg=&1&&&b&30)的物防。&/b&&/li&&li&&b&上单半肉英雄攻击装一般最多出两件,出黑切加百穿铭文15级时共300穿透,对ADC和法师的输出能力完全够,破甲弓就显得有些多余了,并且不如破军的伤害来的高。但是如果有些人非要上单半肉英雄追着肉打我也无FUCK说,您出破甲弓我没意见。&/b&&/li&&li&&b&ADC英雄因为大多是攻速铭文而且不出黑切,身在C位对脆皮和肉都进行输出,所以破甲弓是不二的选择。&/b&&/li&&li&&b&刺客打野英雄游走发育抓人,脆皮和肉都是要吃的,出装视情况而定了,不过黑切加百穿基本可以应付大多数情况,如果对面太肉的情况下补个破甲也未尝不可。&/b&&/li&&li&&b&辅助不说,无脑堆肉就可以,输出装出不出取决于顺逆风,大多数情况下输出全靠红莲。&/b&&/li&&/ol&&ul&&li&&b&靠文字说的不直观我们来计算一下,看看数据。&/b&&/li&&/ul&&p&&b&
假设防御方的ADC和法师的物防是460,攻击方的输出是1000&/b&&/p&&p&&b&
①黑切加百穿铭文共300穿透&/b&&/p&&p&&b&
实际物防为460-300=160&/b&&/p&&p&&b&
实际伤害为/(160+602)=790&/b&&/p&&p&&b&
②破甲弓45%穿透比例加百穿铭文100穿透&/b&&/p&&p&&b&
实际物防为(460-100)*(1-45%)=198&/b&&/p&&p&&b&
实际伤害为/(198+602)=753&/b&&/p&&p&&b&
790〉753,460物防的条件下黑切加百穿铭文表现更好&/b&&/p&&p&&b&
假设防御方的出肉英雄的物防是1300,攻击方的输出是1000&/b&&/p&&p&&b&
①黑切加百穿铭文共300穿透&/b&&/p&&p&&b&
实际物防为0&/b&&/p&&p&&b&
实际伤害为/()=376&/b&&/p&&p&&b&
②破甲弓45%穿透比例加百穿铭文100穿透&/b&&/p&&p&&b&
实际物防为()*(1-45%)=660&/b&&/p&&p&&b&
实际伤害为/(660+602)=477&/b&&/p&&p&&b&
477〉376,1300物防的条件下破甲弓加百穿铭文表现更好&/b&&/p&&p&&br&&/p&&p&&b&x-300=(x-100)*(1-45%)&/b&&/p&&p&&b&
x=544&/b&&/p&&p&&b&因此在敌方物防小于544时黑切加百穿铭文更合算,大于544时破甲弓加百穿铭文更合算,当然两者具存收益最大,但是大多数情况鱼和熊掌还是要进行取舍以平衡生存和进攻能力。&/b&&/p&&p&&br&&/p&&p&&b&因为整篇文章都在赘述物防,所以最后说一下法师,其实法防和物防的计算公式等完全一样,但是由于王者荣耀里的物理英雄的数量要远远高于法师,所以导致的结果是,大家基本都是多堆物防,在有限的6个位置中(除非对面法师极多)基本最多出个韧性鞋搭配魔女或者是不死鸟。&/b&&/p&&ul&&li&&b&以魔女为例&/b&&/li&&/ul&&p&&b&
防御方达到15级(1级固定50)固定169裸法防,加上韧性鞋110法防,加上魔女360法
&/b&&/p&&p&&b&
防。&/b&&/p&&p&&b&
攻击方出标配面具(75法穿)配合铭文(梦魇十个24法穿)为99法穿,再出标配法穿棒&/b&&/p&&p&&b&
为45%法穿比例。(大多数人应该都是梦魇,还有一部分人是圣人我就不说了,以梦魇&/b&&/p&&p&&b&
为例,另外还有一些人问出不出法穿鞋,我想说的是鞋有更好的选择,需要更灵活变通&/b&&/p&&p&&b&
,反正我很少出法穿鞋)&/b&&/p&&p&&b&
实际法防为(169+110+360-99)*(1-45%)=297&/b&&/p&&p&&b&
实际法免为297/(297+602)=33%&/b&&/p&&p&&b&
由此可以看出在大环境下,由于不能出更多的法防神装,所以即使出了韧性鞋和魔女的&/b&&/p&&p&&b&
前提下,法免比例依旧很低,攻击方法师仍然能打出很高的伤害,所以提醒各位,打团&/b&&/p&&p&&b&
前尽量干掉法师再开团,可能大家以前也会先干掉法师,那我在这就当给大家加深遍印&/b&&/p&&p&&b&
象。&/b&&/p&&p&&br&&/p&&p&&b&
此文结合网上的一些数据和我自己的一些想法写出,希望对没事闲着喜欢打农药的大家&/b&&/p&&p&&b&
有所帮助,谢谢观看!&/b&&/p&&p&&/p&
玩了农药半年了,一直搞不懂英雄的伤害到底是怎么计算的,今早起床打了一把,然后终于没忍住上网查了下,以下是网上的一些总结加上个人的一些见解。 物防和法防计算公式等完全一样,本文以物防为例。 实际物防计算公式:实际物防=(防御方物防数值-攻击方固…
&figure&&img src=&https://pic2.zhimg.com/v2-50b02f0ab2be0ace06f65_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/v2-50b02f0ab2be0ace06f65_r.jpg&&&/figure&&h2&&b&前言&/b&&/h2&&p&这是关于角色渲染技术的第二篇,应该也是这个话题的最后一篇。前一篇关于皮肤的渲染方法&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&可见这里&/a&。&/p&&p&实际上为了逼真地还原一个角色,除了渲染技术外,在很多游戏中还使用了动画、物理仿真等其他方面的技术,这些技术也非常重要。譬如今年的《地平线:零之黎明》这个游戏给我的感觉就是角色渲染的不如前两年的《教团1886》看着自然,但如果静帧去看的话,显然前者在渲染技术的角度讲也完全不输给后者。我猜大概是因为动捕演员在演绎的时候表情略显浮夸或者是整个动画工具链不如《教团1886》来的好。当然这就属于我不懂的领域了,也希望哪位有AAA游戏从业经验的TA或者相关朋友能给我解释解释。&/p&&p&回到渲染话题本身,这一篇我会试着总结一些除皮肤外其他的一些角色渲染技术,其中以毛发渲染为主,而涉及毛发的仿真相关因为我不太了解,这里也就不强行展开,只把自己看过还有印象的几篇文章[1][2][3]列在这里。&/p&&h2&&b&各向异性材质&/b&&/h2&&p&关于各向异性光照的产生原理在&a href=&https://link.zhihu.com/?target=http%3A//www.bluevoid.com/opengl/sig00/advanced00/notes/node159.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&有一个比较清楚的解释。简单的来说,某些材质上有一些微观上有方向的细丝,这些细丝在我们宏观的角度来看是不易察觉的,典型的有光盘的背面或者是头发。也就是我们这里要引入的&b&strand-based anisotropic lighting&/b&的概念。&figure&&img src=&https://pic4.zhimg.com/v2-2c0f55ccffcebe69cebfeb39_b.jpg& data-rawwidth=&687& data-rawheight=&411& data-thumbnail=&https://pic4.zhimg.com/v2-2c0f55ccffcebe69cebfeb39_b.jpg& class=&origin_image zh-lightbox-thumb& width=&687& data-original=&https://pic4.zhimg.com/v2-2c0f55ccffcebe69cebfeb39_r.jpg&&&/figure&strand based anisotropy是对上述光照情形的一种建模,我们可以把这种微观的细丝看成&b&直径非常小长度很长的圆柱&/b&,&b&那么我们宏观上看到的这类表面上某一点的光照实际上是一圈圆柱上的点的光照的总和&/b&,这一圈点有无数个方向不同的法线,如果要计算总体贡献,就要需要对这一圈点的入射光和BRDF的乘积进行一个半圆形的积分,并且要考虑到相应的可见性(遮挡)函数。类似这样:&/p&&img src=&https://www.zhihu.com/equation?tex=%5Cint_%7B0%7D%5E%7B%5Cpi+%7D+%5Crho%28l%2C+v%2C+n%28%5Ctheta%29%29+%2AL%2A+%28l%5Ccdot+n%28%5Ctheta%29%29+%2A+V%28%5Ctheta%29+%2Ar%2Ad%5Ctheta& alt=&\int_{0}^{\pi } \rho(l, v, n(\theta)) *L* (l\cdot n(\theta)) * V(\theta) *r*d\theta& eeimg=&1&&&p&其中&img src=&https://www.zhihu.com/equation?tex=%5Crho%28l%2C+v%2Cn%28%5Ctheta%29%29& alt=&\rho(l, v,n(\theta))& eeimg=&1&&是BRDF,L是和法线方向无关的入射光强,&img src=&https://www.zhihu.com/equation?tex=V%28%5Ctheta%29& alt=&V(\theta)& eeimg=&1&&是和角度相关的可见性。&/p&&br&&p&其中&img src=&https://www.zhihu.com/equation?tex=%5Cint_%7B0%7D%5E%7B2%5Cpi+%7D%28l%5Ccdot+n%28%5Ctheta%29%29+%2A+V%28%5Ctheta%29%2Ar%2A+d%5Ctheta& alt=&\int_{0}^{2\pi }(l\cdot n(\theta)) * V(\theta)*r* d\theta& eeimg=&1&&这部分的积分很像我们上一篇提到过的&b&bent normal&/b&的概念。那么进一步地,假如我们能够通过预积分算出这种情形下的bent normal,那上面这个式子就能进一步近似成这样:&/p&&img src=&https://www.zhihu.com/equation?tex=k%2A%5Crho%28l%2C+v%2Cn_%7Bbent%7D%29+%2A+L%2A%28l%5Ccdot+n_%7Bbent%7D+%29& alt=&k*\rho(l, v,n_{bent}) * L*(l\cdot n_{bent} )& eeimg=&1&&&p&这里&img src=&https://www.zhihu.com/equation?tex=n_%7Bbent%7D& alt=&n_{bent}& eeimg=&1&&就是我们预积分出来的那个方向,那么这个方向到底是哪里呢?&b&由于整个半圆形都在一个法线平面上,如果假设光照方向向量投影在该平面的向量是&img src=&https://www.zhihu.com/equation?tex=n%27& alt=&n'& eeimg=&1&&,那么整个半圆上所有法线应该是对称地分布在&img src=&https://www.zhihu.com/equation?tex=n%27& alt=&n'& eeimg=&1&&两侧,所以&img src=&https://www.zhihu.com/equation?tex=n%27& alt=&n'& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=n_%7Bbent%7D& alt=&n_{bent}& eeimg=&1&&方向应该相同&/b&。假定细丝延伸的方向为&img src=&https://www.zhihu.com/equation?tex=t& alt=&t& eeimg=&1&&,那么&img src=&https://www.zhihu.com/equation?tex=t& alt=&t& eeimg=&1&&,&img src=&https://www.zhihu.com/equation?tex=n_%7Bbent%7D& alt=&n_{bent}& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=l& alt=&l& eeimg=&1&&这三者是共面的!并且&img src=&https://www.zhihu.com/equation?tex=n_%7Bbent%7D& alt=&n_{bent}& eeimg=&1&&和&img src=&https://www.zhihu.com/equation?tex=t& alt=&t& eeimg=&1&&相互垂直,这样,我们就可以用简单的平面三角函数来得到:&/p&&img src=&https://www.zhihu.com/equation?tex=l%5Ccdot+n_%7Bbent%7D+%3Dcos%28%5Ctheta%29%3Dsin%28%5Cfrac%7B%5Cpi%7D%7B2%7D-%5Ctheta+%29+%3D%5Csqrt%7B1+-+%28l%5Ccdot+t%29%5E%7B2%7D+%7D+& alt=&l\cdot n_{bent} =cos(\theta)=sin(\frac{\pi}{2}-\theta ) =\sqrt{1 - (l\cdot t)^{2} } & eeimg=&1&&&p&类似地,&/p&&img src=&https://www.zhihu.com/equation?tex=h%5Ccdot+n_%7Bbent%7D+%3D+%5Csqrt%7B1+-+%28h%5Ccdot+t%29%5E%7B2%7D+%7D+& alt=&h\cdot n_{bent} = \sqrt{1 - (h\cdot t)^{2} } & eeimg=&1&&&p&&figure&&img src=&https://pic2.zhimg.com/v2-42e0a92e527d2f996aafd_b.jpg& data-rawwidth=&272& data-rawheight=&241& class=&content_image& width=&272&&&/figure&&b&因此我们用细丝的延伸方向&img src=&https://www.zhihu.com/equation?tex=t& alt=&t& eeimg=&1&&去代替法线方向&img src=&https://www.zhihu.com/equation?tex=n_%7Bbent%7D& alt=&n_{bent}& eeimg=&1&&来进行各向异性的光照计算&/b&,&b&我们可以通过让美术沿着发丝生长的方向去展开模型uv坐标的u或者v的值,使得这个方向恰好就是切线空间(tangent space)中的切线方向(因为切线的方向就是uv坐标中u或者v增长的方向)&/b&。&/p&&p&上面关于为什么用切线代替法线去计算光照的解释只是我的个人理解,包括数学推导肯定也有一些错误,只是希望通过一个不同的角度(bent normal)来试着合理解释我们为什么在这里用切线。一个更加简单的解释是,&b&我们认为微观上和光照方向点积最大的那个法线方向就是我们最终参与到光照计算的宏观法线&/b&,&b&我们能够通过美术制作规范使其和几何模型的切线方向相垂直&/b&,因此也就能够使用切线去替代这个法线进行相应的光照计算。&/p&&h2&&b&Kajiya-Kay毛发渲染模型&/b&&/h2&&p&基于刚才说的strand-based model,这里我们就要引出一个这些年来游戏中用到的最多的毛发渲染模型:&b&Kajiya-Kay模型&/b&[4]。计算公式如下:&/p&&img src=&https://www.zhihu.com/equation?tex=diffuse+%3D+K_%7Bd%7D%5Csin%28t%2Ch%29& alt=&diffuse = K_{d}\sin(t,h)& eeimg=&1&&&img src=&https://www.zhihu.com/equation?tex=specular+%3D+K_%7Bs%7D%28%28t%5Ccdot+l%29+%2A%28t%5Ccdot+e%29%2Bsin%28t%2C+l%29+%2Asin%28t%2C+e%29%29& alt=&specular = K_{s}((t\cdot l) *(t\cdot e)+sin(t, l) *sin(t, e))& eeimg=&1&&&p&整个Kajiya-Kay模型首先利用了类似我们在各向异性光照的原理解释时提到的积分公式,然后在BRDF项上,diffuse和specular分别代入了Lambert模型和Phong模型,进一步简化得到了上述结果。&b&在实际实现头发渲染时,我们一般是使用ATI的这个slides[5]提出来的公式&/b&:&/p&&img src=&https://www.zhihu.com/equation?tex=diffuse+%3D+K_%7Bd%7D%2Alerp%280.25%2C+1.0%2C+n%5Ccdot+l%29& alt=&diffuse = K_{d}*lerp(0.25, 1.0, n\cdot l)& eeimg=&1&&&img src=&https://www.zhihu.com/equation?tex=specular+%3D+K_%7Bs1%7D%2Asmoothstep%28-1%2C+0%2C+dot%28t_%7B1%7D%2C+h%29%29%2Asin%28t_%7B1%7D%2C+h%29%5E%7Bp1%7D%2B+K_%7Bs2%7D%2Asmoothstep%28-1%2C+0%2C+dot%28t_%7B2%7D%2C+h%29%29%2Asin%28t_%7B2%7D%2C+h%29%5E%7Bp2%7D& alt=&specular = K_{s1}*smoothstep(-1, 0, dot(t_{1}, h))*sin(t_{1}, h)^{p1}+ K_{s2}*smoothstep(-1, 0, dot(t_{2}, h))*sin(t_{2}, h)^{p2}& eeimg=&1&&&p&具体的实现在slides里面有详细的描述,这里只简单总结一下它相较于原始模型的改进:&/p&&p&(1)把diffuse改成了我们在之前的&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&卡通渲染中提到的wrapped diffuse&/a&,这是因为传统的Kajiya-Kay的diffuse项太亮,没有考虑毛发的自阴影(也就是没有考虑我们一开始说到的&img src=&https://www.zhihu.com/equation?tex=V%28%5Ctheta%29& alt=&V(\theta)& eeimg=&1&&)。&/p&&p&(2)头发的高光项改写成了两层高光,其中一层高光是有颜色的,另外一层高光是没有颜色的,且两层高光的相互错开一点点,这个双层高光的设定是基于实际的观察:&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-e02b24993db6fac2aca90d55b236d3cf_b.jpg& data-rawwidth=&372& data-rawheight=&330& class=&content_image& width=&372&&&/figure&上图可以明显看出两层高光,其中发白的一层是没有颜色的,另外发黄的一层是有颜色的高光,至于为什么会有两层高光,我会在后面的内容里具体做解释,这里可以简单的认为就是基于经验观察。&/p&&p&上面已经说过,双层高光是相互错开的,如果使用同样的切线,那么这两层高光一定会彼此重合,为了防止这种情况发生,我们在计算两层高光时会基于原始的切线方向给予其不同程度的偏移量,这实际上也相当于操作了整个切线场(&b&回忆一下我在第一篇有关卡通渲染技术中提到的风格化的高光,其中一个操作符就是偏移高光的位置,使用的方法就是沿着切线方向去偏移法线,而这里用到的方法非常类似,只是变成了沿着法线方向去偏移切线&/b&),具体方法:&/p&&img src=&https://www.zhihu.com/equation?tex=T_%7Bshifted%7D+%3D+T+%2B+shift+%2A+N& alt=&T_{shifted} = T + shift * N& eeimg=&1&&&p&对于两层高光,shift应该设定为不同的值,但如果对于同一层高光来说,shift是一个固定值就会导致头发高光区域的边缘非常整齐,没有那种锯齿状的感觉。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d31ea0f38c93bb64ee2607_b.jpg& data-rawwidth=&649& data-rawheight=&425& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&https://pic2.zhimg.com/v2-d31ea0f38c93bb64ee2607_r.jpg&&&/figure&&p&如图,很多漫画中角色头发上的高光区域的边缘就有很明显地不规则状锯齿,这也是对现实世界的观察得到的。&/p&&p&因此,我们需要一张&b&切线扰动图(shift texture)&/b&,类似这样:&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-5b75bba2abab07a7b5139e_b.jpg& data-rawwidth=&264& data-rawheight=&264& class=&content_image& width=&264&&&/figure&在此基础上进行扰动:&/p&&img src=&https://www.zhihu.com/equation?tex=shift+%3D+constShift+%2B+%28texture%28shiftTex%2C+uv%29+-+0.5%29& alt=&shift = constShift + (texture(shiftTex, uv) - 0.5)& eeimg=&1&&&br&&p&&b&毛发渲染的排序问题&/b&&/p&&p&我们都知道,毛发这种边缘半透明且双面的材质是不能使用简单的alpha-test来渲染的,因为这样会使得毛发边缘看起来非常的粗糙,所以我们要在尽可能地保证顺序正确的情况下使用alpha-blend,为此,[5]提到了一个比较简单但能够大致保证半透明混合顺序正确的方法:&/p&&p&(1)开启Z-Write ,Z-Test模式为less,剔除背面的三角形,绘制头发完全不透明的部分(使用alpha test的模式,关闭color buffer的写入)&/p&&p&(2)关闭Z-Write,Z-Test模式为equal,剔除背面的三角形,再次绘制完全不透明的部分(仍然使用alpha-test模式,这次写color buffer)&/p&&p&(3)关闭Z-Write,Z-Test模式改less,剔除正面的三角形,先绘制头发的背面(使用alpha blend的模式)&/p&&p&(4)开启Z-Write ,Z-Test模式改less,剔除背面的三角形,绘制头发的正面(使用alpha blend的模式)&/p&&p&这里大致的思路是:先画不透明的头发,然后画背面半透明的,最后画正面半透明的。这样能大致保证一个正确的半透明绘制顺序,对于头发这样的半透明材质基本就够了。KlayGE也用了&a href=&https://link.zhihu.com/?target=http%3A//www.klayge.org//klayge-4-0%25e4%25b8%25addeferred-rendering%25e7%259a%%%25e8%25bf%259b%25ef%25bc%%25b8%2589%25ef%25bc%2589%25ef%25bc%259a%25e9%e6%e7%259a%%%25e6%2581%25bc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&类似的方法&/a&[6]去处理半透明材质的绘制。需要特别说明的是步骤(1)(2)原本是可以合并在一起做的,之所以拆开先写深度,再写颜色,是利用了大部分显卡都有的&b&Early-Z Culling的特性&/b&:显卡的深度比较和剔除会根据情况选择在pixel shader之前执行还是在pixel shader之后执行,一般来说如果在pixel shader里面没有对片元深度进行修改的话,深度比较和剔除就会发生在pixel shader之前,也就是我们说的Early-Z,如果pixel shader里对片元的深度进行了修改,那么深度比较和剔除就必须在pixel shader之后执行,就是所谓的Late-Z。Early-Z的好处是没通过深度测试的片元就不再执行pixel shader了,因此没有特殊情况最好不要在pixel shader里修改片元的深度。&b&除此之外,关闭color buffer的写入只修改z buffer会比同时写入color buffer和z buffer快2-4倍(少写一张RT并且pixel shader不需要执行光照计算,只需要做alpha-test即可),这也是我们常说的使用z-prepass的前向渲染管线的原理&/b&。&/p&&p&基于Kajiya-Kay模型的毛发渲染至今仍然在游戏中大量的使用,它的优点是计算性能也比较好,缺点是整个模型仍然是一个经验公式,并不太符合近年来基于物理渲染的概念,也无法做到能量守恒。&/p&&h2&&b&Marschner’s Model&/b&&/h2&&p&我们上面讨论的Kajiya-Kay Model类似于Phong Model,是一个经验公式,没有太多物理含义在内,只能保证一个大致上的视觉正确,而Marschner's Model则是基于头发纤维的结构,进行了相对准确的物理分析并得出的计算方法。&/p&&p&头发纤维从微观角度来看,实际上是一个从外到内有很多层的结构,它的最外层像鳞片一样(很像我们在微表面理论中看到的那种粗糙的表面),光线在穿过层层头发纤维内部的过程中也会发生折射,反射等,因此我们看到的最终头发呈现的颜色实际上是多条光路综合作用的结果。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-1cdadbecc5b69b8df73fed9b98a040fa_b.jpg& data-rawwidth=&666& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&https://pic4.zhimg.com/v2-1cdadbecc5b69b8df73fed9b98a040fa_r.jpg&&&/figure&在文章[7]中,作者在分析头发渲染时考虑了光照贡献最大的三条光路:&b&R,TT和TRT,其中R表示反射,T则表示透射,和我们在皮肤渲染中使用一样的定义&/b&,那么实际上,我们在Kajiya-Kay模型中定义的两层高光分别代表了R和TRT两条光路,因为后者在纤维中多了两次透射的原因,最终会彼此稍稍错开。并且TRT这条光路在头发纤维中会产生介质的吸收效果,且吸收系数和光照的波普有关,因此在最终反射出来后,会产生有颜色的高光。&/p&&p&基于这个微观模型,作者又进一步根据几何光学分析了光线在某一个光路上的行为,并把这个行为具体的分成了两类,即纵向散射(longitudinal scattering)和方位角散射(azimuthal scattering)。&br&&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-0b8aef12f5_b.jpg& data-rawwidth=&529& data-rawheight=&347& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&https://pic4.zhimg.com/v2-0b8aef12f5_r.jpg&&&/figure&纵向散射是沿着头发生长方向的散射,对于一个光滑的圆柱体来说,给定入射方向,反射方向是确定的,如下图,但是头发纤维的表面是比较粗糙的,因此并不会发生精确的镜面反射,于是我们就需要一个函数来估计在给定的出射方向(观察方向)上,到底有多少比例的光线射出。这个函数和入射、出射方向有关,我们用&img src=&https://www.zhihu.com/equation?tex=M%28%5Ctheta_i%2C+%5Ctheta_r%29& alt=&M(\theta_i, \theta_r)& eeimg=&1&&来表示,可以简单的认为M就是一个高斯分布的概率密度函数。另一方面,方位角散射是表示垂直于发丝方向的散射角度和能量的变化,这期间可能会发生折射和透射,我们也可以用一个函数来估计发生方位角散射时给定出射方向上光线的比例,&b&这个函数除了和入射、出射方向投影在圆柱法平面的方位角有关,还和头发内部的折射率有关&/b&,我们用&img src=&https://www.zhihu.com/equation?tex=N%28%5Cphi_i%2C+%5Cphi_r%2C+n%29& alt=&N(\phi_i, \phi_r, n)& eeimg=&1&&来表示。&/p&&br&&p&&figure&&img src=&https://pic3.zhimg.com/v2-8df9a8acb5f4c228e8514a6aac1e233c_b.jpg& data-rawwidth=&447& data-rawheight=&224& class=&origin_image zh-lightbox-thumb& width=&447& data-original=&https://pic3.zhimg.com/v2-8df9a8acb5f4c228e8514a6aac1e233c_r.jpg&&&/figure&纵向散射的示意图,左图是针对光滑圆柱,右图是针对粗糙圆柱。 &br&&/p&&p&根据刚才的光路分析,我们知道,R,TT和TRT任一一种光路实际上可能既包含了纵向散射,又包含了横向散射,所以可以进一步得出头发上某一点的BSDF:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=S+%3D+%5Csum_%7Bp%7D%5E%7B%7D%7BS_p%7D+& alt=&S = \sum_{p}^{}{S_p} & eeimg=&1&&,&/p&&p&其中&img src=&https://www.zhihu.com/equation?tex=S_p+%3D+M_p%2AN_p%2C+p+%3D+R%2C+TT%2C+TRT& alt=&S_p = M_p*N_p, p = R, TT, TRT& eeimg=&1&&&br&&/p&&p&对于某种头发来说,其折射率是固定的,因此实际上和头发渲染有关的参数只有四个,就是我们上面说到的四个角度,而这四个角度在实时渲染的时候都是能够算出来的,因此我们可以把M和N分别预计算成两张查找表,然后用角度作为参数(实际计算时用角度的正弦或者余弦值代替角度)直接查找得到Mp和Np的值。如果按照正常存储,共需要6张贴图,但我们之前说过,&b&M实际上类似于一个粗糙表面反射的概率分布函数,因此它是和波普无关的单通道的值,而Nr,Ntt,Ntrt中,Nr是单通道的(因为没有发生介质的吸收,只有菲涅尔效果和方位角的概率分布影响),而Ntt和Ntrt则是三通道的&/b&。根据[2]的实现,Mr,Mtt和Mtrt被存进了第一个LUT中,同时假设Ntt=Ntrt,这样Nr和Ntt存在了第二张图里,共计用了两张LUT。而Mp和Np的具体计算可参见原文和&a href=&https://link.zhihu.com/?target=https%3A//hairrendering.wordpress.com/tag/marschner/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这篇文章&/a&[8]。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-53d55f4a1f50dd60ed4da2_b.jpg& data-rawwidth=&520& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&520& data-original=&https://pic2.zhimg.com/v2-53d55f4a1f50dd60ed4da2_r.jpg&&&/figure&&p&在Marschner‘s Model的基础上,后来又有人提出了能量守恒的头发渲染模型[9],其整个光路的分析和BSDF函数的分解思路沿用了Marschner's Model的概念,还是分解成了横向散射和方位角散射,只是它进一步归一化了Mp和Np两个函数,并且加入了TRRT,TRRRT等多次反射的光路。&/p&&h2&&b&眼球的渲染&/b&&/h2&&p&眼球的相关渲染技术我在打算写这篇文章前不久才补习了一下。对于大部分游戏中的角色渲染来说,皮肤和毛发的渲染技术已经足够覆盖用到的场景。当然近年来越来越流行所谓电影化的游戏概念,追求CG级别的过场动画等,因此这方面的渲染也可以单独拿出来分享一下。当然,照例我们还是先简单解释一下整个眼球的解剖学结构:&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-33e57adee311b5d9e0fb95_b.jpg& data-rawwidth=&291& data-rawheight=&291& class=&content_image& width=&291&&&/figure&上图来自于&a href=&https://link.zhihu.com/?target=http%3A//docs.cryengine.com/display/SDKDOC2/Eye%2BShader& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CryEngine有关眼球渲染的文档&/a&[10]。类似于皮肤和毛发,眼球也是一个多层包裹的结构,和渲染关系比较密切的几个结构分别是&b&角膜(cornea)&/b&&b&,瞳孔(pupil)&/b&&b&,虹膜(iris)和巩膜(sclera)&/b&。角膜可以认为是一层玻璃一样的透明薄膜,且比较光滑,我们眼球的那种光泽感就来自于角膜;角膜下面是瞳孔,瞳孔是类似于相机的光圈一样的结构,可以通过控制瞳孔的大小来调节进入眼睛的光线数量,也就是瞳孔收缩或者放大的行为,同时,瞳孔还是一个表面高低不平的半透明的材质,光线在穿过角膜进入瞳孔组织后,会发生类似皮肤一样的次表面散射;虹膜是产生眼球的颜色的结构,我们通常形容一个人的眼睛的颜色,说的就是虹膜的颜色;巩膜则主要贡献了眼白。&/p&&p&根据简单的解剖结构分析,我们就知道要渲染好眼睛,需要着重实现的效果包括了&b&角膜的半透和光泽反射效果&/b&,&b&瞳孔的次表面散射&/b&,&b&瞳孔的收缩和放大(最好是根据整个场景的光照强度来控制)&/b&以及&b&虹膜颜色的变化&/b&。&/p&&br&&b&角膜的半透和光泽反射&/b&&p&这个部分相对来说是比较简单的,但是也最能体现眼球渲染的效果,如果不想实现地太复杂可以只实现这个部分。简单的做法就是直接把角膜看做一个半透明光泽球体的反射,用正常的PBR流程计算其镜面反射和IBL的反射,然后给眼球一张虹膜和眼白的贴图,这张贴图作为角膜下面的折射效果,最后给角膜设定一个混合系数,把光泽球体反射效果和虹膜及眼白贴图上的颜色进行混合。&/p&&p&&b&瞳孔的次表面散射&/b&&/p&&p&如我们前面所说,瞳孔本身实际上也是一个高低不平的结构,这种结构就导致我们在观察人的眼球的时候,是能够看出瞳孔纵深感的,也就是说瞳孔不是直接贴合在角膜上,而是有一定距离,就像我们小时候玩的玻璃球里面的彩色部分一样。同时,当光线到达瞳孔表面的时候,还会进一步在瞳孔结构内部发生次表面散射。文章[11]着重分析实现了这个部分。&br&&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-225b6dcb724eb3fbe67d_b.jpg& data-rawwidth=&336& data-rawheight=&195& class=&content_image& width=&336&&&/figure&文章[11]把眼球看成了一个双层结构,外面一层是角膜,里面一层是瞳孔的表面,而角膜和瞳孔之间我们可以认为是充斥了某种透明液体。光线在进入瞳孔组织的内部前,首先会在角膜的表面发生一次折射,然后进入瞳孔组织的内部,产生散射,最后从瞳孔表面的另一个点散射出来。这里就涉及到了两个问题:(1)一束射到角膜表面的光线在经过折射后,如何计算最终入射到瞳孔表面的位置;(2)光线进入角膜内部后,如何计算其散射效果。&/p&&p&为了解决这两个问题,文章引用了另一个称之为““Subsurface texture mapping”[12]的方法,这个方法旨在解决多层厚度不均匀的材质的次表面散射效果的计算。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-e2bab1d196d04a79fe7218f_b.jpg& data-rawwidth=&535& data-rawheight=&175& class=&origin_image zh-lightbox-thumb& width=&535& data-original=&https://pic3.zhimg.com/v2-e2bab1d196d04a79fe7218f_r.jpg&&&/figure&如上图,每一层材质都有一个单独的深度图,保存在一个通道里,然后每一层单独的材质被认为是均匀的,拥有相同的散射、吸收系数以及相应的相位函数(散射相关的参数)。然后,以视线和第一层材质的交点为起点,沿着视线方向对多层材质进行ray-marching,每行进一步就根据位置和深度图计算当前点位于材质的哪一层,对应什么散射参数,再根据上一步的位置以及光照方向计算散射和吸收,直到ray-marching结束。具体到眼球的散射计算,实际上只有一层散射材质,即瞳孔材质。因此我们只需要提供瞳孔表面的深度图,并设定好瞳孔材质的相关散射参数,再结合[12]的方法计算即可。&/p&&p&[11][12]总体来说没有太多新鲜的内容,主要是结合了我们在游戏中常用的两个技术,即relief mapping(或者parallax mapping)和participating media rendering两个技术,前者就是我们常说的视差贴图,可以通过ray marching的方法结合一张深度图在相对平坦的几何表面上实现视觉正确的高低起伏效果,法线效果虽然也能在平面上产生凹凸起伏,但在比较斜的视角下平面还是平面,视差贴图则不会这样。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-96440c2edd551e17eb10_b.jpg& data-rawwidth=&464& data-rawheight=&696& class=&origin_image zh-lightbox-thumb& width=&464& data-original=&https://pic3.zhimg.com/v2-96440c2edd551e17eb10_r.jpg&&&/figure&而participating media rendering则在近年来广泛地被应用在体积光、云彩和天空相关的渲染技术中,关于散射和介质渲染的内容,我会在今后的文章里再做分享。&/p&&p&&b&瞳孔的收缩以及虹膜的颜色&/b&&/p&&p&这个部分就比较tricky,比如瞳孔的放大和收缩可以通过控制采样瞳孔贴图的UV来实现,虹膜的颜色则可以首先给定一个虹膜纹理的灰度图,然后用给定虹膜颜色乘以灰度颜色,即可得到最终虹膜的颜色,这样可以通过一套资源来实现不同颜色的眼球的渲染。&/p&&p&有关上述几种效果的对比图这里就不贴出来了,感兴趣可以去浏览&a href=&https://link.zhihu.com/?target=http%3A//docs.cryengine.com/display/SDKDOC2/Eye%2BShader& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CRYENGINE的文档&/a&。其中有些对比图的效果差异很小,基本上就像是玩大家来找茬。。。根据上面的渲染方案分析来看,想要实现一套逼真的眼球渲染开销不低,所以一般来说这方面的技术只在一些端游和主机游戏中能够见到,当然像是角膜的半透明和反射的效果,还是可以在手游上跑一跑的。。。&/p&&p&&b&一点补充:&/b&&/p&&p&关于皮肤和眼球的渲染这里还有一篇非常详尽的slides[13],感谢&a href=&https://www.zhihu.com/people/9deabcf084& data-hash=&9deabcf084& class=&member_mention& data-title=&@Rikii& data-editable=&true& data-hovercard=&p$b$9deabcf084&&@Rikii&/a&的补充,其中比较详尽地涵盖了角色渲染领域我们提到过的关键技术中的大部分(&b&次表面散射,皮肤半透和眼球渲染&/b&),而且图文结合大量实际可用的代码,非常值得一读。在眼球渲染方面,[13]除了用到我们这里提到的parallax mapping(&b&不是基于ray-marching而是一个更简单的近似&/b&)外,还包含了有关眼球上的血丝,角膜的折射,全局照明(环境光遮蔽)对眼角的影响以及如何渲染水汪汪的大眼睛(其中部分图片由于过于清晰在观看期间可能引起不适。。。),整个实现充满了各种奇技淫巧。而在皮肤渲染这部分,还提到了我们在上篇文章中没有讲到的环境光对于皮肤半透的贡献(上篇文章我们讲了直接光源对半透皮肤的影响)。这篇slides的作者可以说一直都是真实感角色渲染这个研究领域的先驱,我们在上一篇皮肤渲染的文章中提到的许多技术成果(separable subsurface scattering,real-time realistic skin translucency等)都是他的大作,并且他的&a href=&https://link.zhihu.com/?target=http%3A//www.iryoku.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&个人网站&/a&上也非常慷慨的罗列了他近年来的研究成果和相关文章,其中大部分都是围绕角色渲染这个话题的。感兴趣的朋友还可以关注&a href=&https://link.zhihu.com/?target=https%3A//github.com/iryoku/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&作者的github&/a&,其中有separable SSS的实现代码。&/p&&p&作为总结再附上作者的另外两篇[14][15]文章分享给大家,前一篇也是很有干货的角色渲染技术总结,另外一个是我本来打算在上一篇文章中分享的wrinkle map,简单说就是如何实现动态的皱眉头等皮肤褶皱效果,因为记性不好,经&a href=&https://www.zhihu.com/people/9deabcf084& data-hash=&9deabcf084& class=&member_mention& data-title=&@Rikii& data-hovercard=&p$b$9deabcf084&&@Rikii&/a& 同学提醒才想起来原打算分享的这几篇内容,关于wrinkle map的实现我就偷懒不再展开详细解释了,感兴趣的同学可以去看GPU Pro2上的相关文章。&br&&/p&&h2&&b&总结&/b&&/h2&&p&从这个系列的上一篇开始我依次概述了皮肤、头发和眼球的渲染,基本涵盖了角色渲染的内容,这三者看起来在渲染技术上差别比较大,但也有一个相当重要的共同点:&b&它们作为所谓的有机材质,不同于我们一般渲染的材质,都拥有比较复杂的多层结构。光线作用于这类有机材质时,往往会在多层之间同时发生反射,散射等一系列的现象,&/b&因此针对这类材质的渲染分析也往往会涵盖各种类型的光线路径。我们想要逼真地还原这类材质的真实效果,对相关材质的解剖结构或者微观结构最好有一些简单的了解,这也能让我们更容易地从整体上理解相关算法的原理。&br&&/p&&h2&&b&引用&/b&&/h2&&p&[1] &a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/miloyip/archive//alice_madness_returns_hair.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&爱丽丝的发丝──《爱丽丝惊魂记:疯狂再临》制作点滴&/a&&/p&&p&[2] Hubert Nguyen, William Donnelly. GPU Gems 2, &a href=&https://link.zhihu.com/?target=https%3A//developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter23.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hair Animation and Rendering in the Nalu Demo&/a&&/p&&p&[3] Sarah Tariq, Louis Bavoil. Real-Time Hair Simulation and Rendering on the GPU&br&&/p&&p&[4] J. Kajiya, T. Kay. Rendering fur with three dimensional textures&/p&&p&[5] Thorsten Scheuermann. Game Developer Conference, 2004. Hair Rendering and Shading&/p&&p&[6] &a href=&https://link.zhihu.com/?target=http%3A//www.klayge.org//klayge-4-0%25e4%25b8%25addeferred-rendering%25e7%259a%%%25e8%25bf%259b%25ef%25bc%%25b8%2589%25ef%25bc%2589%25ef%25bc%259a%25e9%e6%e7%259a%%%25e6%2581%25bc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&KlayGE 4.0中Deferred Rendering的改进(三):透明的烦恼&/a&&/p&&p&[7] Stephen R. Marschner, Henrik Wann Jensen, etc. Light Scattering from Human Hair Fibers &/p&&p&[8] &a href=&https://link.zhihu.com/?target=https%3A//hairrendering.wordpress.com/tag/marschner/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Marschner | Real - Time Hair Simulation and Rendering &/a&&/p&&p&[9] Eugene d’Eon, Guillaume Francois, etc. Eurographics Symposium on Rendering 2011. An Energy-Conserving Hair Reflectance Model &/p&&p&[10] &a href=&https://link.zhihu.com/?target=http%3A//docs.cryengine.com/display/SDKDOC2/Eye%2BShader& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Eye Shader - CRYENGINE Manual - Documentation&/a&&/p&&p&[11] Guillaume Fran?ois, Pascal Gautron, Gaspard Breton, Kadi Bouatouch. Anatomically Accurate Modeling and Rendering of
the Human Eye&/p&&p&[12] Guillaume Fran,cois, Sumanta Pattanaik, etc. Subsurface Texture Mapping&/p&&p&[13] Jorge Jimenez, etc. Advances in Real-time Rendering in Game Course. Separable
Subsurface Scattering and Photorealistic
Eyes Rendering.&/p&&p&[14] Jorge Jimenez, Javier von der Pahlen. Next-Generation Character Rendering&/p&&p&[15] Jorge Jimenez, Jose I. Echevarria. GPU Pro2. &a href=&https://link.zhihu.com/?target=http%3A//www.iryoku.com/wrinkles/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Practical and Realistic Facial Wrinkles Animation&/a&&/p&
前言这是关于角色渲染技术的第二篇,应该也是这个话题的最后一篇。前一篇关于皮肤的渲染方法。实际上为了逼真地还原一个角色,除了渲染技术外,在很多游戏中还使用了动画、物理仿真等其他方面的技术,这些技术也非常重要。譬如今年的《地平线:零之…
&p&在Shader中会使用各种不同图参与渲染,所以简单地总结下各种图的渲染原理、制作方法,最后面几种是程序生成图。&/p&
Albedo&/p&
Diffuse(Photographic)&/p&
&figure&&img data-rawwidth=&731& data-rawheight=&518& src=&https://pic3.zhimg.com/v2-2ab448bf1aafb5f77c96d9d_b.jpg& class=&origin_image zh-lightbox-thumb& width=&731& data-original=&https://pic3.zhimg.com/v2-2ab448bf1aafb5f77c96d9d_r.jpg&&&/figure&&br&&p&从上图可以看出来,Albedo是去掉Diffuse的光照和阴影生成的,而在pbr工作流下必须要用Albedo。转换方法:&a href=&https://link.zhihu.com/?target=https%3A//www.youtube.com/watch%3Fv%3DKKQZN3eoKUo%26list%3DUUfyvlGW2gDNh5YH6CFh7BtQ& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How
to Make an Albedo Texture from a Diffuse Texture&/a&&/p&
Alpha Map&/p&
&p&注意:jpg没有alpha通道,png也没有alpha通道,显示的alpha是根据rgb计算的灰度作为alpha使用。另外安卓平台ETC1也没有alpha通道。&/p&
Bump Map&/p&
Height Map&/p&
&p&基于高度的潮湿地面&/p&&figure&&img data-rawwidth=&721& data-rawheight=&388& src=&https://pic3.zhimg.com/v2-8093ccef2cf1c50b262357b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&721& data-original=&https://pic3.zhimg.com/v2-8093ccef2cf1c50b262357b_r.jpg&&&/figure&&br&&p&6.
Normal Map&/p&
&p&Bump Map是凹凸贴图,常用的有两种:一种是Emboss Bump Map(浮雕凹凸贴图,使用的Height Map),另一种是Dot3 Bump Map(点乘凹凸贴图,使用的是Normal Map)&/p&
Mask Map&/p&
&p&Mask用途比较多,常用来标识不同物体,比如标识建筑上反光的窗户、地面的积水、皮肤上汗水等。&/p&&figure&&img data-rawwidth=&716& data-rawheight=&241& src=&https://pic3.zhimg.com/v2-ec1b51ce8061df26fdbc91_b.jpg& class=&origin_image zh-lightbox-thumb& width=&716& data-original=&https://pic3.zhimg.com/v2-ec1b51ce8061df26fdbc91_r.jpg&&&/figure&&br&&p&8.
Light Map(&a href=&https://link.zhihu.com/?target=https%3A//www.imgtec.com/blog/powervr-gr6500-ray-tracing/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图来源&/a&)&/p&
&figure&&img data-rawwidth=&545& data-rawheight=&352& src=&https://pic1.zhimg.com/v2-92a7b8ea634bfb03c8c87_b.jpg& class=&origin_image zh-lightbox-thumb& width=&545& data-original=&https://pic1.zhimg.com/v2-92a7b8ea634bfb03c8c87_r.jpg&&&/figure&&br&&p&9.
&p&Lut(查找表lookup table)可以用于优化复杂光照的渲染,比如lambert blinn-phong可以把(NL,NH)作为uv坐标,将光照计算存储在一张贴图中,这样渲染时复杂的计算过程就优化为纹理采样了。另外皮肤、毛发之类复杂计算都可以用此方法优化。&/p&
Emission Map&/p&
&figure&&img data-rawwidth=&636& data-rawheight=&327& src=&https://pic2.zhimg.com/v2-4ca95ad00c9cf415efc4486_b.jpg& class=&origin_image zh-lightbox-thumb& width=&636& data-original=&https://pic2.zhimg.com/v2-4ca95ad00c9cf415efc4486_r.jpg&&&/figure&&p&如果要表现更好的效果,自发光还要配合HDR/ToneMap/Bloom。&/p&
Metallic Map/Roughness&/p&
Specular Map/ Smoothness&/p&
&figure&&img data-rawwidth=&729& data-rawheight=&619& src=&https://pic3.zhimg.com/v2-6bb7e2df2da4fd9aabe6_b.jpg& class=&origin_image zh-lightbox-thumb& width=&729& data-original=&https://pic3.zhimg.com/v2-6bb7e2df2da4fd9aabe6_r.jpg&&&/figure&&br&&a href=&https://link.zhihu.com/?target=https%3A//mail.qq.com/cgi-bin/frame_html%3Fsid%3DDqT4m2nuUaCTW0Yf%26r%3Dbaa48bcc49b2ae3f1ee527& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图来源&/a&
&p&高光工作流可以不受限于PBR,能做非真实渲染,而金属工作流则对入门者更友好,限制在物理渲染的框架中,不至于渲染的太糟,当然金属工作流也可以做风格化的渲染。如果是用Substance Painter或者Marmoset Toolbag制作,这两种方式都支持导出的。&/p&
Gloss Map&/p&
Smothness Map&/p&
Roughness Map&/p&
&p&光泽贴图和高光贴图是不同的,它类似平滑贴图/粗糙贴图,表示物体表面的平滑粗糙程度,而高光贴图存储的是高光的强度,金属贴图存储的是金属度。&/p&
pbr(sbsar)&/p&
&figure&&img data-rawwidth=&760& data-rawheight=&389& src=&https://pic2.zhimg.com/v2-d27eadd735bbf18b1a44b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&760& data-original=&https://pic2.zhimg.com/v2-d27eadd735bbf18b1a44b_r.jpg&&&/figure&&p&17.
Ramp Map&/p&
&p&Ramp Map常用于卡通渲染,可以用于手工调节漫反、高光、阴影等,但是这比较依赖美术画图的功力,道理简单,渲染的好看却不容易。&/p&
&p&图来自米哈游的技术解说&a href=&https://link.zhihu.com/?target=https%3A//www.myzaker.com/article/59169dfe1bc8e0ca/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&米哈游极乐净土的卡通渲染&/a&&/p&&figure&&img data-rawwidth=&769& data-rawheight=&522& src=&https://pic2.zhimg.com/v2-a7cf9f4fe327ab8beeda673_b.jpg& class=&origin_image zh-lightbox-thumb& width=&769& data-original=&https://pic2.zhimg.com/v2-a7cf9f4fe327ab8beeda673_r.jpg&&&/figure&&br&&p&18.
Detail Map(Albedo Emission
Specular Normal 等)&/p&
&p&Detail Map主要解决相机靠近模型时贴图精度不足的问题,比如地面、皮肤、树木等等靠近看会很模糊,用一张尺度更小的坑坑洼洼的图来增加细节。左上是模糊的地面,右上是细节图,最下面是增加细节后的地面。&/p&&figure&&img data-rawwidth=&693& data-rawheight=&621& src=&https://pic3.zhimg.com/v2-50dd757aabbe35798a0cab5f0798ff24_b.jpg& class=&origin_image zh-lightbox-thumb& width=&693& data-original=&https://pic3.zhimg.com/v2-50dd757aabbe35798a0cab5f0798ff24_r.jpg&&&/figure&&br&&p&19.
Gradient Map(用于Color
Gradient颜色分级、颜色校正等)&/p&
&figure&&img data-rawwidth=&519& data-rawheight=&369& src=&https://pic2.zhimg.com/v2-01cd8cfe86c0_b.jpg& class=&origin_image zh-lightbox-thumb& width=&519& data-original=&https://pic2.zhimg.com/v2-01cd8cfe86c0_r.jpg&&&/figure&&p&20.
Jitter Map/Sparke Map/Glitter
&p&这种闪烁的噪点主要用于沙子、雪等渲染,主要用于表现颗粒感。这可以用噪声图来用于渲染,也可以用函数生成,一般类似frac(a*sin+b)这样形式,可以搭配WorldPos、ViewPos、Time来组合成函数。&/p&&figure&&img data-rawwidth=&772& data-rawheight=&431& src=&https://pic2.zhimg.com/v2-b1ad96c927a_b.jpg& class=&origin_image zh-lightbox-thumb& width=&772& data-original=&https://pic2.zhimg.com/v2-b1ad96c927a_r.jpg&&&/figure&&br&&p&21.
Noise Map&/p&
&p&Noise有很多种:白噪声、蓝噪声、perlin噪声、simplex噪声、Voronoi噪声。另外推荐个噪声图编辑器:&a href=&https://link.zhihu.com/?target=http%3A//catlikecoding.com/numberflow/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&numberflow&/a&&/p&&figure&&img data-rawwidth=&646& data-rawheight=&354& src=&https://pic4.zhimg.com/v2-f7f68a521e4cff3ddcf5a15_b.jpg& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&https://pic4.zhimg.com/v2-f7f68a521e4cff3ddcf5a15_r.jpg&&&/figure&&br&&p&22.
Splatting Map&/p&
&p&最常用于地形渲染,单独一张control texture作为多层贴图的混合系数,既可以用于颜色混合,也可以用于法线混合。&/p&
&figure&&img data-rawwidth=&769& data-rawheight=&532& src=&https://pic3.zhimg.com/v2-7d5e8df6fa91ce2a60ec086ebc1fbd05_b.jpg& class=&origin_image zh-lightbox-thumb& width=&769& data-original=&https://pic3.zhimg.com/v2-7d5e8df6fa91ce2a60ec086ebc1fbd05_r.jpg&&&/figure&&br&&p&23.
Lens Map(Rain/Snow/Freeze/Glare/Flare/Flash/Gleam/starburst)&/p&
&p&做镜头效果会需要很多类似雨滴、雪花、脏迹、冰冻、炫光、星星等贴图。比如下面镜头雨滴。&/p&&figure&&img data-rawwidth=&679& data-rawheight=&784& src=&https://pic3.zhimg.com/v2-981bbaac_b.jpg& class=&origin_image zh-lightbox-thumb& width=&679& data-original=&https://pic3.zhimg.com/v2-981bbaac_r.jpg&&&/figure&&p&24.
CubeMap&/p&
&p&Arm公司做的Ice Cave把CubeMap用在反射、折射、阴影,效果很赞(&a href=&https://link.zhihu.com/?target=http%3A//malideveloper.arm.com/downloads/ARM_Game_Developer_Days/LondonDec15/presentations/IceCave_Rendering_Techniques_Optimized_For_Mobile.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ice
cave&/a&)&/p&&figure&&img data-rawwidth=&770& data-rawheight=&429& src=&https://pic3.zhimg.com/v2-020bfca59a8ee7a24bbe3fd_b.jpg& class=&origin_image zh-lightbox-thumb& width=&770& data-original=&https://pic3.zhimg.com/v2-020bfca59a8ee7a24bbe3fd_r.jpg&&&/figure&&br&&p&25.
MatCap Map&/p&
&p&Matcap的原理将法线转换view坐标系,取XY作为UV采样一张贴图,原理如下图&/p&&figure&&img data-rawwidth=&772& data-rawheight=&453& src=&https://pic3.zhimg.com/v2-5d3e9fd060c7c18bdfeb6_b.jpg& class=&origin_image zh-lightbox-thumb& width=&772& data-original=&https://pic3.zhimg.com/v2-5d3e9fd060c7c18bdfeb6_r.jpg&&&/figure&&br&&p&对于场景色调比较统一、不要求精准光照的情况,这是种运行效率非常高的渲染方式。
&/p&&figure&&img data-rawwidth=&770& data-rawheight=&494& src=&https://pic3.zhimg.com/v2-8fe390cbf918_b.jpg& class=&origin_image zh-lightbox-thumb& width=&770& data-original=&https://pic3.zhimg.com/v2-8fe390cbf918_r.jpg&&&/figure&&br&&p&26.
3D Texture&/p&
&p&3d纹理最常用于体渲染,比如云、高度雾等。Unity不支持3d纹理的文件格式,但是支持动态创建Texture3D,这样可以自己保存为asset格式或者自定义格式,在运行时转换为Texture3D。因为体渲染比较常用的方式是raymatching,步进次数少效果很难表现出来,在移动端效率比较低。图来&b&HorizonZeroDawn&/b&&/p&&figure&&img data-rawwidth=&769& data-rawheight=&263& src=&https://pic3.zhimg.com/v2-e58efc350dd818d9f33824_b.jpg& class=&origin_image zh-lightbox-thumb& width=&769& data-original=&https://pic3.zhimg.com/v2-e58efc350dd818d9f33824_r.jpg&&&/figure&&br&&p&27.
Translucency Map(Thickness Map、反向AO、单散射)&/p&
&p&主要用于半透明物体,比如阔叶植被、玉等&/p&&figure&&img data-rawwidth=&711& data-rawheight=&486& src=&https://pic2.zhimg.com/v2-d88fabff292c2_b.jpg& class=&origin_image zh-lightbox-thumb& width=&711& data-original=&https://pic2.zhimg.com/v2-d88fabff292c2_r.jpg&&&/figure&&br&&p&28.
Ambient Occlusion Map&/p&
&p&AO的计算方法是从顶点的半球发出射线,检测射线是否与网格相交,下图的遮挡值是5/7。&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/twjcnblog/p/3753856.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图来源&/a&&/p&&figure&&img data-rawwidth=&436& data-rawheight=&341& src=&https://pic2.zhimg.com/v2-1511cb24bffef9b42d604de95fc458db_b.jpg& class=&origin_image zh-lightbox-thumb& width=&436& data-original=&https://pic2.zhimg.com/v2-1511cb24bffef9b42d604de95fc458db_r.jpg&&&/figure&&br&&p&因为AO图噪点较多,即使增加射线的数量效果也不是很好,而体遮挡法能很好解决这个问题。AO如果作为后处理的话,SSVO、SSDO是比较流行的方法。&/p&&figure&&img data-rawwidth=&732& data-rawheight=&272& src=&https://pic2.zhimg.com/v2-9ce92e7568ffc6dec398_b.jpg& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&https://pic2.zhimg.com/v2-9ce92e7568ffc6dec398_r.jpg&&&/figure&&br&&p&29.
DUDV Map&/p&
&p&DuDv图看上去像蚯蚓爬过的法线图,一般用RG两个通道存储数据,是根据法线求导后再模糊处理存储的数据,类似与Parallax Map的用途,它也用于扭曲,比如下图用于扭曲水面倒影。&a href=&https://link.zhihu.com/?target=http%3A//wiki.polycount.com/wiki/DuDv_map& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图来源&/a&&/p&&figure&&img data-rawwidth=&766& data-rawheight=&212& src=&https://pic1.zhimg.com/v2-52da2db06b9af438470ae_b.jpg& class=&origin_image zh-lightbox-thumb& width=&766& data-original=&https://pic1.zhimg.com/v2-52da2db06b9af438470ae_r.jpg&&&/figure&&br&&p&30.
Flow Map&/p&
&p&Flow map存储的是向量场数据,可以用于控制水面UV,比如下图石头周围一圈一圈水纹,制作工具有很多,比如&a href=&https://link.zhihu.com/?target=http%3A//polycount.com/discussion/105399/flowmap-painter& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&flowmap制作工具&/a&&/p&&figure&&img data-rawwidth=&666& data-rawheight=&292& src=&https://pic1.zhimg.com/v2-876652fcd20dcd_b.jpg& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&https://pic1.zhimg.com/v2-876652fcd20dcd_r.jpg&&&/figure&&br&&p&31.
Ripple Map&/p&
&p&常用于雨滴水纹、物体落入水中的水纹等,可以算是flowmap的一种。&/p&&figure&&img data-rawwidth=&560& data-rawheight=&170& src=&https://pic2.zhimg.com/v2-135e70ad77b389e535edd80c930d3049_b.jpg& class=&origin_image zh-lightbox-thumb& width=&560& data-original=&https://pic2.zhimg.com/v2-135e70ad77b389e535edd80c930d3049_r.jpg&&&/figure&&br&&p&32.
Distort Map&/p&
&p&扭曲图比较常用于半透物体,用于扭曲背景。比如下图冰块。&/p&&figure&&img data-rawwidth=&570& data-rawheight=&405& src=&https://pic1.zhimg.com/v2-c16ee11ddb9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&https://pic1.zhimg.com/v2-c16ee11ddb9_r.jpg&&&/figure&&br&&p&33.
Displacement Map&/p&
Vector Displacement Map&/p&
&p&这两种图常用镶嵌,不过Displacement Map相当于高度图,而Vector Displacement Map存储的是三维向量,可以更好地细分模型。比如用地面蘑菇、地衣、耳朵等。&/p&&figure&&img data-rawwidth=&771& data-rawheight=&413& src=&https://pic4.zhimg.com/v2-33dd0fceac4a7cd_b.jpg& class=&origin_image zh-lightbox-thumb& width=&771& data-original=&https://pic4.zhimg.com/v2-33dd0fceac4a7cd_r.jpg&&&/figure&&br&&p&35.
Radiosity Normal Map&/p&
&p&半条命首先引入的光照贴图方式,具体参考:&a href=&https://link.zhihu.com/?target=http%3A//www.decew.net/OSS/References/D3DTutorial10_Half-Life2_Shading.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Radiosity
Normal Map&/a&,另外抵抗:人类陨落也有使用这种方法:&a href=&https://link.zhihu.com/?target=http%3A//www.cybergooch.com/tutorials/pages/lighting_rfom1.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&抵抗中的光照&/a&&/p&
&figure&&img data-rawwidth=&708& data-rawheight=&537& src=&https://pic2.zhimg.com/v2-e70bcfc2bd5a53b71c8d6e9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&708& data-original=&https://pic2.zhimg.com/v2-e70bcfc2bd5a53b71c8d6e9_r.jpg&&&/figure&&p&36.
Cavity Map&/p&
&p&缝隙图存储的是比普通AO更小的AO信息,主要用于表现裂缝。制作方法参考:&a href=&https://link.zhihu.com/?target=http%3A//polycount.com/discussion/72813& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&缝隙图笔记&/a&&/p&
&figure&&img data-rawwidth=&576& data-rawheight=&276& src=&https://pic1.zhimg.com/v2-c78d817e7f1ae8a35aae572b8ec45df4_b.jpg& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&https://pic1.zhimg.com/v2-c78d817e7f1ae8a35aae572b8ec45df4_r.jpg&&&/figure&&p&37.
Curvature Map&/p&
&p&曲率图和缝隙图不同的是它主要用于表现边缘、凹凸等效果,用于耳朵、眉骨、鼻子渲染效果会很好,利用DDX/DDY或fwidth也可以动态计算曲率。&/p&&figure&&img data-rawwidth=&273& data-rawheight=&250& src=&https://pic4.zhimg.com/v2-728a50436f1eacbaa62d0_b.jpg& class=&content_image& width=&273&&&/figure&&br&&p&38.
Anisotropic Map&/p&
&p&有些物体的光照会呈现各向异性,比如头发、金属等,下图是三种头发渲染的方式(环形、kajiya、Scheuermann)都用到各向异性的贴图用于高光偏移。&/p&
&figure&&img data-rawwidth=&769& data-rawheight=&503& src=&https://pic2.zhimg.com/v2-6a4bdb3b17d682bc53b0ecf_b.jpg& class=&origin_image zh-lightbox-thumb& width=&769& data-original=&https://pic2.zhimg.com/v2-6a4bdb3b17d682bc53b0ecf_r.jpg&&&/figure&&p&39.
Derivative Map&/p&
&p&这是由顽皮狗大神&a href=&https://link.zhihu.com/?target=http%3A//mmikkelsen3d.blogspot.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Morten Mikkelsen&/a&首先提出法线图的衍生方式(&a href=&https://link.zhihu.com/?target=http%3A//jbit.net/%7Esparky/sfgrad_bump/mm_sfgrad_bump.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bump Mapping Unparametrized
Surfaces on the GPU&/a&),因为用法线图一般在切线空间用于光照计算,而这种方法则不需要切线空间的参与,效率和效果都会更好,不用法线图,而是表面梯度图,和高度梯度图是不同的。不过这文章读起来挺心累的,最好参考Jim Blinn大神的&a href=&https://link.zhihu.com/?target=http%3A//research.microsoft.com/pubs/7-blinn.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&凹凸贴图原理&/a&。&/p&&figure&&img data-rawwidth=&713& data-rawheight=&580& src=&https://pic2.zhimg.com/v2-fb361ec18_b.jpg& class=&origin_image zh-lightbox-thumb& width=&713& data-original=&https://pic2.zhimg.com/v2-fb361ec18_r.jpg&&&/figure&&br&&p&40.
Foam Map&/p&
&p&泡沫贴图、浪花贴图用于水面超过一定值时泡沫会和水面颜色混合,水面顶点越高泡沫透明度越大。&/p&&figure&&img data-rawwidth=&418& data-rawheight=&216& src=&https://pic4.zhimg.com/v2-6adf4cdfa4ebd538ec78b3e5_b.jpg& class=&content_image& width=&418&&&/figure&&br&&a href=&https://link.zhihu.com/?target=http%3A//sundog-soft.com/features/ocean-and-water-rendering-with-triton/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图来源&/a&
Caustics Map&/p&
&p&水纹贴图:因为水面起伏、焦散导致水底某些地方会比周围更亮,可以用Projector渲染水纹,也可以参考GPU Gems的反向计算折射光线来采样太阳环境图的方法&a href=&https://link.zhihu.com/?target=http%3A//developer.download.nvidia.com/books/HTML/gpugems/gpugems_ch02.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(Rendering Water Caustics)&/a&,还有一个制作水纹的工具&a href=&https://link.zhihu.com/?target=https%3A//www.dualheights.se/caustics/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(水纹生成器+Unity
Demo)&/a&&/p&&figure&&img data-rawwidth=&736& data-rawheight=&367& src=&https://pic1.zhimg.com/v2-8e0c478babbcab1b39bd3_b.jpg& class=&origin_image zh-lightbox-thumb& width=&736& data-original=&https://pic1.zhimg.com/v2-8e0c478babbcab1b39bd3_r.jpg&&&/figure&42.Bent Normal Map (经大神&a href=&https://www.zhihu.com/people/wang-teng-hao& class=&internal&&王滕昊&/a&提醒补充加上)&p&Bent Normal 常用于离线AO渲染中,是对原始法线修改后的向量,考虑周围遮挡情况使其指向光线传入的主方向,如下图Bend Normal 比原始法线偏右。用于光照计算或者环境光采样用Bend Normal在模型边缘处会得到更好的AO和光照效果。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0ec60b580acd4ec3ecaad0dc8e983c4f_b.jpg& data-rawwidth=&481& data-rawheight=&236& class=&origin_image zh-lightbox-thumb& width=&481& data-original=&https://pic4.zhimg.com/v2-0ec60b580acd4ec3ecaad0dc8e983c4f_r.jpg&&&/figure&&br&&p&43.
Depth Map&/p&
Camera Depth Map&/p&
Camera Depth Normal Map&/p&
&p&相机深度图可以用于渲染水、雾、扫描、半透物体等,这里有个不错文章有关深度法线图的:&a href=&https://link.zhihu.com/?target=http%3A//williamchyr.com/2013/11/unity-shaders-depth-and-normal-textures/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度与法线图&/a&&/p&&figure&&img data-rawwidth=&694& data-rawheight=&425& src=&https://pic1.zhimg.com/v2-8ca53beb1bb_b.jpg& class=&origin_image zh-lightbox-thumb& width=&694& data-original=&https://pic1.zhimg.com/v2-8ca53beb1bb_r.jpg&&&/figure&&br&&p&46.
Grab Pass Texture&/p&
&p&GrabPass可以用于热浪扭曲、半透冰块、冲击波等需要背景用于渲染的情况,在移动端效率不高,不要求动态背景时可以用Cubemap来代替。&/p&&figure&&img data-rawwidth=&470& data-rawheight=&776& src=&https://pic3.zhimg.com/v2-5cabfb047a18a579100dfc_b.jpg& class=&origin_image zh-lightbox-thumb& width=&470& data-original=&https://pic3.zhimg.com/v2-5cabfb047a18a579100dfc_r.jpg&&&/figure&&br&&p&47.
Vertex Texture Fetch&/p&
&p&在Vertex Shader中读取上一帧水面高度纹理,在当前帧继续波动,这可以用于交互式水渲染,不过顶点纹理拾取是比较耗费资源的操作,不需要交互的水面是用不到的,对于海战类型的游戏会比较有用。&/p&&figure&&img data-rawwidth=&418& data-rawheight=&230& src=&https://pic3.zhimg.com/v2-6dd6b2fb6f_b.jpg& class=&content_image& width=&418&&&/figure&
在Shader中会使用各种不同图参与渲染,所以简单地总结下各种图的渲染原理、制作方法,最后面几种是程序生成图。
Diffuse(Photographic)
从上图可以看出来,Albedo是去掉Diffuse的光照和阴影生成的,而在pbr工作流下必须要用Albedo。转换…
&blockquote&电子游戏的画面是游戏对玩家产生艺术表现力的一种形式,而图像技术则是艺术表达的载体。&/blockquote&- Xylitogum&br&&br&====================================================================&br&&b&&u&前言&/u&&/b&&br&&br&评测3D游戏的画质,其实多数时候指的是评测3D游戏最高配置下的表现力,也有时候指常规配置下依旧能展现出的表现力。后者俗称优化,对于玩家的游戏体验这个环节而言也是不可忽视的。&br&&br&市面上大多数以画质作为卖点之一的游戏大作,都是写实风格的。而通过GPU的运算指令排列组合出足以乱真的画面效果,是非常有技术含量的。因此,评测这类游戏的画质,&b&既要从其运用的图像技术入手,也不能忽视技术所造成的最终表现效果&/b&。&br&&br&一个游戏将模型和贴图等资源转化为画面,需要经过几个步骤:&br&&br&模型顶点及uvmap -& 贴图及材质 -& shader计算光照法线与阴影 -& 滤镜 -& 画面&br&&br&上述的过程很大程度上是由显卡处理的。而转化成画面后,还要经过显示器到眼的过程。而后者这个过程是符合木桶原理的,即画面最终效果会被显示器和人眼瓶颈所限制。就好比我在本文的插图所显示的模型,即使模型精细度再高,如果图像本身像素少,也是无法完全展现出来的。因此,如果要测试出最高质量的画面效果,先要保证两点:&br&&br&&b&1. 硬件配置(显卡,显示器等)足够。&/b&&br&&b&2. 测试者的视觉无明显缺陷。&/b&&br&&br&接下来测试者可以从上述环节逐一评测游戏的画面技术和质量。&br&&br&====================================================================&br&&b&&u&模型质量&/u&&/b&&br&&br&模型顶点的密度,也就是模型的多边形面的密度,能够直接决定模型的质量。早期3D游戏的模型普遍都是明显的简易多边形,究其原因便是顶点密度低,也没有法线贴图来进行校正,因此模型看着棱角感十足。抓一个2002年出品的魔兽3里希尔瓦纳斯女王的模型作为例子:&br&&figure&&img src=&https://pic3.zhimg.com/50/ebfa9abefa2_b.jpg& data-rawwidth=&803& data-rawheight=&695& class=&origin_image zh-lightbox-thumb& width=&803& data-original=&https://pic3.zhimg.com/50/ebfa9abefa2_r.jpg&&&/figure&可以明显的看到低面的影响,尤其是鞋子,直接就是个三角的形状。现今的游戏,不仅模型的顶点密度有提升,更采用了法线贴图的技术来降低多边形面拟合所带来的精度缺失,基本已经把棱角感降低到了最低。&br&&figure&&img src=&https://pic2.zhimg.com/50/b5cffd4bd9_b.jpg& data-rawwidth=&297& data-rawheight=&213& class=&content_image& width=&297&&&/figure&关于法线贴图(Normal Mapping),其实是属于渲染的部分,值得一提的是它对低面模型也有着很好的精细化作用,从上图可以看出低面可以通过法线贴图获得更多的信息,从而在不增加顶点的情况下提升精细度。&br&&br&对游戏画质的评测也自然包含了不同配置下模型棱角感分别是否明显,这点做的好的其实不容易被玩家察觉,但做的不好很容易被看出来。&br&&br&====================================================================&br&&b&&u&纹理贴图&/u&&/b&&br&&br&如果说模型顶点是骨架,纹理贴图(Texture)就是蒙上的皮,世间万物都因这层皮,而有了不同色彩所组合成的细节。那么贴图的质量,自然也对游戏画质的影响,起到举足轻重的作用。&br&&br&贴图的质量上限,取决于游戏美工所制作的美术资源,而实际表现效果,还取决于它显示了多少。同顶点不同的是,无损贴图对空间的占用很大,而且更容易压缩。贴图经过有损压缩后能压成相对小很多的文件,节约本地存储空间的同时加快加载速度,当然代价就是贴图的细节会变的模糊。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/8ff6feb15aea17b9b0add7a_b.jpg& data-rawwidth=&614& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&https://pic4.zhimg.com/50/8ff6feb15aea17b9b0add7a_r.jpg&&&/figure&上图是战地3不同贴图质量下的效果(图来自&a href=&//link.zhihu.com/?target=http%3A//www.bit-tech.net/hardware//battlefield-3-technical-analysis/1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Battlefield 3 Performance Analysis&/a&)。可以看到低质量时基本是一团浆糊,文字勉强才能阅读;中等质量时细节基本能够分辨清楚,但局部依旧有模糊感;高质量时贴图的颜色和细节完全展现出来,几乎没有细节丢失。&br&&br&许多游戏会运用mipmapping技术来动态加载已经过预处理的不同质量的贴图,以应对近景和远景的不同需求。在游戏里的区别就是远景放大后的细节与抗锯齿的变化。如果玩家留心的话,可能可以观察到mipmapping的断层,即物体在离镜头某一特定距离发生的贴图质量变化。&br&(图来自&a href=&//link.zhihu.com/?target=http%3A//krpano.com/forum/wbb/index.php%3Fpage%3DThread%26postID%3D45020& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&krpano.com/forum/wbb/in&/span&&span class=&invisible&&dex.php?page=Thread&postID=45020&/span&&span class=&ellipsis&&&/span&&/a&)&br&&figure&&img src=&https://pic3.zhimg.com/50/415ac2fc4c_b.jpg& data-rawwidth=&900& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic3.zhimg.com/50/415ac2fc4c_r.jpg&&&/figure&&br&需要抗锯齿的不仅是贴图,还有模型的边缘部分。通常游戏抗锯齿的做法是多重采样,只对多边形边缘模糊化。辨别画面抗锯齿质量只需要靠近靠近再靠近就行了,我说的是你的眼睛,离屏幕近一点(不要太久),观察边缘像素是否有模糊处理。&br&&br&至于UVMAP,通俗地说就好比是骨架上怎么蒙皮的规划图,不是什么特别有技术含量的东西,但做的不好会导致同一副贴图在同一模型的不同面上出现精细程度的不同,也是可以留心的一部分。&br&&br&要评测贴图质量的上限,在不受硬件限制的前提下,一个方式是让游戏显示最高质量的贴图,然后凑近观察贴图细节的模糊感是否依旧存在。当然如果你能拆游戏资源包,直接打开贴图源文件看分辨率大小也是一个办法。&br&&br&====================================================================&br&&b&&u&光照渲染-反射与菲涅尔效果&/u&&/b&&br&&br&上帝说要有光,于是便有了光。游戏开发者说要有光,于是便有了光源和shader。我们不知道上帝对光线的运算是怎么进行的,但游戏开发者清楚的是,虚拟世界的光照可能是拟合难度最高,最复杂以及最消耗性能的一个部分了。&br&&br&Shader(着色器)在图形处理中的职能是逐像素由GPU处理光线明暗等效果在原贴图像素基础上的渲染。因此的shader的质量直接决定图像的质量,而且不像模型面密度和贴图分辨率那样容易量化,简单的shader有时也能带来出色的效果,而另一面考虑的因素越多,shader也会越复杂越吃性能。大名鼎鼎的卡马克平方根倒数速算法便常被运用于提升这部分图形处理的性能。&br&&br&Phong shading可能是业内最有名的着色法之一,许多shader便是基于Phong shading的基础上研究和添加的。许多早期的3D游戏便是采用Phong Shading来区别制作粗糙或光滑的表面的光照明暗。&br&&figure&&img src=&https://pic4.zhimg.com/50/9545bafafa6fea960ec3e2_b.jpg& data-rawwidth=&655& data-rawheight=&182& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&https://pic4.zhimg.com/50/9545bafafa6fea960ec3e2_r.jpg&&&/figure&如图,它把单光源的局部光照效果拆成底光(Ambient),漫反射(Diffuse)和镜面效果(Specular)。在游戏中,调整这三个数值的比例,便可以使某个物体表面在光照下体现出粗糙或光滑的程度。Phong shading的问题在于质感单一,虚拟感强,如今的游戏已经不满足于单单用三个值表现出表面的光照材质,而更倾向于用物理质感更丰富的Physical Based Rendering(PBR物理渲染技术)来制作Shader。&br&&figure&&img src=&https://pic3.zhimg.com/50/8d3f0ae71f22b728fd4c5_b.jpg& data-rawwidth=&720& data-rawheight=&373& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic3.zhimg.com/50/8d3f0ae71f22b728fd4c5_r.jpg&&&/figure&如图,PBR下不同材质的物体展现出的光照质感也各有区别,更加贴近现实,也带来了画质的提升。PBR理论认为漫反射(Diffuse)和镜面效果(Specular)是互斥的,而Phong Shader并不能很好的解读这一点,因此需要把两个值做成单维效果,轴的一端是粗糙的漫反射表面,另一端则是光滑的镜面反射表面。&br&&br&&figure&&img src=&https://pic4.zhimg.com/50/153ddeddf45dbdbee09e39_b.jpg& data-rawwidth=&680& data-rawheight=&201& class=&origin_image zh-lightbox-thumb& width=&680& data-original=&https://pic4.zhimg.com/50/153ddeddf45dbdbee09e39_r.jpg&&&/figure&由于非金属一类往往反射率通常较低,而金属的反射率都比较高,因此也可以把整体反照度(Albedo)和上述的镜面反射率捆绑在一起,称之为&金属度&(Metalness)。适当的参数调整不仅降低了美工错误地做出非写实材质的概率,也让光照渲染逐渐与现实物理定律接轨。PBR也通常加入描述物体表面粗糙程度的参数,来决定反射效果是否扩散化模糊化。&br&&figure&&img src=&https://pic2.zhimg.com/50/a3bf571bee021bdbdbd219defc01d923_b.jpg& data-rawwidth=&680& data-rawheight=&201& class=&origin_image zh-lightbox-thumb& width=&680& data-original=&https://pic2.zhimg.com/50/a3bf571bee021bdbdbd219defc01d923_r.jpg&&&/figure&&br&&br&PBR物理渲染还有一个相当重要的部分,就是Fresnel菲涅尔效应。众所周知,高反射率的物体在表面几乎与观察角度平行时会显得更亮(你可以拿平板的屏幕或者水观察一下),这是因为反射的}

我要回帖

更多关于 15mm是多少厘米 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信