当前位置: 首页 > article >正文

轻量封装WebGPU渲染系统示例<3>-纹理立方体(源码)

当前示例源码github地址:

https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/ImgTexturedCube.ts

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

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

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

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

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

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

当前示例运行效果:

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

export class ImgTexturedCube {

	geomData = new GeomDataBuilder();
	renderer = new WGRenderer();

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

		const shdSrc = {
			vertShaderSrc: { code: vertWGSL, uuid: "vtxShdCode" },
			fragShaderSrc: { code: fragWGSL, uuid: "fragShdCode" }
		};
		const material = this.createMaterial(shdSrc, [new WGImage2DTextureData("static/assets/box.jpg")]);
		this.createEntity([material]);
	}

	private createMaterial(
		shdSrc: WGRShderSrcType,
		texDatas?: WGImage2DTextureData[]
	): WGMaterial {

		let pipelineDefParam = {
			faceCullMode: "back"
		};
		const texTotal = texDatas ? texDatas.length : 0;

		const material = new WGMaterial({
			shadinguuid: "base-material-tex" + texTotal,
			shaderCodeSrc: shdSrc,
			pipelineDefParam
		});
		if (texTotal > 0) {
			const texWrappers: WGTextureWrapper[] = new Array(texTotal);
			for (let i = 0; i < texTotal; ++i) {
				texWrappers[i] = new WGTextureWrapper({ texture: { data: texDatas[i], shdVarName: "texture" + i } });
			}
			material.textures = texWrappers;
		}
		return material;
	}
	private createEntity(materials: WGMaterial[]): Entity3D {

		const renderer = this.renderer;

		const rgd = this.geomData.createCubeWithSize(200);
		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 });

		const entity = new Entity3D();
		entity.materials = materials;
		entity.geometry = geometry;

		renderer.addEntity(entity);
		return entity;
	}

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


http://www.kler.cn/a/107085.html

相关文章:

  • 【go从零单排】JSON序列化和反序列化
  • Spring MVC 与 JSP 数据传输
  • 软件测试面试2024最新热点问题
  • activiti5基础和springboot整合
  • 使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能
  • 2024开发者浏览器必备扩展,不允许还有人不知道~
  • JVM进阶(3)
  • macOS Sonoma 14.1正式版(23B74)发布(可下载黑白苹果镜像)
  • LabVIEW开发基于图像处理的车牌检测系统
  • C/C++面试常见问题——const关键字的作用和用法
  • DAC芯片AD5689控制代码SPI接口FPGA代码,视频
  • Qt文件 I/O 操作
  • 深度学习标注工具(包括自动标注)总结——持续更新
  • 不同网段的IP怎么互通
  • c语言基础:L1-060 心理阴影面积
  • 一文详解汽车电CAN总线
  • SpringMVC(下)
  • mysql bin_log日志恢复数据
  • Android framework服务命令行工具框架 - Android13
  • 高速下载b站视频的解决方案
  • UI自动化测试是什么?什么项目适合做UI自动化测试
  • 24年FRM备考知识点以及一级公式表
  • 【机器学习】KNN算法-模型选择与调优
  • 力扣每日一题73:矩阵置零
  • 2023CSP-J题解
  • python 字典dict和列表list的读取速度问题, range合并