楔子
置信很多人都晓得,通过ShadowMap能够产生暗影,通过渲染暗影能够减少场景渲染的对比度,减少渲染的实在成果。 如下图所示:
然而对于通明或者半透明的对象,WebGL在解决暗影成果的时候,会把他当成一个不通明的对象来解决,这也渲染的暗影成果就显得很假。 比方上面树得暗影成果:
实在物理得成果中,树可能会有一些透光得间歇,所以暗影个别都不是一整块得成果。而是有些透光得亮点,如下图所示:
场景中,多家一些树,这种比照会更加明细,如上面两幅图所示,后面一个是整片暗影,前面一个是有半透暗影得成果:
半透暗影成果原来
实现半透暗影,能够通过透明度测试(alphaTest)性能来实现。一般来说,一张半透明得图片中,一部分中央是很通明得,opacity靠近与零,咱们心愿在opacity小于某个值得时候,不生成暗影,能够通过alphaTest,把小于阈值得片元在生成暗影贴图的时候抛弃掉,天然就不会生成暗影。 所以流程大抵如此:
- 绘制暗影贴图的时候,生成一个深度材质,设置深度材质alpahTest(=[阈值])和map,map是本来材质的贴图。 如果本来材质有alphaMap,也须要思考在深度材质下面加上alphaMap。
- 失常绘制场景流程。
threejs 实际
通过three 实际,首先在材质下面减少要给属性shadowAlphaTest,通过shadowAlphaTest动静指定绘制暗影时候的alphaTest,如下所示:
this.shadowAlphaTest = undefined;
在生成深度材质的中央,如下批改:
result.alphaTest = material.shadowAlphaTest || material.alphaTest;
result.map = material.map;
result.alphaMap = material.alphaMap;
而后再绘制的时候,能够动静批改shadowAlphaTest的值,来达到管制半透暗影的成果,如下所示:
child.material.transparent = true;
child.material.opacity = 1.0;
child.material.shadowAlphaTest = 0.5;
最终的成果如下所示:
结语
如果有疑难,关注公号“ITMan彪叔” 能够增加作者微信进行交换,及时收到更多有价值的文章。
发表回复