我也发现这个问题了,在BaseMaterial构造函数里会把renderQueue的值设置成RENDERQUEUE_OPAQUE(不透明),但是我在自定义材质里也修改了
this.renderQueue = BaseMaterial.RENDERQUEUE_TRANSPARENT;
this.alphaTest = false;
仍然没有透明效果,但是参考Laya自己的材质是可以的,可能需要更加深入的研究一下源码
问题原因已找到,在设置pass的时候要添加state
let stateMap = {
's_Cull': Shader3D.RENDER_STATE_CULL,
's_Blend': Shader3D.RENDER_STATE_BLEND,
's_BlendSrc': Shader3D.RENDER_STATE_BLEND_SRC,
's_BlendDst': Shader3D.RENDER_STATE_BLEND_DST,
's_DepthTest': Shader3D.RENDER_STATE_DEPTH_TEST,
's_DepthWrite': Shader3D.RENDER_STATE_DEPTH_WRITE
};
var pass1: ShaderPass = subShader.addShaderPass(vs1, ps1, stateMap);
然后在构造函数里分别设置这些值(参考BlinnPhongMaterial设置renderModle的函数)
this.renderQueue = BaseMaterial.RENDERQUEUE_TRANSPARENT;
this.alphaTest = false;
this._shaderValues.setBool(OutlineMaterial.DEPTH_WRITE, false);
this._shaderValues.setInt(OutlineMaterial.CULL, RenderState.CULL_BACK);
this._shaderValues.setInt(OutlineMaterial.BLEND, RenderState.BLEND_ENABLE_ALL);
this._shaderValues.setInt(OutlineMaterial.BLEND_SRC, RenderState.BLENDPARAM_SRC_ALPHA);
this._shaderValues.setInt(OutlineMaterial.BLEND_DST, RenderState.BLENDPARAM_ONE_MINUS_SRC_ALPHA);
this._shaderValues.setInt(OutlineMaterial.DEPTH_TEST, RenderState.DEPTHTEST_LESS);
这样就可以透明渲染了