輕量封裝WebGPU渲染系統示例<37>- 多個局部點光源應用于非金屬材質形成的效果(源碼)

當前示例源碼github地址:

https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialMultiLights.ts

當前示例運行效果:

此示例基于此渲染系統實現,當前示例TypeScript源碼如下:

export class BasePbrMaterialMultiLights {private mRscene = new RendererScene();initialize(): void {this.mRscene.initialize({rpassparam: { multisampleEnabled: true } });this.initScene();this.initEvent();}private hdrEnvtex = new SpecularEnvBrnTexture();private createTextures(ns: string): 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` } };let textures = [this.hdrEnvtex, albedoTex, normalTex, aoTex, roughnessTex, metallicTex];return textures;}private initScene(): void {this.initEntities();}private initEntities(): void {let rc = this.mRscene;rc.addEntity(new AxisEntity());let callback = (): void => {let pos = new Vector3(0, 0, 0);// let material = this.createModelEntity(monkeySrc, "grass", pos);// let material = this.createModelEntity(monkeySrc, "rusted_iron", pos);// let material = this.createModelEntity(monkeySrc, "gold", pos);let material = this.createModelEntity(monkeySrc, "plastic", pos);let property = material.property;property.ambient.value = [0.0, 0.2, 0.2];property.albedo.value = [0.7, 0.7, 0.3];property.arms.roughness = 0.8;property.armsBase.value = [0, 0, 0];property.uvParam.value = [2, 2];// property.specularFactor.value = [0.0,0.0,1.1];property.param.scatterIntensity = 32;this.createBoxEntity("plastic", new Vector3(0, -110.0, 0), this.mLightParams[0]);this.createBillboards(this.mLightParams[0]);};let monkeySrc = new ModelEntity({callback,modelUrl: "static/assets/draco/monkey.drc"});}private mLightParams: LightShaderDataParam[] = [];private createModelEntity(srcEntity: ModelEntity, texName: string, position: Vector3DataType): BasePBRMaterial {let rc = this.mRscene;let lightData = this.createLightData(position);let material = new BasePBRMaterial();material.setLightParam(lightData);material.addTextures(this.createTextures(texName));let monkey = new ModelEntity({materials: [material],geometry: srcEntity.geometry,transform: { position, scale: [100, 100, 100], rotation: [0, 90, 0] }});rc.addEntity(monkey);return material;}private createBoxEntity(texName: string, position: Vector3DataType, lightData: LightShaderDataParam): BasePBRMaterial {let rc = this.mRscene;let material = new BasePBRMaterial();material.setLightParam(lightData);material.addTextures(this.createTextures(texName));let box = new BoxEntity({materials: [material],transform: { position, scale: [7, 0.1, 7] }});rc.addEntity(box);return material;}private createLightData(position: Vector3DataType): LightShaderDataParam {let pos = new Vector3().setVector4(position);let pv0 = pos.clone().addBy(new Vector3(0, 200, 0));let pv1 = pos.clone().addBy(new Vector3(200, 0, 0));let pv2 = pos.clone().addBy(new Vector3(0, 0, 200));let pv3 = pos.clone().addBy(new Vector3(-200, 0, 0));let pv4 = pos.clone().addBy(new Vector3(0, 0, -200));let posList = [pv0, pv1, pv2, pv3, pv4];let c0 = new Color4(0.1 + Math.random() * 13, 0.1 + Math.random() * 13, 0.0, 0.00002);let c1 = new Color4(0.0, 0.1 + Math.random() * 13, 1.0, 0.00002);let c2 = new Color4(0.0, 0.1 + Math.random() * 13, 0.1 + Math.random() * 13, 0.00002);let c3 = new Color4(0.1 + Math.random() * 13, 1.0, 0.1 + Math.random() * 13, 0.00002);let c4 = new Color4(0.5, 1.0, 0.1 + Math.random() * 13, 0.00002);let colorList = [c0, c1, c2, c3, c4];let pointLightsTotal = posList.length;let j = 0;let lightsData = new Float32Array(4 * pointLightsTotal);let lightColorsData = new Float32Array(4 * pointLightsTotal);for (let i = 0; i < lightsData.length; ) {const pv = posList[j];pv.w = 0.00002;pv.toArray4(lightsData, i);const c = colorList[j];c.toArray4(lightColorsData, i);j++;i += 4;}let param = { lights: lightsData, colors: lightColorsData, pointLightsTotal };this.mLightParams.push(param);return param;}private createBillboards(param: LightShaderDataParam): void {let rc = this.mRscene;let pointLightsTotal = param.pointLightsTotal;let lights = param.lights;let colors = param.colors;let diffuseTex0 = { diffuse: { url: "static/assets/flare_core_03.jpg" } };for (let i = 0; i < pointLightsTotal; ++i) {let billboard = new BillboardEntity({ size: 50, textures: [diffuseTex0] });let pv = new Vector3().fromArray3(lights, i * 4);let c = new Color4().fromArray3(colors, i * 4);c.a = 1.0;billboard.color = c.scaleBy(0.1);billboard.scale = 1.0;billboard.transform.setPosition(pv);rc.addEntity(billboard);}}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/160152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023年09月 Scratch(二級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 點擊綠旗,運行程序后,舞臺上的圖形是?( ) A:畫筆粗細為4的三角形 B:畫筆粗細為5的六邊形 C:畫筆粗細為4的六角形 D:畫筆粗細為5的三角形 答案:D 第2題 如下圖所示,從所給…

緩存雪崩、擊穿、穿透_解決方案

文章目錄 緩存雪崩、擊穿、穿透1.緩存雪崩造成緩存雪崩解決緩存雪崩 2. 緩存擊穿造成緩存擊穿解決緩存擊穿 3.緩存穿透造成緩存穿透解決緩存穿透 緩存雪崩、擊穿、穿透 一般用戶數據存儲于磁盤&#xff0c;讀寫速度慢。 使用redis作為緩存&#xff0c;相當于數據緩存在內存&a…

GZ031 應用軟件系統開發賽題第1套

2023年全國職業院校技能大賽 應用軟件系統開發賽項(高職組) 賽題第1套 工位號: 2023年4月 競賽說明 一、項目背景 黨的二十大報告指出,要加快建設制造強國、數字中國,推動制造業高端化、智能化、綠色化發展。《IDC中國制造企業調研報告,2021》報告指…

SpringBoot學習筆記-實現微服務:匹配系統(上)

筆記內容轉載自 AcWing 的 SpringBoot 框架課講義&#xff0c;課程鏈接&#xff1a;AcWing SpringBoot 框架課。 CONTENTS 1. 配置WebSocket2. 前后端WebSocket通信2.1 WS通信的建立2.2 加入JWT驗證 3. 前后端匹配業務3.1 實現前端頁面3.2 實現前后端交互邏輯3.3 同步游戲地圖 …

年底了,我勸大家真別輕易離職...

年底了&#xff0c;一些不滿現狀&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在這時候毅然決然地跳槽了。 在此展示一套學習筆記 / 面試手冊&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;還是挺有必要的&#xff0c;它幾乎涵蓋了所有的軟件測試…

銀河麒麟V10-ARM架構-postgresql安裝與部署指南

提示&#xff1a;本人長期接收外包任務。 前言 本文詳細介紹應用源碼進行pgsql的安裝步驟&#xff0c;本文以postgresql-12.0為例。 一、下載并解壓安裝包 ☆下載地址&#xff1a;https://ftp.postgresql.org/pub/source/ 解壓安裝包&#xff0c;創建安裝路徑&#xff1a; …

shopee數據分析軟件:了解市場趨勢,分析競爭對手,優化運營策略

在當今數字化時代&#xff0c;數據已經成為了企業決策的重要依據。對于電商行業來說&#xff0c;數據更是至關重要。如果你想在電商領域中脫穎而出&#xff0c;那么你需要一款強大的數據分析工具來幫助你更好地了解市場、分析競爭對手、優化運營策略。而知蝦數據軟件就是這樣一…

【python學習】中級篇-圖形界面-內置庫Tkinter,用于創建圖形用戶界面(GUI)

Tkinter是Python的一個內置庫&#xff0c;用于創建圖形用戶界面(GUI)。 以下是一個簡單的Tkinter用法示例&#xff1a; import tkinter as tkdef on_click():label.config(text"你好&#xff0c;" entry.get())# 創建主窗口 root tk.Tk() root.title("Tkinte…

【python】[subprocess庫] 優雅的并發模板:并發,多進程管理與交互

需求 1> 創建多個進程&#xff0c;并發執行多個終端指令 2> 每個進程的進程號不同&#xff08;以供記錄&#xff0c;并在異常退出時進行進程清理&#xff09; 3> 每個子進程的輸出可被python變量記錄 &#xff08;別問&#xff0c;就是想看&#xff09; 4> 這些子…

錯題集(c語言)

一、 #include <stdio.h> int main() {int x, y;for (x 30, y 0; x > 10, y<10; x--, y)x / 2, y 2;printf("x%d,y%d\n", x, y);return 0; }思路&#xff1a; 第一次循環開始前&#xff1a;x30&#xff0c;y0&#xff0c;結束&#xff1a;x15&#…

js算法面試題(附答案)

js算法面試題十道 兩數之和 題目&#xff1a;給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那兩個整數&#xff0c;并返回他們的數組下標。 function twoSum(nums, target) {const map new Map();for (let i 0; i < nums.leng…

Java中如何使用雪花算法生成唯一ID

雪花算法&#xff08;Snowflake ID&#xff09;是 Twitter 開源的一種分布式 ID 生成算法&#xff0c;其目的是生成全局唯一的 ID。該算法的核心思想是將一個 64 位的二進制數字分成幾個部分&#xff0c;每個部分表示不同的信息&#xff0c;例如數據中心ID、機器ID、序列號等。…

BUUCTF 梅花香之苦寒來 1

BUUCTF:https://buuoj.cn/challenges 題目描述&#xff1a; 注意&#xff1a;得到的 flag 請包上 flag{} 提交 密文&#xff1a; 下載附件&#xff0c;解壓得到一張.jpg圖片。 解題思路&#xff1a; 1、用010 Editor看了一下&#xff0c;剛開始以為是修改寬高的題&#xff…

羊大師教你如何有效解決工作中的挑戰與壓力?

在現代社會&#xff0c;工作問題一直是許多人頭疼的難題。無論是從工作壓力到職業發展&#xff0c;工作問題不僅會影響個人的心理健康&#xff0c;還可能對整個工作團隊的效率和和諧產生負面影響。因此&#xff0c;如何有效解決工作問題成為了每個職場人士都需要面對的挑戰。 …

Web前端—移動Web第四天(vw適配方案、vw和vh的基本使用、綜合案例-酷我音樂)

版本說明 當前版本號[20231122]。 版本修改說明20231122初版 目錄 文章目錄 版本說明目錄移動 Web 第四天01-vw適配方案vw和vh基本使用vw布局vh布局混用問題 02-綜合案例-酷我音樂準備工作頭部布局頭部內容搜索區域banner 區域標題公共樣式排行榜內容推薦歌單布局推薦歌單內…

Cuda out of memory原因以及解決辦法

Cuda out of memory原因以及解決辦法 文章目錄 Cuda out of memory原因以及解決辦法batch_size設置過大 batch_size設置過大 最近在做對抗訓練方面的實驗&#xff0c;當batch_size設置為256的時候&#xff0c;出現cuda out of memory. 當將batch_size修改為128時&#xff0c;則…

mysql使用--連接查詢

1.連接查詢 如&#xff1a;SELECT * FROM t1, t2; 上述FROM語句將t1表&#xff0c;t2表連接。 假設t1表含n條記錄&#xff0c;t2表含m條記錄&#xff0c;則t1, t2得到的表將包含n*m條記錄。 我們以一個混合連接&#xff0c;過濾的查詢分析語句執行過程。 如&#xff1a;SELECT…

thinkphp文件夾生成zip壓縮包

一、準備工作&#xff0c;使用phpinfo()查看有沒有zip擴展 <?php echo phpinfo(); ?>Thinkphp使用PHP自帶的ZipArchive壓縮文件或文件夾 顯示enabled 說明已經配置好 如果沒有安裝擴展的&#xff0c;請參照以下方法&#xff1a; 1、下載對應版本的擴展包&#xff1a…

Java操作excel之poi

1. 創建Excel 1.1 創建新Excel工作簿 引入poi依賴 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar…