博文

Shader - Skin & SSS

图片
Demo Workflow 需要渲染出的特性: 毛孔造成细碎的高光现象 次表面散射造成的透光现象 金属工作流的高光参数只有光滑度,只能控制高光区域的聚集度。高光工作流的高光参数除了有光滑度,还有镜面反射率可以控制高光的反射量。渲染皮肤的方式适合使用高光工作流,可以更方便的控制高光的表现。 Specular Detail 毛孔需要有高精度的贴图来表现高频的反射凹凸变化。在限制了贴图尺寸的情况下,并且脸部通常会和身体放到一个贴图UV区域,脸部只占了其中的小部分区域。这些情况都会导致脸部的整体渲染精度不高,表达不出高频的毛孔凹凸的细节效果。 其中解决的一个思路是利用细节纹理的优势:Detail Map + Mask Map 细节纹理可以提供高频毛孔的镜面反射率,渲染出不规则凹凸的镜面反射高光效果。 上面从左往右的贴图分别是:Albedo Map,Smoothness Map,Specular Detail Map Direct Lighting & Specular Subsurface Scattering https://developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-14-advanced-techniques-realistic-real-time-skin 实时次表面散射渲染技术主要分为纹理空间和屏幕空间,需要对贴图进行多次的高斯模糊处理和大量的贴图采样指令,这些都会在移动端造成很大的性能瓶颈。 下面介绍的两种散射实现方式,性能代价都是相对较小的,对于在移动端设备上的项目比较友好。 SSS Pre-integrated https://therealmjp.github.io/posts/sss-intro/ 预制作好散射的LUT贴图,将法线方向和光源方向的点积映射到贴图的U坐标,再添加一个曲线参数(Curvature)映射到贴图的V坐标。用映射后的UV坐标采样LUT贴图,替换BRDF中的漫反射项。 Direct Diffuse & Scattering SSS Back-facing 当观察的视角在模型的背光面时,散射会导致模型出现透光的效果,仿佛模型有略微的透明。 大白的身体出现略微的透光 从渲染微平面的角度分析,触发这个效果的条件是当光源和视角的方向相反,视线...

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:...