轻量封装WebGPU渲染系统示例<8>- 渲染器基本场景管理(源码)

news2024/11/17 7:51:41

当前示例源码github地址:

https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/RSceneTest.ts

此示例渲染系统实现的特性:

1. 用户态与系统态隔离。

2. 高频调用与低频调用隔离。

3. 面向用户的易用性封装。

4. 渲染数据和渲染机制分离。

5. 用户操作和渲染系统调度并行机制。

当前示例运行效果:

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

export class RSceneTest {
	private mRscene = new RendererScene();

	geomData = new GeomDataBuilder();

	initialize(): void {
		console.log("RSceneTest::initialize() ...");

		this.mRscene.initialize();

		this.initEvent();

		const shdSrc = {
			vertShaderSrc: { code: vertWGSL, uuid: "vertShdCode" },
			fragShaderSrc: { code: fragWGSL, uuid: "fragShdCode" }
		};
		const materials = [
			this.createMaterial(shdSrc, [new WGImage2DTextureData("static/assets/box.jpg")], ["solid"], "back"),
			this.createMaterial(shdSrc, [new WGImage2DTextureData("static/assets/brickwall_big512.jpg")], ["solid"], "back"),
			this.createMaterial(shdSrc, [new WGImage2DTextureData("static/assets/metal_02.jpg")], ["solid"], "back")
		]
		this.createEntities(materials, new Vector3(0, 200, 0));
	}

	private initEvent(): void {
		const rc = this.mRscene;
		rc.addEventListener(MouseEvent.MOUSE_DOWN, this, this.mouseDown);
		new MouseInteraction().initialize(rc, 0, false).setAutoRunning(true);
	}
	private mouseDown(evt: MouseEvent): void {
		console.log("mousedown evt call ...");
	}
	private createMaterial(shdSrc: WGRShderSrcType, texDatas?: WGImage2DTextureData[], blendModes: string[] = [], faceCullMode = "back"): WGMaterial {
		let pipelineDefParam = {
			depthWriteEnabled: true,
			faceCullMode,
			blendModes: [] as string[]
		};

		pipelineDefParam.blendModes = blendModes;

		const texTotal = texDatas ? texDatas.length : 0;

		const material = new WGMaterial({
			shadinguuid: "base-material-tex" + texTotal,
			shaderCodeSrc: shdSrc,
			pipelineDefParam
		});

		let ufv = new WGRStorageValue(new Float32Array([1, 1, 1, 1]));
		material.uniformValues = [ufv];
		material.addTextureWithDatas(texDatas);

		return material;
	}

	private createGeom(rgd: GeomRDataType): WGGeometry {
		const geometry = new WGGeometry()
			.addAttribute({ shdVarName: "position", data: rgd.vs, strides: [3] })
			.addAttribute({ shdVarName: "uv", data: rgd.uvs, strides: [2] })
			.setIndexBuffer({ name: "geomIndex", data: rgd.ivs });
		return geometry;
	}
	private createEntities(materials: WGMaterial[], pv?: Vector3): void {
		const rc = this.mRscene;
		pv = pv ? pv : new Vector3();

		let sphGeom = this.createGeom(this.geomData.createSphere(30, 30, 30));
		let boxGeom = this.createGeom(this.geomData.createCube(100));
		let torusGeom = this.createGeom(this.geomData.createTorus(100));

		const floor = new Entity3D();
		floor.materials = [materials[0]];
		floor.geometry = boxGeom;
		floor.transform.setPosition(new Vector3(0, -150, 0).addBy(pv));
		floor.transform.setScaleXYZ(8, 0.1, 8);
		rc.addEntity(floor);

		for (let i = 0; i < 6; ++i) {
			const torus = new Entity3D();
			torus.materials = [materials[1]];
			torus.geometry = torusGeom;
			torus.transform.setPosition(new Vector3(-200 + i * 80, 0, 0).addBy(pv));
			rc.addEntity(torus);
		}
		for (let i = 0; i < 12; ++i) {
			const sphere = new Entity3D();
			sphere.materials = [materials[2]];
			sphere.geometry = sphGeom;
			sphere.transform.setPosition(new Vector3(-400 + i * 80, 0, 0).addBy(pv));
			rc.addEntity(sphere);
		}
	}

	run(): void {
		this.mRscene.run();
	}
}

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

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

相关文章

【JavaSE专栏58】“Java构造函数:作用、类型、调用顺序和最佳实践“ ⚙️⏱️

解析Java构造函数&#xff1a;作用、类型、调用顺序和最佳实践" &#x1f680;&#x1f4da;&#x1f50d;&#x1f914;&#x1f4dd;&#x1f504;⚙️⏱️&#x1f4d6;&#x1f310; 摘要引言1. 什么是构造函数 &#x1f914;2. 构造函数的类型与用途 &#x1f4dd;1.…

nodejs+vue学生考勤综合平台的设计与实现-计算机毕业设计

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “学生考勤综合平台”是基于Mysql数据库&#xff0c;在 程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。 因此&#xff0c;国内外技术…

骑行在路上,VELO Swan O带你感受生活真实的呼吸

过去&#xff0c;人们骑车是为了更快抵达更远的地方。如今&#xff0c;越来越多身处快节奏生活环境中的都市人&#xff0c;正在通过骑行“慢”下来。骑着车穿梭在城市间&#xff0c;暂时跳脱出两点一线的既定模式&#xff0c;在路途上感受人与环境一切微妙的变化&#xff0c;真…

python爬虫报错:This version of ChromeDriver only supports Chrome version 114

使用selenium爬取网页数据&#xff0c;一运行程序就报错&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 117.0.5938.149 w…

zookeeper:简介及常用命令

目录 一、Zookeeper简介 二、Zookeeper服务端常用命令 1、启动ZooKeeper服务 2、查看ZooKeeper服务状态 3、停止ZooKeeper服务 4、重启ZooKeeper服务 三、Zookeeper客户端常用命令 1、连接ZooKeeper服务端 2、断开连接&#xff1a;quit 3、查看命令帮助&#xff1a;help…

【C++进阶】异常

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

MATLAB | 万圣节来画个简单的可爱鬼叭!

万圣节要到啦一起来画个可爱鬼吧~ 代码比较的短&#xff1a; 完整代码 figure(Units,normalized,Position,[.2,.1,.52,.72]); axgca;hold on;axis off; ax.DataAspectRatio[1,1,1]; ax.YDirreverse; ax.XLim[0,100]; ax.YLim[0,100]; [X,Y]meshgrid(linspace(0,1,200)); Zsq…

当任务数超过线程池的核心线程数时,如何让它不进入队列,而是直接启用最大线程数

线程池工作原理 当我们提交一个任务到线程池的时候&#xff0c;它的工作原理分为四步&#xff1a; 第一步&#xff0c;预热核心线程 第二步&#xff0c;把任务添加到阻塞队列 第三步&#xff0c;如果添加到阻塞队列失败&#xff0c;则创建非核心线程增加处理效率 第四步&#x…

nodejs+python+php+微信小程序-基于安卓android的健身服务应用APP-计算机毕业设计

考虑到实际生活中在健身服务应用方面的需要以及对该系统认真的分析&#xff0c;将系统权限按管理员和用户这两类涉及用户划分。  则对于进一步提高健身服务应用发展&#xff0c;丰富健身服务应用经验能起到不少的促进作用。 健身服务应用APP能够通过互联网得到广泛的、全面的宣…

轻量封装WebGPU渲染系统示例<10>- 容器(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/REntity3DContainerTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5.…

Doris数据库FE——全局事务状态机

begin; create database db1; ERROR 1105 (HY000): TException, msg: org.apache.thrift.TException: This is in a transaction, only insert, commit, rollback is acceptable从上述报错可以看出begin、commit、rollback等操作只有和insert操作结合使用。从上述可以猜测Doris…

【腾学汇的第1个实验代码】应用Matplotlib绘制图标分析

import matplotlib.pyplot as plt import numpy as np #Jupter Notebook 里面显示图片 %matplotlib inline#1.1.1 线形图 np.random.seed(42) #产生随机种子 y np.random.randn(30) #产生随机数 plt.plot(y, "r--o")#绘图&#xff1a;红色--虚线--圆形# 1.1.2 线条颜…

【【哈希应用】位图/布隆过滤器】

位图/布隆过滤器 位图位图概念位图的使用位图模拟实现 布隆过滤器布隆过滤器概念布隆过滤器的使用布隆过滤器模拟实现 位图/布隆过滤器应用&#xff1a;海量数据处理哈希切分 位图 位图概念 计算机中通常以位bit为数据最小存储单位&#xff0c;只有0、1两种二进制状态&#x…

2D网页游戏开发引擎

2D网页开发引擎是用于创建富有交互性和动画效果的2D网页应用程序的工具。以下是一些常用的2D网页开发引擎以及它们的主要特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Phaser&#xff1a; P…

【ES专题】ElasticSearch快速入门

目录 前言从一个【搜索】说起 阅读对象前置知识笔记正文一、全文检索1.1 什么是【全文检索】1.2 【全文检索】原理1.3 什么是倒排索引 二、ElasticSearch简介2.1 ElasticSearch介绍2.2 ElasticSearch应用场景2.3 数据库横向对比 三、ElasticSearch环境搭建3.1 Windows下安装3.2…

Qlik Sense Enterprise 忘记PostgreSQL密码

在 Windows 上安装 Qlik Sense Enterprise 期间会提供密码。如果您忘记了该密码&#xff0c;则无法找回&#xff1b;但是&#xff0c;可以按照以下步骤重置密码。 如何在 Qlik 中重置忘记的 PostgreSQL 密码... - Qlik Community - 1712725 如果该过程完成后记录了密码错误的…

Java架构师面向对象技术建模

目录 1 导学2 面向对象开发2.1 面向对象需求建模2.2 面向对象的设计原则3 统一建模语言UML4 设计模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 面向对象开发 对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的个实体,是构成系统的一个基…

yolov5 pt转成nccn_yolov5

一&#xff1a;转换环境准备 python版本为Python 3.8.0&#xff0c;需要安装对应的版本包&#xff0c;torch1.10.0 torchvision0.11.0 torchaudio0.10.0 pip3 install torch1.10.0 torchvision0.11.0 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html…

小红书平台用户数据分析与可视化

管理器、网页下载器、网页解析器、输出管理器这四个模块去搭建一个爬虫框架&#xff0c;将爬虫流程统一化&#xff0c;将通用的功能进行抽象&#xff0c;减少重复工作。要求实现的爬虫框架可以进行分布式爬取&#xff0c;解决爬虫的统一调度和统一去重&#xff0c;以及存储问题…

Ceph入门到精通-bluestore IO流程及导入导出

bluestore 直接管理裸设备&#xff0c;实现在用户态下使用linux aio直接对裸设备进行I/O操作 写IO流程&#xff1a; 一个I/O在bluestore里经历了多个线程和队列才最终完成&#xff0c;对于非WAL的写&#xff0c;比如对齐写、写到新的blob里等&#xff0c;I/O先写到块设备上&am…