轻量封装WebGPU渲染系统示例<9>- 基本光照(源码)

news2024/12/22 19:28:19

当前示例源码github地址:

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

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

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

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

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

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

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

当前示例运行效果:

顶点shader:

@group(0) @binding(0) var<uniform> objMat : mat4x4<f32>;
@group(0) @binding(1) var<uniform> viewMat : mat4x4<f32>;
@group(0) @binding(2) var<uniform> projMat : mat4x4<f32>;

struct VertexOutput {
  @builtin(position) Position : vec4<f32>,
  @location(0) pos: vec4<f32>,
  @location(1) uv : vec2<f32>,
  @location(2) normal : vec3<f32>
}

fn inverseM33(m: mat3x3<f32>)-> mat3x3<f32> {
    let a00 = m[0][0]; let a01 = m[0][1]; let a02 = m[0][2];
    let a10 = m[1][0]; let a11 = m[1][1]; let a12 = m[1][2];
    let a20 = m[2][0]; let a21 = m[2][1]; let a22 = m[2][2];
    let b01 = a22 * a11 - a12 * a21;
    let b11 = -a22 * a10 + a12 * a20;
    let b21 = a21 * a10 - a11 * a20;
    let det = a00 * b01 + a01 * b11 + a02 * b21;
    return mat3x3<f32>(
		vec3<f32>(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11)) / det,
                vec3<f32>(b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10)) / det,
                vec3<f32>(b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det);
}

@vertex
fn main(
  @location(0) position : vec3<f32>,
  @location(1) uv : vec2<f32>,
  @location(2) normal : vec3<f32>
) -> VertexOutput {
  var output : VertexOutput;
  output.Position = projMat * viewMat * objMat * vec4(position.xyz, 1.0);
  output.uv = uv;

  let mat33 = mat3x3(objMat[0].xyz, objMat[1].xyz, objMat[2].xyz);
  let invMat33 = inverseM33(mat33);
  output.normal = normalize( normal * invMat33 );

  var pv: vec4<f32>;
  pv = vec4<f32>(position, 1.0);
  output.pos = pv;
  return output;
}

片段shader:

@group(0) @binding(3) var<storage> param: vec4f;
@group(0) @binding(4) var sampler0: sampler;
@group(0) @binding(5) var texture0: texture_2d<f32>;

const lightDirec = vec3<f32>(0.3,0.6,0.9);

@fragment
fn main(
  @location(0) pos: vec4<f32>,
  @location(1) uv: vec2<f32>,
  @location(2) normal: vec3<f32>
) -> @location(0) vec4<f32> {

  let nDotL = max(dot(normal, lightDirec), 0.0);
  var color4 = textureSample(texture0, sampler0, uv) * param;
  color4 = vec4(color4.xyz * (vec3<f32>(1.0 - param.w) + vec3<f32>((param.w) * nDotL) * param.xyz), color4.w);
  return color4;
}

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

export class SimpleLightTest {
	private mObjs: TransObject[] = [];

	private mRscene = new RendererScene();

	geomData = new GeomDataBuilder();

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

		const rc = this.mRscene;
		rc.initialize();

		this.initEvent();

		const shdSrc = {
			vertShaderSrc: { code: vertWGSL, uuid: "vertShdCode" },
			fragShaderSrc: { code: fragWGSL, uuid: "fragShdCode" }
		};

		for (let i = 0; i < 10; ++i) {
			let material = this.createMaterial(shdSrc, [new WGImage2DTextureData("static/assets/white.jpg")], new Color4().randomRGB(1.0, 0.2));
			let scale = Math.random() * 0.5 + 0.5;
			const entity = this.createEntity([material]);
			const obj = new TransObject();
			obj.entity = entity;
			obj.scale.setXYZ(scale, scale, scale);
			obj.rotationSpdv.setXYZ(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);
			obj.initialize(800);
			this.mObjs.push(obj);
		}
	}
	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[],
		color?: Color4,
		blendModes: string[] = ["solid"],
		faceCullMode = "back"
	): WGMaterial {
		let pipelineDefParam = {
			depthWriteEnabled: true,
			faceCullMode,
			blendModes: [] as string[]
		};

		if (!color) color = new Color4(1.0, 1.0, 1.0);

		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([color.r, color.g, color.b, 0.9]));
		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] })
			.addAttribute({ shdVarName: "normal", data: rgd.nvs, strides: [3] })
			.setIndexBuffer({ name: "geomIndex", data: rgd.ivs });
		return geometry;
	}
	private createEntity(materials: WGMaterial[], pv?: Vector3): Entity3D {
		const rc = this.mRscene;
		let geometry = this.mObjs.length > 0 ? this.mObjs[0].entity.geometry : null;
		geometry = geometry ? geometry : this.createGeom(this.geomData.createCube(200));

		const entity = new Entity3D();
		entity.materials = materials;
		entity.geometry = geometry;
		entity.transform.setPosition(pv ? pv : new Vector3());


		rc.addEntity(entity);
		return entity;
	}

	run(): void {
		for (let i = 0; i < this.mObjs.length; ++i) {
			this.mObjs[i].run();
		}
		this.mRscene.run();
	}
}

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

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

相关文章

初始SpringSecurity

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

【JavaSE专栏55】Java集合类HashTable解析

&#x1f332;Java集合类HashTable解析 &#x1f332;Java集合类HashTable解析摘要引言Hashtable是什么&#xff1f;Hashtable vs. HashMap&#xff1a;何时使用Hashtable&#xff1f;多线程环境&#xff1a;历史遗留系统&#xff1a;不需要进行特殊操作&#xff1a; Hashtable…

Mysql系列 -索引数据结构

索引就是排好序的数据结构&#xff0c;可以帮助我们快速的查找到数据&#xff0c;那么底层的数据到底是如何存储的呢&#xff1f; 为什么InnoDB 用的是Btree 存储结构&#xff1f; 大家可以看看这个可视化的网站 数据结构和算法的可视化工具 可以看到数据结构里面有链表&…

@ModelAttribute注解之如何使用postman传递参数

代码实例&#xff1a; GetMapping("/selectOpenList")ApiOperation(value "公开问卷列表")AnonymityAnnotation(access true)public WebResponse<PageInfo<QuestionnaireVo>> selectOpenList(ModelAttribute QuestionnaireDto dto){xxxxxxxx…

如何在3dMax中创建具有自定义图标和MaxScript的自定义按钮?

如何在3dMax中创建自定义按钮? 在本教程中,将向您展示如何创建具有自定义图标组和MaxScript的自定义按钮。 在3dMax中,主工具栏上有许多按钮。许多3dMax用户会问:是否可以制作一个带有自定义图像图标的自定义按钮,该按钮后面有自定义MaxScript代码来实现一定的功能?那么…

rust代码学习笔记(未完待续10/31)

文章目录 一、案例一&#xff1a;读取输入打印出来二、案例二&#xff1a;&#xff08;引入新包&#xff09;猜数字游戏三、案例三&#xff1a;循环猜测数字四、案例四&#xff1a;猜字游戏&#xff08;彩色版本&#xff09;五、rust一些注意事项1&#xff09;声明变量默认是不…

C# 如何反射获取常量值

首先&#xff0c;常量是一个字段&#xff0c;所以需要从字段中获取该值。 但是需要传入的BindingFlags是什么&#xff0c;与其盲猜&#xff0c;不如直接反射所有字段值&#xff0c;查看其中的常量有哪些特性和bool值来判断。 ...static void Main(string[] args){var type typ…

禁止使用Lombok,在Lombok的加持下,“小狗”.equals(“老狗”) = true

目录 一、禁止使用Lombok1、jdk版本问题2、被迫营业3、可读性差 二、Lombok中的真实小坑三、看看编译后的代码&#xff0c;到底怎么回事1、编译class2、添加一个注解EqualsAndHashCode(callSuper true) 大家好&#xff0c;我是哪吒。 一、禁止使用Lombok 我有一个同学&#…

VASSAL 3.7.4 发布,开源棋牌游戏构建引擎

导读VASSAL Engine 3.7.4 版本现已发布。VASSAL 是一个游戏引擎&#xff0c;用于在线构建棋盘游戏和纸牌游戏&#xff0c;构建的游戏可在 Internet 上或通过电子邮件实时运行。 VASSAL Engine 可在所有平台上运行&#xff0c;是免费的开源软件。具体更新内容包括&#xff1a; …

【2024版】最新Nessus工具安装激活教程,三分钟手把手教会,非常简单!收藏这一篇就够了

Nessus工具介绍 Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;而且它开源&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上…

护眼灯亮度多少合适?适合学生儿童的护眼灯推荐

为什么需要购买台灯&#xff1f;正常的顶灯不行吗&#xff1f; 正常顶灯的光照射到桌子上时&#xff0c;已经发散的差不多了&#xff0c;无法满足看书写字环境下的需要。 看书写字时人是要低头的&#xff0c;很容易挡住顶灯照射的光&#xff0c;桌上需要光的位置正好被挡住。…

如何为模型添加光照效果?

1、光照贴图的原理 光照贴图&#xff08;Lightmap&#xff09;是一种用于模拟光照效果的贴图技术。它通过将场景中的光照信息渲染到纹理图像中&#xff0c;然后将其应用到模型表面来实现对光照效果的模拟。光照贴图通常使用灰度图像来表示场景中的光照信息&#xff0c;白色表示…

让GPT替我写vue3代码,看的我血压升高

事情是这样子的&#xff0c;最近在写Vue3相关的代码&#xff0c;就想着能不能让GPT辅助我写代码&#xff0c;于是&#xff0c;我就先写了一个中文的prompt Prompt1: 使用vue3写一个用户登录的页面 分割线内部是GPT的回答&#xff1a; 使用 Vue 3 来创建一个用户登录页面需要涉…

编译源码时报错,程序包找不到

在编译源码时&#xff0c;出现了个问题&#xff0c;程序包找不到 原本这里是没有这个浮标的&#xff0c;无法打开点击&#xff0c;里面是空的&#xff0c;打开本地maven的库看找到相应的包也是没有问题的。 这里我尝试过删除相关文件&#xff0c;删除pom文件相关内容再次进行下…

Python数据可视化入门指南

Matplotlib和Plotly是两个在Python中广泛使用的数据可视化库&#xff0c;它们具有丰富的API和功能&#xff0c;用于创建各种类型的图表和图形。在本篇博客中&#xff0c;我们将介绍它们的主要特点和基本用法。 Matplotlib 主要特点&#xff1a; 高度自定义&#xff1a; Matp…

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题&#xff0c;利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下&#xff0c;采购供应链数字化、协同化成为企业激烈竞争的优先选…

Echats-自定义图表1

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh-cmn-Hans"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>…

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…

计算机视觉 计算机视觉识别是什么?

计算机视觉识别&#xff08;Computer Vision Recognition&#xff09;是计算机科学和人工智能领域中的一个重要分支&#xff0c;它致力于使计算机系统能够模拟和理解人类视觉的过程&#xff0c;从而能够自动识别、分析和理解图像或视频中的内容。这一领域的发展旨在让计算机具备…

原生JS 表格列拖拽 适用JqGrid

js $(function () {var d1 new dragTable();d1.init({tabel: .drag-table}); })function dragTable() {this.disX 0; // 相对按下的位置移动的距离this.outX 0; // 鼠标按下的点到大盒子边上的距离this.lanX 0; // 拖动到的位置this.$createDiv null;this.$createDivBg …