楔子

相信很多人都知道,通过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实践之半透阴影的更多相关文章

  1. 用dx实现半透遮挡效果

    四种技术方案: 1.两次绘制role实现半透遮挡2.背景中已经包含building, 则额外绘制一次半透的building即可实现半透遮挡3.利用building的遮罩实现半透遮挡, 利用rtt技术4 ...

  2. WebGL three.js学习笔记 阴影与实现物体的动画

    实现物体的旋转.跳动以及场景阴影的开启与优化 本程序将创建一个场景,并实现物体的动画效果 运行的结果如图: 完整代码如下: <!DOCTYPE html> <html lang=&q ...

  3. 蓝牙mesh组网实践(厂商透传模型介绍)

    目录 CH582的官方EVT中,除了代理节点例程和天猫精灵例程外都提供了厂商定义的透传模型. 模型位于蓝牙mesh网络协议中的最上层,负责标准化用户应用场景的实例,比如说开关模型.亮度模型.风速模型. ...

  4. 半透命opacity:(0-1),对于IE6版本不支持需要用filter:alpha(opacity=0-100)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. golang+webgl实践激光雷达(一)激光扫描仪基础知识

    一.前言 最近做一个测量料堆形状的项目,通过前期调研,最后决定用激光测距原理进行测量.通过旋转云台+激光扫描仪实现空间三维坐标的测量.其中激光扫描仪扫射的是一个二维的扫描面,再通过云台旋转,则形成一个 ...

  6. Tkinter最佳实践(半小时)

    概述: 简介 Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和 ...

  7. 拒绝老土!暗黑风格半透平面化主题—InfinityFreedom正式发布

    经常听到“路由器界面土点就土点吧,凑合能用就成.” 诚然,路由器重要的是功能,但为什么要辣眼睛呢? 拯救喜欢折腾的你,抢救干涩的眼球,原创OpenWrt主题Infinity Freedom正式发布! ...

  8. webgl自学笔记——矩阵变换

    这章主要探讨矩阵,这些矩阵代表了应用在我们场景上的变换,允许我们移动物体.然而在webGL api中并没有一个专门的camera对象,只有矩阵.好消息是使用矩阵来取代相机对象能让webgl在很多复杂动 ...

  9. Cookie和Session在Node.JS中的实践(一)

    Cookie和Session在Node.JS中的实践(一) Cookie和Session是一个非常有趣的概念,也是一个老生常谈的话题.然而,作者看了许多文章,也翻看了几本书籍,它们对Cookie和Se ...

  10. 基于SCRUM方法实践的西油计科党建设计与实现

    基于SCRUM方法实践的西油计科党建设计与实现 序言 所属课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesig ...

随机推荐

  1. Google出品的NotebookLM 人工智能笔记本,一款基于RAG的personalized AI产品

    Google推出了实验性的NotebookLM产品,一款基于RAG的个性化AI助手产品,基于用户提供的可信信息,通过RAG,帮助用户洞察和学习参考内容,然后借助AI整理笔记,转换为用户最终需要的大纲. ...

  2. 配置Ingress支持HTTPS访问(二):使用cert-manager申请证书

    目录 一.系统环境 二.前言 三.Let's Encrypt和cert-manager简介 四.部署cert-manager 4.1 安装cert-manager 4.2 创建clusterissue ...

  3. nohup Command [ Arg … ] [ & ]

    nohup 英文全称:no hang up 不挂断的意思.退出终端不挂断程序的运行.在默认的情况下,会输出一个名叫 nohup.out 的文件到当前目录下.nohup Command [ Arg - ...

  4. 解密Prompt系列30. LLM Agent之互联网冲浪智能体

    这一章我们介绍能自主浏览操作网页的WebAgent们和相关的评估数据集,包含初级任务MiniWoB++,高级任务MIND2WEB,可交互任务WEBARENA,多模态WebVoyager,多轮对话Web ...

  5. 分享5款.NET开源免费的Redis客户端组件库

    前言 今天大姚给大家分享5款.NET开源.免费的Redis客户端组件库,希望可以帮助到有需要的同学. StackExchange.Redis StackExchange.Redis是一个基于.NET的 ...

  6. android端http请求重发问题定位过程

    昨天生产系统上报出一个问题:用户做一次扫码交易,出现了两条交易记录.幸好支付渠道对支付码有限制只成功了一笔,没有出现多扣钱的问题.现在我们要排查一下,为什么做一次操作会出现两条交易记录.我们的后台服务 ...

  7. MySQL学习笔记-多表查询(上)

    多表查询(上) 一. 多表关系 在实际应用中,根据需求,设计的表结构之间存在联系,联系一般分为以下三种 一对多(多对一) 多对多 一对一 1. 一对多(多对一) 案例:部门与员工的关系,一个部门对应多 ...

  8. session 和 cookie 有什么区别?

    a.存储位置不同:session 存储在服务器端:cookie 存储在浏览器端. b.安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改. c.容量和个数限制:cookie 有容量限 ...

  9. Javascript高级程序设计第五章 | ch5 | 阅读笔记

    基本引用类型 Date 在不给定时间的情况下创建Date实例,创建的对象将保存当前的日期和时间. 要基于其他时间创建Date对象,必须传入其毫秒时表示 Date.parse() 月/日/年(5/21/ ...

  10. 解决TypeError: 'NoneType' object is not subscriptable

    1.捕获异常的方式try: img_list = img_list["name"]except: img_list = "" 2.对象进行判断if img_li ...