博文

目前显示的是 一月, 2024的博文

Shader - Hair & Fur

图片
 Demo Mesh 无论是头发材质还是毛发材质,它们的建模都是基于插片的方式,且每个片都是单面(Cull Off) UV Layout 需要保证Kajiya-Kay高光流向的连续性,UV的布局要是统一且具有方向性的,每个网格片的UV区域重复覆盖。 Vertex Occlusion 通过烘焙保存在顶点颜色的环境光遮蔽,不同于使用AO贴图的方式。离线的烘焙可以计算出不同层级(插片)互相之间的遮挡关系。区别不同层级受到的环境光遮蔽,提升整个毛发渲染的阴影体积感。 Pass 渲染效果分为两个品质: Alpha Test(适用中低性能的设备) Alpha Test + Alpha Blend(适用高性能的设备) 两个Pass使用的都是同一张Alpha贴图。 Alpha Test 只有一个裁剪Pass,所有毛发的边缘都会被硬切,整个毛发的渲染效果就显得比较毛糙,完全没有柔软感。但是性能方面相对的比较好,写入了深度值,不会导致严重的Overdraw。 Alpha Blend 再加上一个混合Pass,每一根毛发的边缘都变成半透明状态,锯齿感会明显减少,整个毛发的渲染效果也会显得比较有柔软感。但是裁剪(Alpha Test)Pass必须作为基础,因为混合Pass要依赖它提前的深度写入来进行深度测试,从而避免出现错误的混合层级和顺序,还能减少大部分区域的Overdraw。另外一个需要注意的是,因为深度值精度的有限,同一个三角面的混合Pass和裁剪Pass可能会发生深度冲突。为了有正确的渲染效果,要让混合Pass始终能覆盖在裁剪Pass上。使用Shader提供的Offset设置渲染状态,能对混合Pass的深度值进行非常轻微的偏移,这样在不影响渲染效果(透视)的前提下避免了深度冲突。 混合Pass渲染状态: Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Offset 1, -1 Specular https://web.engr.oregonstate.edu/~mjb/cs519/Projects/Papers/HairRendering.pdf 高光是各向异性的,它的流向是依据毛发的方向(顶点空间的切线或次切线) 镜面高光的D项是Kajiya-Kay,F项是Schlick,V项用常量0.25代替。 Kajiya-Kay // Note:...

Shader - Fabric & Microfiber

图片
材质效果(Unity) 材质参考(Marmoset Toolbag) 主要参考八猴渲染器的官方材质Velvet,解析了它的实现思路,它使用了两套光照着色并叠加:Sheen BRDF + GGX BRDF 材质对齐(Marmoset Toolbag) 逐步分解着色计算的过程并使用同一套贴图,横向对比Marmoset Toolbag和Unity的效果。单独对比仅在直接光作用下的Sheen BRDF效果。 从结果中可以看到,直接光的效果基本是一致的,但是间接光的差异就比较大。八猴渲染器的间接环境光源是带有方向信息的,在光照计算时能得到和直接光一样真实的漫反射和镜面反射,这就明显区别于Unity使用的Light Probes和Reflection Probes。 Microfacet Sheen BRDF 基于理论基础:"Production Friendly Microfacet Sheen BRDF"(Alejandro Conty Estevez, Christopher Kulla) https://blog.selfshadow.com/publications/s2017-shading-course/imageworks/s2017_pbs_imageworks_sheen.pdf Specular BRDF struct MicrofiberGCurve {     float a, b, c, d, e; }; MicrofiberGCurve G_MicrofiberInterpolate( float roughness ) { float r  = 1.0 - roughness; float r2 = r * r; MicrofiberGCurve g; g.a = mix(  21.5473,  25.3245, r2 ); g.b = mix(  3.82987,  3.32435, r2 ); g.c = mix(  0.19823,  0.16801, r2 ); g.d = mix( -1.97760, -1.27393, r2 ); g.e = mix( -4.32054, -4.85967, r2 ); ...

Shader - Fabric

图片
Demo 测试的材质表现了四种组合类型: 普通布料 普通布料 + 细节纹理 普通布料 + 细节纹理 + 绒毛纹理 各向异性丝绸 + 细节纹理 Workflow 设计布料Shader的工作流时,考虑到项目角色模型的美术风格。多数模型会混搭有布料材质和金属材质。 布料材质需要高光工作流, 但是金属材质需要金属工作流 。在不拆分Mesh的情况下,为了能同时表现这两种材质,就需要结合两种工作流和着色模型,再依赖贴图通道Mask来在像素级别区分材质类型。 这种设计能满足材质类型混搭的需要,但是也造成了Shader性能指标ALU的明显上升。 Detail Map 布料类材质表面通常具有高频细节。除了PBR需要的基础纹理外,还需要连续的细节纹理。通过对UV进行Tilling来调整其在材质表面的密集程度。 在细节贴图和基础贴图的混合方式中,其中比较特殊的是切线空间的法线,细节贴图只提供RG两个通道的法线信息,混合方式可以理解是二维方向矢量的偏移。 half3 detailNormal = UnpackNormalScale( half4(detailNormalTS.x, detailNormalTS.y, 1.0, 1.0), 1.0); detailNormal = half3(detailNormal.rg * detailNormalStrength,     lerp(1, detailNormal.b, saturate(detailNormalStrength)) ); normalTS = SafeNormalize( half3(normalTS.rg + detailNormal.rg, normalTS.b * detailNormal.b) ); 区别于常规的细节贴图,布料类的细节贴图AO会遮蔽基础贴图Albedo,材质表面的光照反射率会跟随细节变化,进而改变材质的整体亮暗表现。 half detailAlbedoOcclusion = lerp(1, occlusion, saturate(threadAlbedoStrength) ); albedo = albedo * detailAlbedoOcclusion; Silk & Satin & Nylon 高光工作流需要材质提供高光的颜色,丝绸类材质的高光颜色具有多样...