共计 972 个字符,预计需要花费 3 分钟才能阅读完成。
楔子
置信很多人都晓得,通过 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 彪叔”能够增加作者微信进行交换,及时收到更多有价值的文章。
正文完