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(); // 获取与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;
}

 

 

 

你可能感兴趣的:(每日工作总结)