Laya3D 自定义shader + 实时阴影

本文介绍了在Laya3D中如何自定义shader以实现实时阴影。通过ShaderDefines控制glsl宏定义,继承BaseMaterial创建自定义Material,并参照BlinnPhong Shader编写,同时设置MeshRender接收阴影。详细步骤包括开启DirectionLight阴影、编写自定义shader及设置材质。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值