一· 毛发缓存数据巨大的问题(及5个解决方案)
在引擎里模拟毛发,并且把它缓存下来,我们就不需要从外部导入了,所以我们要解决的问题就是怎么样在引擎里自由地控制毛发
1.物理场控制
延申 [技术分享]《UE中的世界物理场及应用》 | 李文磊 Epic_哔哩哔哩_bilibili
毛发默认情况是不接受物理场地速度/力的。要把物理场的信息在毛发的Niagara解算器里写进去,然后让它查询。重点是查询的信息要给particle node position来改变它的位置。在Niagara的groom,update groom veocity模块里。
2.添加碰撞体
毛发和角色以外的其他物体碰撞。
在毛发的component上add collision component并暴露出来
3.模拟精度和渲染精度
- Strands / 静态的时候的毛发平滑度
- Guide /
- Strand Size / guide上面的Particle 的数量
这里有3个概念,Strands 就是毛发导进来时模型的段数,是跟渲染的精度有关的,但是它主要的是表现静态的时候的毛发平滑度,
如果是动态的模拟起来的话,是需要一套guide(引导线)段数,它是动态模拟平衡度的基础,但是决定动态模拟平滑度的,最关键的就是Strand Size ,就是guide上面的Particle 的数量,具体参与模拟的粒子数。这东西是在引擎里设置。
还有对比图,同样的Strands,使用了不同的Particle 的数量,看上去它的渲染品质,碰撞的精度是有很大的差别。
所以如果你觉得这个毛发,特别是模拟比较大的时候看上去不是很光滑,不一定要一味的去增加这个毛发本身strands,因为那个会大大的增加毛发的一个尺寸或者数据量,可能考虑更多在引擎里面,先把particle碰撞的这个段数给增加。
4.模拟坐标空间
毛发在大的运动速度或者快速运动中,有一些拉扯或者物理模拟不精确,可以通过调整它的坐标空间,默认是local坐标空间,并且提供两个参数让Local坐标空间应用的量进行混合。
用这种方式来控制我们需要世界的速度对毛发产生影响的大小。(图左是完全世界空间,右边是local)
5.用sequence把模拟缓存下来
保证确定性:两次渲染每次的位置一模一样,第二次编辑器的播放速度一模一样。
要注意缓存大小跟引导线的数量和strands size是直接相关的。。
如果必须要外部导入,尽量导入引导线的缓存而不是strands的缓存。
引导线的缓存导进来驱动strands,有拉扯问题,主要可能是跟引导线数量有关,间隙不要太大,如果毛发密度很大,引导线百分比可以小一点。密度不大的话百分比可以相对多一点。
另外的话,guides的数量(也就是cv)它的顶点数量可以少于strands。
在某种程度上,只要用guides,不管是1/5还是1/10strands,再减少cv(Control Vertex)数量。它的guide的cache就是大大小于strands的cache。
二·毛发光影问题
理解毛发渲染机制,熟悉控制参数
基于体素(Voxels)毛发大部分是基于voxels的,(如果是光线追踪也可以基于geometry)
所有的自阴影/它阴影(头发在头上或者地上)都是基于voxels的
三个对于基于体素的光影影响最大的命令行
- (第一行)首先是它的尺寸(体素的大小),对直接光的影子的影响在自阴影有比较大的差别。
- (第二行)DensityScale或者毛发设置hair shadow density(和命令行是同一个东西)可以用比较少的毛发来模拟比较厚的效果
- (如下图第三行)Raymarching.SteppingScale默认是1.15,设置为1精度会大大提升,毛发在额头上闪烁的问题也可以得到很大的改进。
环境光遮蔽HairStrands.VoxelTrace
天光
1.天光类型:SkyLightingIntegrationType
默认是(如上图)2,1/3比较expensive,渲染输出mrq用cinematic品质输出会转换到1,编辑器和输出就看到的不一样。
2.天光噪点
光追
Deepshadow
deepshadow对自阴影和它阴影都有影响,自阴影相对普通shadowmap少噪点,它阴影相对普通shadowmap更细腻
某些逆光轮廓感开启可以用deepshadow
总结
——————————————毛发景深问题(待更新)——————————————