L-LingRen / UnitySimpleCartoonLine

使用模型网格生成的卡通描边
129 stars 38 forks source link

摄像机离得很近以后线条会变乱 #4

Open JavinYang opened 2 years ago

JavinYang commented 2 years ago

当摄像机拉近到一个比较近的距离以后线条会变乱,应该是算法有点小问题。

L-LingRen commented 2 years ago

是的,没记错的话问题出在shader的这几行代码。 o.vertex1 = UnityObjectToClipPos(vertex1 + vertex1_normal 0.001f) is_edge; o.vertex2 = UnityObjectToClipPos(vertex2 + vertex2_normal 0.001f) is_edge; 这样一乘,如果is_edge是0,那z和w都变成0了,到了片元着色器 float3 e0 = input[0].vertex1.xyz / input[0].vertex1.w; float3 e1 = input[0].vertex2.xyz / input[0].vertex2.w; 噢,问题就来了,当时我想尽可能消除条件判断,写得不太严谨。

L-LingRen commented 2 years ago

然后后面的计算也有问题,应该改成这样。 float2 v = normalize(e1.xy - e0.xy); float2 n = float2(-v.y, v.x) PctExtend (e0.z + e1.z + 1) 0.5f; float2 ext = 0.001 v; float4 v0 = float4(e0.xy + n 0.5 - ext, e0.z, 1.0) input[0].vertex1.w; float4 v1 = float4(e0.xy - n 0.5 - ext, e0.z, 1.0) input[0].vertex1.w; float4 v2 = float4(e1.xy + n 0.5 + ext, e1.z, 1.0) input[0].vertex2.w; float4 v3 = float4(e1.xy - n 0.5 + ext, e1.z, 1.0) input[0].vertex2.w;