轻量封装WebGPU渲染系统示例<47>- 多种光源(源码)

当前示例源码github地址:

https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MultiLightsShading.ts

当前示例运行效果:

此示例基于此渲染系统实现,当前示例TypeScript源码如下:

export class MultiLightsShading {private mRscene = new RendererScene();initialize(): void {this.mRscene.initialize({canvasWith: 512,canvasHeight: 512,mtplEnabled: true,rpassparam:{multisampled: true}});this.initScene();this.initEvent();}private hdrEnvtex = new SpecularEnvBrnTexture();private createMaskTextures(ns: string, maskns = 'displacement_01.jpg'): WGTextureDataDescriptor[] {const albedoTex = { albedo: { url: `static/assets/pbr/${ns}/albedo.jpg` } };const normalTex = { normal: { url: `static/assets/pbr/${ns}/normal.jpg` } };const aoTex = { ao: { url: `static/assets/pbr/${ns}/ao.jpg` } };const roughnessTex = { roughness: { url: `static/assets/pbr/${ns}/roughness.jpg` } };const metallicTex = { metallic: { url: `static/assets/pbr/${ns}/metallic.jpg` } };// mask textureconst opacityTex = { opacity: { url: `static/assets/${maskns}` } };let textures = [this.hdrEnvtex,albedoTex,normalTex,aoTex,roughnessTex,metallicTex,opacityTex] as WGTextureDataDescriptor[];return textures;}private createBaseTextures(): WGTextureDataDescriptor[] {const albedoTex = { albedo: { url: `static/assets/pbrtex/rough_plaster_broken_diff_1k.jpg` } };const normalTex = { normal: { url: `static/assets/pbrtex/rough_plaster_broken_nor_1k.jpg` } };const armTex = { arm: { url: `static/assets/pbrtex/rough_plaster_broken_arm_1k.jpg` } };let textures = [this.hdrEnvtex,albedoTex,normalTex,armTex] as WGTextureDataDescriptor[];return textures;}private createLightData(): MtLightDataDescriptor {let ld = { pointLights: [], directionLights: [] } as MtLightDataDescriptor;let pLight = new PointLight({ color: [20, 0, 0], position: [0, 200, 0] });ld.pointLights.push(pLight);pLight = new PointLight({ color: [10, 10, 0], position: [-150, 200, 150] });ld.pointLights.push(pLight);let dLight = new DirectionLight({ color: [2, 0, 2], direction: [-1, -1, 0] });ld.directionLights.push(dLight);return ld;}private initScene(): void {let rc = this.mRscene;let mtpl = rc.renderer.mtpl;mtpl.light.lightData = this.createLightData();mtpl.shadow.param.direction = [1, 1, 0];mtpl.shadow.param.intensity = 0.5;mtpl.shadow.param.radius = 6;mtpl.fog.fogColor.value = [0.3, 0.7, 0.2];let position = [0, 50, 180];let materials = this.createMaterials(true);let sphere = new SphereEntity({radius: 150.0,materials,transform: { position }});rc.addEntity(sphere);position = [0, 50, -180];materials = this.createMaterials(true, true, 'back', [4, 1]);let torus = new TorusEntity({axisType: 1,materials,transform: { position }});rc.addEntity(torus);position = [0, -110, 0];materials = this.createMaterials(true, false, 'back', [3, 3]);let plane = new PlaneEntity({axisType: 1,materials,extent: [-600, -600, 1200, 1200],transform: { position }});rc.addEntity(plane);position = [0, 0, 0];materials = this.createMaterials(false, false, 'front', [2, 2]);let envBox = new CubeEntity({cubeSize: 2050.0,normalScale: -1.0,materials,transform: { position }});rc.addEntity(envBox);}private createMaterials(shadowReceived = false, shadow = true, faceCullMode = 'back', uvParam?: number[]): BaseMaterial[] {let textures0 = this.createBaseTextures();let textures1 = this.createMaskTextures("plastic");let textures2 = this.createMaskTextures("wall", 'circleWave_disp.png');let material0 = this.createMaterial(textures0, ["solid"], 'less', faceCullMode);this.applyMaterialPPt(material0, shadowReceived, shadow);let material1 = this.createMaterial(textures1, ["transparent"], 'less-equal', faceCullMode);material1.property.inverseMask = false;this.applyMaterialPPt(material1, shadowReceived, shadow);let material2 = this.createMaterial(textures2, ["transparent"], 'less-equal', faceCullMode);material2.property.inverseMask = true;this.applyMaterialPPt(material2, shadowReceived, shadow);let list = [material0, material1, material2];if (uvParam) {for (let i = 0; i < list.length; ++i) {list[i].property.uvParam.value = uvParam;}}return list;}private applyMaterialPPt(material: BaseMaterial, shadowReceived = false, shadow = true): void {let ppt = material.property;ppt.ambient.value = [0.0, 0.2, 0.2];ppt.albedo.value = [0.7, 0.7, 0.3];ppt.arms.roughness = 0.8;ppt.armsBase.value = [0, 0, 0];ppt.param.scatterIntensity = 4;ppt.shadow = shadow;ppt.lighting = true;ppt.shadowReceived = shadowReceived;ppt.exp2Fogging = true;}private createMaterial(textures: WGTextureDataDescriptor[], blendModes: string[], depthCompare = 'less', faceCullMode = 'back'): BaseMaterial {let pipelineDefParam = {depthWriteEnabled: true,faceCullMode,blendModes,depthCompare};let material = new BaseMaterial({ pipelineDefParam });material.addTextures(textures);return material;}private initEvent(): void {const rc = this.mRscene;rc.addEventListener(MouseEvent.MOUSE_DOWN, this.mouseDown);new MouseInteraction().initialize(rc, 0, false).setAutoRunning(true);}private mouseDown = (evt: MouseEvent): void => { };run(): void {this.mRscene.run();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/215500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 DAC+串口

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、DAC是什么&#xff1f;二、STM32 DAC1.什么型号有DAC2. 简介3. 主要特点4. DAC框图5. DAC 电压范围和引脚 三、程序步骤总结 前言 提示&#xff1a;这里可…

Runtime

Runtime 概念&#xff1a; Runtime是一套底层纯C语言API&#xff0c;OC代码最终都会被编译器转化为运行时代码&#xff0c;通过消息机制决定函数调用方式&#xff0c;这也是OC作为动态语言使用的基础。Runtime的最大特征就是实现了OC语言的动态特性。 消息机制原理 在Objec…

代码随想录27期|Python|Day13|栈与队列|239. 滑动窗口最大值 (一刷至少需要理解思路)|347.前 K 个高频元素 (一刷至少需要理解思路)

239. 滑动窗口最大值 单调队列 滑动窗口中的队列一直保持出口大&#xff0c;入口小的顺序。&#xff08;图&#xff1a;代码随想录&#xff09; 1、每次有新的元素进入&#xff08;也就是滑动窗口移动后&#xff09;&#xff0c;都需要先和入口的元素比较大小&#xff0c;如果…

BDD100K数据集

官网:BDD100K (vis.xyz)​​​​​ 论文&#xff1a;[1805.04687] BDD100K: A Diverse Driving Dataset for Heterogeneous Multitask Learning (arxiv.org) github:bdd100k/bdd100k: Toolkit of BDD100K Dataset for Heterogeneous Multitask Learning - CVPR 2020 Oral Pap…

特发性震颤会导致其他并发症吗?

特发性震颤是一种较为常见的神经系统疾病&#xff0c;其主要症状是姿势性震颤&#xff0c;常常在手部开始&#xff0c;并可逐渐累及头部、下肢等其他部位。虽然特发性震颤的主要症状是震颤&#xff0c;但该病也可能导致其他并发症。下面将详细介绍特发性震颤可能引起的并发症。…

灵茶 - 2023 - 12 - 12

链接 Problem - 620C - Codeforces 思路 : 贪心 : 对于每一段区间&#xff0c;从前往后贪&#xff0c;如果前面一段区间有重复数字&#xff0c;那么就直接合并成答案的一段区间&#xff0c;然后继续寻找下一段区间&#xff0c;对于最后一段&#xff0c;如果没有匹配的话&am…

自定义kafka客户端消费topic

文章目录 自定义kafka客户端消费topic结论1 背景2 spring集成2.1.8.RELEASE版本不支持autoStartup属性3 自定义kafka客户端消费topic3.1 yml配置3.2 KafkaConfig客户端配置3.3 手动启动消费客户端 自定义kafka客户端消费topic 结论 使用自定义的KafkaConsumer给spring进行管理…

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码

人体关键点检测2&#xff1a;Pytorch实现人体关键点检测(人体姿势估计)含训练代码 目录 人体关键点检测2&#xff1a;Pytorch实现人体关键点检测(人体姿势估计)含训练代码 1. 前言 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1…

Android - 分区存储 MediaStore、SAF

官方页面 参考文章 一、概念 分区存储&#xff08;Scoped Storage&#xff09;的推出是针对 APP 访问外部存储的行为&#xff08;乱建乱获取文件和文件夹&#xff09;进行规范和限制&#xff0c;以减少混乱使得用户能更好的控制自己的文件。 公有目录被分为两大类&#xff1a;…

会员运营常用的ChatGPT通用提示词模板

会员体系&#xff1a;如何建立和完善会员体系&#xff1f; 会员等级&#xff1a;如何设定会员等级及权益&#xff1f; 会员留存&#xff1a;如何提高会员留存率&#xff1f; 会员活跃度&#xff1a;如何提高会员活跃度&#xff1f; 会员招募&#xff1a;如何招募新会员&…

ubuntu install sqlmap

refer: https://github.com/sqlmapproject/sqlmap 安装sqlmap&#xff0c;可以直接使用git 克隆整个sqlmap项目&#xff1a; git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev 2.然后进入sqlmap-dev&#xff0c;使用命令&#xff1a; python s…

静态代理IP搭建步骤,静态匿名在线代理IP如何使用?

静态代理搭建步骤 1. 确定需求 在搭建静态代理之前&#xff0c;需要明确自己的需求&#xff0c;包括代理服务器的位置、访问速度、匿名性、安全性等方面的要求。 2. 选择代理服务器提供商 可以选择自己购买服务器搭建代理&#xff0c;也可以选择使用云服务提供商的代理服务…

【Python百宝箱】探索强化学习算法的利器:航行在AI之海的罗盘指南

强化学习的工具宝盒&#xff1a;探索各色瑰宝&#xff0c;点亮智能之旅 前言 人工智能和强化学习正成为推动科技进步的重要力量。在这个领域中&#xff0c;使用适当的库和工具可以加速算法研发和应用部署的过程。本文将深入探索一系列具有代表性的强化学习库和工具&#xff0…

有趣的数学 用示例来阐述什么是初值问题二

一、示例 解决以下初值问题。 解决这个初始值问题的第一步是找到一个通用的解决方案。为此&#xff0c;我们找到微分方程两边的反导数。 即 我们能够对两边进行积分&#xff0c;因为y项是单独出现的。请注意&#xff0c;有两个积分常数&#xff1a;C1和C2。求解前面的方程y给出…

电工--半导体器件

目录 半导体的导电特性 PN结及其单向导电性 二极管 稳压二极管 双极型晶体管 半导体的导电特性 本征半导体&#xff1a;完全纯净的、晶格完整的半导体 载流子&#xff1a;自由电子和空穴 温度愈高&#xff0c;载流子数目愈多&#xff0c;导电性能就愈好 型半导体&…

28. Python Web 编程:Django 基础教程

目录 安装使用创建项目启动服务器创建数据库创建应用创建模型设计路由设计视图设计模版 安装使用 Django 项目主页&#xff1a;https://www.djangoproject.com 访问官网 https://www.djangoproject.com/download/ 或者 https://github.com/django/django Windows 按住winR 输…

docker build构建报错:shim error: docker-runc not installed on system

问题&#xff1a; docker构建镜像时报错&#xff1a;shim error: docker-runc not installed on system 解决&#xff1a; ln -s /usr/libexec/docker/docker-runc-current /usr/bin/docker-runc

MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)

目录 介绍 表锁 语法 特点 元数据锁 介绍 演示 意向锁 介绍 分类 演示 介绍 表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁&#xff0c;主要…

选择排序和堆排序

目录 前言 一.选择排序 1.思想 2.实现 3.特点 二.堆排序 1.思想 2.实现 3.特点 前言 排序算法是计算机科学中的基础工具之一&#xff0c;对于数据处理和算法设计有着深远的影响。了解不同排序算法的特性和适用场景&#xff0c;能够帮助程序员在特定情况下…

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(一)搭建项目

前言 最近两个月一直在忙公司的项目&#xff0c;上班时间经常高强度写代码&#xff0c;下班了只想躺着&#xff0c;没心思再学习、做自己的项目了。最近这几天轻松一点了&#xff0c;终于有时间 摸鱼了 做自己的事了&#xff0c;所以到现在我总算是搭起来一个比较完整的后台管…