輕量封裝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.pswp.cn/news/215500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215500.shtml
英文地址,請注明出處:http://en.pswp.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;所以到現在我總算是搭起來一個比較完整的后臺管…