经过以上两种方案处理后的模型 , 在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中轮廓线显示效果如下(模型颜色为顶点色):
一个部分光滑部分硬边的球体轮廓线效果如下:
简单做了一个骨骼动画 , 轮廓线也没有出现问题:
以上都是非常简单的测试 , 以后发现问题再解决 , 就这样
- unity 3D物体使用EventSystem响应事件
- Unity3D-场景中3D物体添加点击事件
- 上 Unity3D塔防游戏开发——学习笔记
- Unity3D基于事件机制的消息系统
- Unity3d 3D物体上实现事件监听
- 戴尔一体机如何加装第二个硬盘
- Unity3D The Blacksmith Demo部分内容学习
- 硬件工程师学习-STM32、GD32、HWD32的ISP 下载
- 联筑赚:铝模施工混凝土表面为什么会有气泡
- 1.4 常见的负载均衡软硬件