Laya3D 自定义shader + 实时阴影
Laya自带的默认材质 BlinnPhongMaterial 是支持实时阴影的,只需要将directional light 的阴影打开 ,meshrender 的receiveShadow 设置为 true 就能简单的在材质上投射阴影了。
但是显然基础材质 blinnPhong是不够用的,当需要自定义材质的时候发现实时阴影又没了。不得已,只能去看laya 的相关源码,踩了一些坑,终于调通了。总结的坑点如下:
1 ShaderDefines
这个类控制glsl 中shader的宏定义开关。比如你要使用实时阴影,需要在vs和fs中使用 类似于
#ifdef RECEIVESHAOW
...
#endif
的宏定义。那么还需要在自定义的Material 中 加上
this._shaderValues.addDefine(XXX.SHADERDEFINE_RECEIVE_SHADOW);
,而且别忘记register 初始化,这个是静态成员变量,需要在所有类初始化之前执行,Laya内部是放在Scene3D里面执行的。
XXX.SHADERDEFINE_RECEIVE_SHADOW = XXX.shaderDefines.registerDefine("RECEIVESHADOW");
不光是这样,在初始化subShader时,还要将该material的shaderdefine 作为参数传入 构造函数。
var sub_shader: Laya.SubShader = new Laya.SubShader(attributeMap, uiformMap,undefined,XXX.shaderDefines);
而且别忘记在uniformmap 中加上相关的变量:
var uiformMap = {
'u_MvpMatrix' : Laya.Shader3D.PERIOD_SPRITE,
'u_WorldMat' : Laya.Shader3D.PERIOD_SPRITE,
'u_texture' : Laya.Shader3D.PERIOD_MATERIAL,
'u_DirectionLight.Direction' :Laya.Shader3D.PERIOD_SCENE,
'u_shadowMap1': Laya.Shader3D.PERIOD_SCENE,
'u_shadowMap2': Laya.Shader3