1. 程式人生 > >BlendShape變化同時調整面部的法線貼圖

BlendShape變化同時調整面部的法線貼圖

參考: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;
}