LayaAir中开启实时阴影性能消耗偏高,如果美术要求不那么逼真,那么物体可以用shader添加一个pass来模拟影子,效果整体可以接受,可以通过调整参数修改物体shader渲染影子的长短、方向、颜色等。
效果如下,物体偏亮,因为我使用了半兰伯特光照模型。

上代码:ShadowMaterial.ts

export default class ShadowMaterial extends Laya.BaseMaterial {static DIFFUSETEXTURE = Laya.Shader3D.propertyNameToID("u_Texture");static readonly NAME = "ShadowShader";constructor() {super();this.initShader();}private initShader(): void {var attributeMap = {'a_Position': Laya.VertexMesh.MESH_POSITION0, 'a_Normal': Laya.VertexMesh.MESH_NORMAL0,'a_Texcoord': Laya.VertexMesh.MESH_TEXTURECOORDINATE0};var uniformMap = {'u_MvpMatrix': Laya.Shader3D.PERIOD_SPRITE, 'u_WorldMat': Laya.Shader3D.PERIOD_SPRITE,'u_Texture': Laya.Shader3D.PERIOD_MATERIAL,'u_DirectionLight.Direction': Laya.Shader3D.PERIOD_SCENE, 'u_DirectionLight.Color': Laya.Shader3D.PERIOD_SCENE};var vs:string = '#include "Lighting.glsl";\n' + "attribute vec4 a_Position;\n"+"attribute vec2 a_Texcoord;\n"+"attribute vec3 a_Normal;\n"+"uniform mat4 u_MvpMatrix;\n"+"uniform mat4 u_WorldMat;\n"+"varying vec2 v_Texcoord;\n"+"varying vec3 v_Normal;\n"+"void main()\n"+"{\n"+"gl_Position = u_MvpMatrix * a_Position;\n"+"mat3 worldMat=mat3(u_WorldMat);\n"+"v_Normal=worldMat*a_Normal;\n"+"v_Texcoord=a_Texcoord;\n"+"}";var vs_shadow:string = '#include "Lighting.glsl";\n' + "attribute vec4 a_Position;\n"+"attribute vec2 a_Texcoord;\n"+"attribute vec3 a_Normal;\n"+"uniform mat4 u_MvpMatrix;\n"+"uniform mat4 u_WorldMat;\n"+"varying vec2 v_Texcoord;\n"+"varying vec3 v_Normal;\n"+"void main()\n"+"{\n"+"vec4 new_Position = vec4(a_Position.x+a_Position.y*0.5, a_Position.y*0.5, a_Position.z, a_Position.w);\n"+"gl_Position = u_MvpMatrix * new_Position;\n"+"mat3 worldMat=mat3(u_WorldMat);\n"+"v_Normal=worldMat*a_Normal;\n"+"v_Texcoord=a_Texcoord;\n"+"}";var ps:string = "#ifdef FSHIGHPRECISION\n"+"precision highp float;\n"+"#else\n"+"precision mediump float;\n"+"#endif\n"+"#include \"Lighting.glsl\";\n"+"varying vec3 v_Normal;\n" +"varying vec2 v_Texcoord;\n"+"uniform sampler2D u_Texture;\n"+"uniform DirectionLight u_DirectionLight;\n"+"void main()\n"+"{\n"+"vec3 normal=normalize(v_Normal);\n"+"vec3 diffuse = (dot(u_DirectionLight.Direction, normal)*0.5+0.5)*u_DirectionLight.Color;\n"+ "gl_FragColor = texture2D(u_Texture, v_Texcoord)+vec4(diffuse,1.0);\n"+"}";    var ps_shadow:string = "#ifdef FSHIGHPRECISION\n"+"precision highp float;\n"+"#else\n"+"precision mediump float;\n"+"#endif\n"+"varying vec3 v_Normal;\n" +"varying vec2 v_Texcoord;\n"+"uniform sampler2D u_Texture;\n"+"void main()\n"+"{\n"+"gl_FragColor=vec4(0,0,0,1);\n"+"}";      var customShader:Laya.Shader3D = Laya.Shader3D.add(ShadowMaterial.NAME);var subShader:Laya.SubShader =new Laya.SubShader(attributeMap, uniformMap,Laya.SkinnedMeshSprite3D.shaderDefines, ShadowMaterial.shaderDefines);subShader.addShaderPass(vs, ps);subShader.addShaderPass(vs_shadow, ps_shadow);customShader.addSubShader(subShader);this.setShaderName(ShadowMaterial.NAME);}set diffuseTexture(texture2D : Laya.Texture2D){this._shaderValues.setTexture(ShadowMaterial.DIFFUSETEXTURE, texture2D);}
}

然后在你要渲染的物体添加ShadowShader材质即可:

        Laya.Mesh.load(resUrl,Laya.Handler.create(this,(mesh : Laya.Mesh)=>{let sprite3D = new Laya.MeshSprite3D(mesh);sprite3D.meshRenderer.material = new ShadowMaterial();}

Laya2.0 实现模拟物体影子shader相关推荐

  1. BRE BRE ProMax 2.0.7047.0 工艺流程模拟软件ProMax\

    BRE BR&E ProMax 2.0.7047.0 工艺流程模拟软件ProMax\   Flac2D v4.0.257\ FLAC3D V3.0.26_FLAC3D 岩土工程软件\ FLAC ...

  2. VC6.0 MFC 模拟弹簧运动(改进版)

    VC6.0 MFC 模拟弹簧运动(改进版) 一.内容描述 运用VC6.0新建工程MFC AppWizard(exe),创建单文档应用程序,画一个弹簧(用矩形代替),下面挂有重物(用圆代替),设定重物质 ...

  3. 《胡闹厨房2》Overcooked 2 for Mac v2.0 烹饪模拟游戏

    Overcooked! 2是由Ghost Town Games开发推出的一款趣味性十足的烹饪模拟游戏,支持多人联机进行.Overcooked! 2 画面清新细腻,人物角色设计萌趣可爱,内置丰富的多种菜 ...

  4. Zemax模拟物体通过透镜成像

    Zemax拥有序列和非序列两种模式,所以利用两种模式分别模拟物体通过透镜成像. 个人认为,模拟物体通过透镜成像,重点在于如何利用Zemax正确的模拟物体.因为物体发光或者说光入射物体后继 续传播与直接 ...

  5. 【TA之路知识总结】shader学习笔记——入门篇——纹理篇——使用一张纹理模拟物体的漫反射和对纹理的处理等相关知识

    文章目录 前言 一.关键代码 二.全部代码 纹理相关知识点: 1.纹理展开技术(展UV): 2.在Unity shader中声明一个纹理的方式: 3.纹理的属性: 4.Unity中对顶点纹理坐标变换的 ...

  6. Linux实战:awl-2.0工具模拟洪水攻击,建立大量的TCP连接

    实战:awl工具模拟洪水攻击,建立大量未完成第二次握手的TCP连接 基于TCP协议的数据传输,需要进行三次握手四次挥手才可以完成.每一次连接都会占用系统内存,直至连接关闭才会释放系统内存.在进行第一次 ...

  7. 基于无线lora通信实现远程采集输出0~10v,0~20ma模拟量信号以及开关量信号

    深圳市综科智控科技开发有限公司是一家专注于生产与研发工业智能自动化设备及软件系统.工业物联网设备及软件系统的高新技术企业. 公司致力于为客户提供从前端数据采集.传感器接入.IO控制.通信组网到云端联网 ...

  8. Python自动化测试系列[v1.0.0][Win32模拟键盘]

    在实际的自动化代码调试过程中,往往Selenium提供的方法不能满足于自动化任务,例如定位某个按钮要完成点击操作,定位正确但就是无法完成点击,此时如果掌握模拟键盘的方法便可以为我们的自动化提供很大的帮 ...

  9. 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算

    目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...

最新文章

  1. LIVE555中RTSP客户端接收媒体流分析及测试代码
  2. QT的QScriptValue类的使用
  3. Index of XML
  4. Windows2003+SQL2000的集群安装手册
  5. elementUI 分页组件的使用 - 踩坑篇
  6. css @语法,@规则 @import @charset @font-face @fontdef @media @page
  7. PHP 连接MySQL数据库
  8. 矩池云上Ubuntu18.6安装COMSOL Multiphysics 5.5
  9. ajax同步时,loading加载不显示(谷歌浏览器)
  10. unix编程艺术中的17点编程原则--设计开发者的至高准则
  11. 什么是城市大数据?大数据如何应用在智慧城市中?
  12. 快速搭建一个直播Demo
  13. i9x系列是服务器CPU吗,Intel推出全新酷睿X系列CPU:i9处理器亮相
  14. 【深度学习环境配置】手把手实战配置深度学习环境(win10版)
  15. 大数据技术之Spark(一)——Spark概述
  16. TOF/结构光camera区别、TOF同时成像深度图、IR图原理?
  17. android 生成kml,Android模拟GPS数据生成kml和nmea文件
  18. 基于MFC的医院门诊系统设计与实现
  19. visio2013激活软件,绝对靠谱,我自己试过可以用
  20. 文案能力应该这样练习

热门文章

  1. 考研宏观经济学让带计算机吗,2019经济学考研考前必背考点:宏观经济学和微观经济学...
  2. 我要发明计算机作文,我想发明电脑鼠作文500字
  3. SDN商业化之路开启,云杉网络坚持像VMware一样只卖软件
  4. 分享三种简单的推广渠道,玩转引流精准粉
  5. 听声辨物,这是AI视觉该干的???|ECCV 2022
  6. 数据链路层(2层 Data Link Layer),交换机
  7. Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题
  8. “共享办公”3年:扩张、沉寂与新一轮厮杀 | 周末
  9. c语言 右移位什么情况补1,关于移位操作,该如何处理
  10. 生活中的定律之刺猬理念