[Unity]硬表面模型描边断裂问题解决过程记录( 四 )


经过以上两种方案处理后的模型 , 在Unity 中通过读取顶点颜色中的法线信息 , 然后将其转换到模型空间下与模型顶点坐标相加即可挤出轮廓线模型 , 中轮廓线pass代码如下:
Pass{NAME "OUTLINE"Cull FrontCGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT;float4 vertexColor : COLOR0;};struct v2f{UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};fixed4 _OutlineColor;half _OutlineWidth;v2f vert(a2v v){v2f o;//从顶点颜色中读取法线信息 , 并将其值范围从0~1还原为-1~1float3 vertNormal = v.vertexColor.rgb * 2 - 1;//使用法线与切线叉乘计算副切线用于构建切线→模型空间转换矩阵float3 bitangent = cross(v.normal,v.tangent.xyz) * v.tangent.w * unity_WorldTransformParams.w;//构建切线→模型空间转换矩阵float3x3 TtoO = float3x3(v.tangent.x, bitangent.x, v.normal.x,v.tangent.y, bitangent.y, v.normal.y,v.tangent.z, bitangent.z, v.normal.z);//将法线转换到模型空间下vertNormal = mul(TtoO, vertNormal);//模型坐标 + 法线 * 自定义粗细值 * 顶点颜色A通道 = 轮廓线模型o.vertex = UnityObjectToClipPos(v.vertex + vertNormal *_OutlineWidth * v.vertexColor.a);UNITY_TRANSFER_FOG(o,o.vertex);return o;}fixed4 frag(v2f i) : SV_Target{// apply fogUNITY_APPLY_FOG(i.fogCoord, _OutlineColor);return _OutlineColor;}ENDCG}
Unity中轮廓线显示效果如下(模型颜色为顶点色):
一个部分光滑部分硬边的球体轮廓线效果如下:
简单做了一个骨骼动画 , 轮廓线也没有出现问题:
以上都是非常简单的测试 , 以后发现问题再解决 , 就这样