12_眼睛处理

眼睛处理

材质处理

母材质设置

先将母材质改为半透明 关闭深度测试和开启自定义深度 在改回不透明

因为深度测试会有深度剔除,这里关闭之后就没有剔除了

手动深度测试

这里深度测试仅针对半透明物体,PixelDepth表示当前物体深度,用Step和ScenceDepth比较,如果PixelDepth小于ScenceDepth,那么表示当前物体没有遮挡,使用Alpha来控制透明度,反之则表示物体前有遮挡需要剔除,这里直接将透明度给0就相当于剔除了。 深度测试剔除后就正常了

开启模型自定义深度

找到蓝图中的网格体,这里眼睛这3个是半透明,不做处理 除开头发以外的模型全部开启自定义深度 只需要开启就行了,不需要改蒙版值

判断眼睛的深度是否大于自定义深度

这里得详细分析一下,PixelDepth其实就理解为材质实例化后眼睛的深度,而自定义深度刚才上面也操作过了,相当于除开头发眼睛以外身体部分的深度。那么这里就好理解了,两者相减相当于判断前后关系,阈值表示允许的误差范围,如果自定义深度更大那么表示眼睛深度更小,在前方无遮挡,所以直接给透明度Alpha,反之被遮挡返回0直接剔除 这里Alpha是做了处理的乘了0.5,因为头发贴图中其实有一个Alpha通道能用来混合,但是因为眼睛和头发模型不互通,材质实例化后眼睛材质是读不到头发的UV的,自然也就没法使用头发的Alpha做混合,所以这里随意给的一个0.5

判断眼睛和头发之间的深度

和上面同理,但是这里换了一个东西,PixelDepth是眼睛深度,这里作比较的是场景深度,之前操作的时候除了眼睛部分,头发也是没有开启自定义深度的,所以这里场景深度是包括头发深度的,也就可以理解为是在和头发做比较,差值更大表示眼睛深度更大,就返回0,反之返回前面判断过的Alpha 最终通过两个条件就得到眼睛的深度和Alpha关系了

输出调整

然后设置一个开关来控制,输出给透明度

覆层材质指定

当前输出是没有效果的,还需要做下面的处理。至于为什么没效果,是因为虽然材质里面我们可以调用自定义深度这些东西计算,但是在UE中半透明材质是不会传入生成自定义深度,所以调用失败,但是覆层材质可以,它应该是属于后期处理材质一类(我猜测具体指定的时候可能进行过强转或者是直接进行传值),所以可以获取自定义深度。

找到眼睛相关材质 创建材质实例 将这些材质实例全部设置为半透明,开启ExtraPass开关 现在就生效了

问题优化

穿帮问题

现在这个方法虽然计算了眼透,但是会有穿帮问题,因为关闭了深度写入,计算时我们是采用了场景深度和阈值来计算的 当阈值较大,就会穿帮 修改阈值小一些会比较好 此外还有一个问题是侧面的时候太显眼了,问题很严重

优化调整

这里我使用法线的G通道和实现点乘从而让眼透Alpha跟着变化,同时使用深度影响。这里自己看着改吧

最终效果


Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • URP - RendererFeature :ScreenSpaceOutline
  • 平滑法线处理 - 八面体映射
  • Lv.3 Unity主线:一个简单的PBRShader
  • 理论支线:直接光漫反射与GGX高光的混合问题
  • 理论支线:PBR - 基于图像的照明( image based lighting-IBL)
  • # #