角色上,头和身体是分开的,那么久会导致一个问题,身体和头的接驳处很容易展示到明显的过度,这不是设计想要的。
原因:
因为要受到光照效果和边缘光或者菲涅尔等跟光照相关的效果,自然需要计算法线与光照或法线与视野。这样的话就很容易产生这种偏差。
解决办法:
首先总的解决前提是身体接驳处要和头接驳处有相交的位置
类似这部分的颜色间隔就是表示是有相交的。
解决办法1:
很容易想到的第一个解决办法是,身体比头后渲染,然后通过cpu传递头部当前uv底部的颜色给到身体,然后身体得到这个数据来做跟当前像素上计算的值做插值。这样得到的效果是最好的。而且瑕疵是最少的。
问题:
这样做的问题是需要cpu传递,使整体的shader不能用uniform来处理,使整个渲染过程只获取一次数据,而要实时获取每个像素点的信息来传递给身体的shader。这样整体性能消耗较大,cpu和gpu大量实时交互,而且gpu的并行也被打破。因为需要cpu这个串行执行的东西打断gpu的渲染速度。
解决办法2:
让身体的裁剪范围减少,下面代码已经说明为什么要这样做了。总结就是不能让脖子裁剪得太多而达到身体和头重叠的效果。
clip((uv.y > 0.1 && uv.y < 0.31) ? (dressColor.r - 1) : 0);
//大于0.1是因为太小的v会让睫毛被裁掉,小于0.31是因为脖子的裁剪不能太多,太多的话跟有肤色的衣服过度会很突兀
然后第二步就是
Tags { "Queue" = "Transparent-50" "IgnoreProjector"="True" "RenderType"="Transparent" }
//这里的渲染低于Transparent是因为在跟有肤色的衣服过度时应该尽量用皮肤的材质,而衣服上皮肤的材质在后面
这里就是为了让身体渲染先于头渲染,这样重叠的部分,头部的渲染效果就会优先
然后第三步是把脖子上的颜色去掉:
clip(uv.y > 0.3105 ? -1 : 0);//大于0.3105是因为大于这个值得就不需要渲染了
当前其他说明头的颜色和身体颜色要一样就不多说了,这属于正常范围的功能,
这样其实就能得到我们想要的效果: