WebGL实践之半透阴影
楔子
相信很多人都知道,通过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彪叔” 可以添加作者微信进行交流,及时收到更多有价值的文章。
WebGL实践之半透阴影的更多相关文章
- 用dx实现半透遮挡效果
四种技术方案: 1.两次绘制role实现半透遮挡2.背景中已经包含building, 则额外绘制一次半透的building即可实现半透遮挡3.利用building的遮罩实现半透遮挡, 利用rtt技术4 ...
- WebGL three.js学习笔记 阴影与实现物体的动画
实现物体的旋转.跳动以及场景阴影的开启与优化 本程序将创建一个场景,并实现物体的动画效果 运行的结果如图: 完整代码如下: <!DOCTYPE html> <html lang=&q ...
- 蓝牙mesh组网实践(厂商透传模型介绍)
目录 CH582的官方EVT中,除了代理节点例程和天猫精灵例程外都提供了厂商定义的透传模型. 模型位于蓝牙mesh网络协议中的最上层,负责标准化用户应用场景的实例,比如说开关模型.亮度模型.风速模型. ...
- 半透命opacity:(0-1),对于IE6版本不支持需要用filter:alpha(opacity=0-100)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- golang+webgl实践激光雷达(一)激光扫描仪基础知识
一.前言 最近做一个测量料堆形状的项目,通过前期调研,最后决定用激光测距原理进行测量.通过旋转云台+激光扫描仪实现空间三维坐标的测量.其中激光扫描仪扫射的是一个二维的扫描面,再通过云台旋转,则形成一个 ...
- Tkinter最佳实践(半小时)
概述: 简介 Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和 ...
- 拒绝老土!暗黑风格半透平面化主题—InfinityFreedom正式发布
经常听到“路由器界面土点就土点吧,凑合能用就成.” 诚然,路由器重要的是功能,但为什么要辣眼睛呢? 拯救喜欢折腾的你,抢救干涩的眼球,原创OpenWrt主题Infinity Freedom正式发布! ...
- webgl自学笔记——矩阵变换
这章主要探讨矩阵,这些矩阵代表了应用在我们场景上的变换,允许我们移动物体.然而在webGL api中并没有一个专门的camera对象,只有矩阵.好消息是使用矩阵来取代相机对象能让webgl在很多复杂动 ...
- Cookie和Session在Node.JS中的实践(一)
Cookie和Session在Node.JS中的实践(一) Cookie和Session是一个非常有趣的概念,也是一个老生常谈的话题.然而,作者看了许多文章,也翻看了几本书籍,它们对Cookie和Se ...
- 基于SCRUM方法实践的西油计科党建设计与实现
基于SCRUM方法实践的西油计科党建设计与实现 序言 所属课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesig ...
随机推荐
- ASP.NET Core Web中使用AutoMapper进行对象映射
前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂.庞大的时候还容易出现错误.为了解决这个 ...
- 面试题--mysql的数据库优化
mysql的数据库优化 当有人问你如何对数据库进行优化时,很多人第一反应想到的就是 SQL 优化,如何创建索引,如何改写 SQL,他们把数据库优化与 SQL 优化划上了等号. 当然这不能算是完全错误的 ...
- 实用!!!!springBoot加入微信扫码支付功能,有一说一还是挺有意思的
基于springboot微服务加入微信支付的功能 在线微信支付开发文档: https://pay.weixin.qq.com/wiki/doc/api/index.html native扫码支付方式: ...
- objectarx 天正的墙转梁线
黄色的线是天正建筑2014画出来的墙炸开后的样子,炸开后全是AcDbLine.可以看到这个黄色的线在拐弯处,交叉处会出现多余的小线段,并且是不连续的,或者是超出了缺口,想要把它转变成梁就需要考虑这些因 ...
- exception EXC_RESOURCE - WAKEUPS 分析(二)
一.问题: 直播助手在使用ReplayKit2 Extension的过程中,ReplayKit2的Upload进程工作在后台模式,苹果对处于后台的进程进行了内存和CPU资源的限制. 对于内存: 每种E ...
- vim 多文件编辑
使用vim打开多个文件 vim可以同时打开好几个文件同时进行编辑 [root@localhost opt]# vim ip.txt time.txt 2 files to edit ens32: fl ...
- C语言-使用malloc导致的奔溃问题
在使用malloc.memset.free的过程中,出现了程序奔溃,大致现象如下. 程序的实现大致如下: #include <stdio.h> #include <stdlib.h& ...
- 键盘中断,键盘驱动,基于Linux0.11
键盘,咱们做计算机这一行的自然不必多说,天天与它打交道.但熟归熟,清楚键盘背后的原理吗?键盘上都标有各键的名称,表明了各键所代表的意义,但是计算机是如何知道的?组合键是怎样实现的?按下一个代表字符的键 ...
- P7448
problem & 双倍经验 & blog 低配版本 没有 Ynoi 标志性算法卡常,这点差评. 拆解问题 定义 \(lst_i\) 为上一个和 \(i\) 号点相同的位置. 由于几个 ...
- VictoriaLogs 要凭什么革了各家日志存储的命
如果大家对时序指标的存储方案有些了解,那大概率会听过 VictoriaMetrics,VictoriaMetrics 号称 Prometheus 的升级版,在性能和成本方面也确实做得很好,如果是夜莺新 ...