BlendShape變化同時調整面部的法線貼圖
阿新 • • 發佈:2019-01-07
參考:https://blog.csdn.net/baidu_27276201/article/details/44992683
https://blog.csdn.net/Thebluewing/article/details/72820162
實現效果:
表情變換時根據BlendShape的值對應調整人物臉部法線貼圖的表情法線貼圖程度e
部分程式碼:
把BlendShape的值傳遞給材質的C#程式碼:
//用於把BlendShape的引數傳遞給材質 public class BlendToShader : MonoBehaviour { public Material MaterialFace;//需要修改的材質的坑位 private SkinnedMeshRenderer skinMesh;// 定義與BlendShape相關的元件 void Awake() { skinMesh = GetComponent<SkinnedMeshRenderer>(); // 獲取與BlendShape相關的元件 } void Start () { } void Update () { float A = skinMesh.GetBlendShapeWeight(0);//把變形器的第一個引數傳給A MaterialFace.SetFloat("_SA", A / 100);//把A/100賦值給材質的“_SA”,用a.SetFloat("b",c); } }
shader中關於法線的表情法線部分的屬性程式碼(只針對法線部分的屬性):
Properties { //【法線貼圖】 _BumpMap("NormalMap Z", 2D) = "bump" {}//原法線貼圖 _BumpScale("Scale", Float) = 1.0//原法線貼圖強度 //【表情法線貼圖】 _BumpMapA("NormalMap A", 2D) = "bump" {}//第一個表情法線貼圖 _BumpScaleA("Scale", Float) = 1.0//。。。法線強度 _SA("SwitchA", Range(0.0, 1.0)) = 0.0//。。。表情融合時的強度 _BumpMapB("NormalMap B", 2D) = "bump" {} _BumpScaleB("Scale", Float) = 1.0 _SB("Switch 2", Range(0.0, 1.0)) = 0.0 _BumpMapC("NormalMap C", 2D) = "bump" {} _BumpScaleC("Scale", Float) = 1.0 _SC("Switch 3", Range(0.0, 1.0)) = 0.0 }
shader中關於法線部分的主要計算程式碼(僅僅是部分,傳遞,例項化轉換都沒有):
half3 NormalInTangentSpace(float4 texcoords) { //【獲取原法線貼圖的值】用tex2D取樣原法線貼圖,再用UnpackScaleNormal對法線貼圖進行正確的的解碼,並根據“_BumpScale”縮放法線 half3 NumberZ = UnpackScaleNormal( tex2D(_BumpMap, texcoords.xy), _BumpScale); //【獲取表情變化部分的法線貼圖值】取樣表情法線貼圖,進行解碼和縮放,然後減去原法線貼圖NumberZ half3 NumberA= UnpackScaleNormal(tex2D(_BumpMapA, texcoords.xy),_BumpScaleA) - NumberZ; half3 NumberB= UnpackScaleNormal(tex2D(_BumpMapB, texcoords.xy) , _BumpScaleB) - NumberZ; half3 NumberC = UnpackScaleNormal(tex2D(_BumpMapC, texcoords.xy) , _BumpScaleC) - NumberZ; //【普通切線】=原法線貼圖 + 表情法線變化部分*表情程度+。。。。 half3 normalTangent = NumberZ + NumberA *_SA + NumberB*_SB + NumberC *_SC; return normalTangent; }