关于法线的一些注意事项
简述:在项目中使用到了描边技术,我这里使用的原理是法线+模板测试,在法线这一小部分当中,也是遇到了许多问题
问题①:需要描边技术的模型很多,且模型大小不一,总不可能每个模型的材质shader的描边大小数值都不一样吧,那不得累死,所以“归一化”是解决这个问题的关键——normalize();
问题②:在归一化之后,有可能会碰到另一种情况——这种情况也跟问题①所呈现的效果是一样的,这种情况我不知道如何称呼,解决方法是:
worldNormalLength = length(mul((float3x3)transpose(unity_WorldToObject), normal)); //normal是归一化后的法线,归一化后的法线还需要乘以unity_WorldToObject矩阵的转置的模长,注意unity_WorldToObject矩阵的转置不等于unity_ObjectToWorld,unity_ObjectToWorld是unity_WorldToObject的逆矩阵。
最后将法线乘以worldNormalLength就可以得到真正的统一法线了。其原理我估计和UnityObjectToWorldNormal()函数有关
UnityObjectToWorldNormal源码(上图,地址:(24条消息) UnityCG.cginc源码之UnityObjectToWorldNormal之模型非等比缩放导致的法线不垂直问题解决分析_傲天鹰的博客-CSDN博客)
问题③:在调整法线描边时,可以通过乘以裁剪坐标的第四分量来保证描边不会随摄像机拉远拉近而变细变粗
//总结时间:2023.6.21,发布时间今天
//2024-07-22 调整法线强度的方法1——
/*************/ #include "UnityStandardUtils.cginc" /*************/ o.Normal = UnpackScaleNormal( tex2D( _BumpMap, uv_BumpMap ), _NormalInt );
2,差不多是类似的效果,主要是代码简单
fixed3 normal = UnpackNormal(tex2D(_BumpMap, i.uv)).rgb; fixed3 normalFactor = fixed3(_NormalInt,_NormalInt,1); normal *= normalFactor;
法线外扩描边实现与优化描边(Outline)是风格渲染经常采用的一种效果。常见的有法线外扩描边和后处理描边,当然也有很多 - 掘金 (juejin.cn)