轻量封装WebGPU渲染系统示例<26>- PingpongBlur模糊效果(源码)

news2024/11/15 4:57:07

当前示例源码github地址:

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

当前示例运行效果:

WGSL片段shader

@group(0) @binding(0) var<uniform> param: vec4f;
@group(0) @binding(1) var sampler0: sampler;
@group(0) @binding(2) var texture0: texture_2d<f32>;

const weight = array<f32, 5>(0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
fn calcBlurColor(uv: vec2f) -> vec4f {
    var dv = vec2f(param.z, 0.0) / param.xy;
    let dx = dv.x;

    var result = textureSample(texture0, sampler0, uv) * weight[0];
	for (var i: i32 = 1; i < 5; i++)  {
        dv.x = dx * f32(i);
        result += textureSample(texture0, sampler0, uv + dv) * weight[i];
        result += textureSample(texture0, sampler0, uv - dv) * weight[i];
    }
    return result;
}

@fragment
fn main(
	@location(0) uv: vec2f
	) -> @location(0) vec4f {
	var color4 = calcBlurColor( uv );
    return color4;
}
@group(0) @binding(0) var<uniform> param: vec4f;
@group(0) @binding(1) var sampler0: sampler;
@group(0) @binding(2) var texture0: texture_2d<f32>;

const weight = array<f32, 5>(0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
fn calcBlurColor(uv: vec2f) -> vec4f {
    var dv = vec2f(0.0, param.z) / param.xy;
    let dy = dv.y;

    var result = textureSample(texture0, sampler0, uv) * weight[0];
	for (var i: i32 = 1; i < 5; i++)  {
        dv.y = dy * f32(i);
        result += textureSample(texture0, sampler0, uv + dv) * weight[i];
        result += textureSample(texture0, sampler0, uv - dv) * weight[i];
    }
    return result;
}

@fragment
fn main(
	@location(0) uv: vec2f
	) -> @location(0) vec4f {
	var color4 = calcBlurColor( uv );
    return color4;
}

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

const rttTex0 = { diffuse: { uuid: "rtt0", rttTexture: {} } };
const rttTex1 = { diffuse: { uuid: "rtt1", rttTexture: {} } };
const rtts = [rttTex0, rttTex1];
const attachment = {
	texture: rttTex0,
	clearValue: [] as ColorDataType,
	loadOp: "clear",
	storeOp: "store"
};
const colorAttachments = [attachment];

class PassGraph extends WGRPassNodeGraph {
	blurEntity: FixScreenPlaneEntity;
	constructor() {
		super();
	}

	run(): void {
		let pass = this.passes[0];

		const entity = this.blurEntity;
		let ms = entity.materials;

		for (let i = 0; i < 15; ++i) {
			pass.colorAttachments[0].clearEnabled = i < 1;
			attachment.texture = rtts[i % 2];
			ms[i % 2].visible = false;
			ms[(i + 1) % 2].visible = true;
			pass.render();
		}
	}
}

export class PingpongBlur {
	private mRscene = new RendererScene();
	initialize(): void {

		let multisampleEnabled = true;
		let depthTestEnabled = false;
		let rpassparam = { multisampleEnabled, depthTestEnabled };
		this.mRscene.initialize({ rpassparam });
		this.initScene();
	}

	private mGraph = new PassGraph();
	private uniformValues = [{ data: new Float32Array([512, 512, 3.0, 0]) }];
	private createMaterial(shadinguuid: string, textures: WGTextureDataDescriptor[], type: number): WGMaterial {
		let shaderCodeSrc = {
			vert: { code: vertWGSL, uuid: "vert" },
			frag: { code: type > 0 ? blurVWGSL : blurHWGSL, uuid: "frag" }
		};
		shadinguuid += "-" + type;
		const material = new WGMaterial({
			shadinguuid,
			shaderCodeSrc
		});
		material.uniformValues = this.uniformValues;
		material.addTextures(textures);
		return material;
	}
	private applyBlurPass(clearColor: ColorDataType, extent = [0.4, 0.3, 0.5, 0.5]): void {
		let rs = this.mRscene;

		const graph = this.mGraph;

		attachment.clearValue = clearColor;

		let rPass = rs.renderer.appendRenderPass({ separate: true, colorAttachments });

		const diffuseTex = { diffuse: { url: "static/assets/huluwa.jpg", flipY: true } };

		let materials = [this.createMaterial("shd-01", [rttTex0], 0), this.createMaterial("shd-02", [rttTex1], 1)];

		let rttEntity = new FixScreenPlaneEntity({ extent: [-1, -1, 2, 2], textures: [diffuseTex] });
		rPass.addEntity(rttEntity);

		graph.passes = [rPass];
		rs.setPassNodeGraph(graph);

		let entity = new FixScreenPlaneEntity({ extent, flipY: true, materials });
		entity.materials[0].visible = false;
		rs.addEntity(entity);
		graph.blurEntity = entity;

		extent = [-0.9, -0.9, 0.6, 0.6];
		entity = new FixScreenPlaneEntity({ extent, flipY: true, textures: [diffuseTex] });
		rs.addEntity(entity);
	}
	private initScene(): void {
		this.applyBlurPass([0.1, 0.1, 0.1, 1.0], [-1, -1, 2, 2]);
	}

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

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

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

相关文章

RESTful API概述以及如何使用它构建 web 应用程序

REST&#xff08;Representational State Transfer&#xff09;是一种设计风格和架构原则&#xff0c;它是一种为 Web 应用程序提供简化和标准化的 API 的方式。RESTful API&#xff08;RESTful Web Services&#xff09;是符合 REST 架构风格的网络应用程序 API&#xff0c;它…

DevicData-D-XXXXXXXX勒索病毒来袭:如何面对DevicData-D-XXXXXXXX勒索病毒的威胁

尊敬的读者&#xff1a; .DevicData-D-XXXXXXXX勒索病毒&#xff0c;犹如数字世界的黑暗幽灵&#xff0c;通过其复杂的加密算法&#xff0c;将用户数据变为数字谜团&#xff0c;要求赎金以唤回失去的信息。在这个数字时代&#xff0c;了解其特质和对抗方法至关重要。面对复杂的…

Milvus Cloud——LangChain 分块简介

LangChain 分块简介 LangChain 是一个 LLM 协调框架,内置了一些用于分块以及加载文档的工具。本次分块教程主要围绕设置分块参数,并最小限度地使用 LLM。简而言之,通过编写一个函数并设置其参数来加载文档并对文档进行分块,该函数打印结果为分块后的文本块。在下述实验中,…

【Linux】Linux动态库和静态库

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

桌面图标设置-将“我的电脑”、“控制面板”添加到桌面

桌面图标设置 1、将“我的电脑”、“控制面板”添加到桌面 桌面鼠标右键-个性化-主题-桌面图标设置-勾选”计算机“、”回收站“、”控制面板“-应用-确定-桌面鼠标右键-排序-名称

倾斜摄影三维模型的根节点合并的点云抽稀关键技术分析

倾斜摄影三维模型的根节点合并的点云抽稀关键技术分析 倾斜摄影三维模型的根节点合并是指将多个倾斜摄影拍摄得到的点云数据进行抽稀操作&#xff0c;以减少点云数据量和提高数据处理效率。在处理大规模的倾斜摄影点云数据时&#xff0c;点云抽稀是一个关键的技术&#xff0c;它…

Linux服务器从零开始训练 RT-DETR 改进项目 (Ultralytics) 教程,改进RTDETR算法(包括使用训练、验证、推理教程)

手把手从零开始训练 RT-DETR 改进项目 (Ultralytics版本) 教程,改进RTDETR算法 本文以Linux服务器为例:从零开始使用Linux训练 RT-DETR 算法项目 《芒果剑指 RT-DETR 目标检测算法 改进》 适用于芒果专栏改进RT-DETR算法 文章目录 百度 RT-DETR 算法介绍改进网络代码汇总第…

用excel 整理工作流程,以周为时间节点,自动统计进度

无论是处理自己还是团队的工作&#xff0c;我们都经常会遇到复杂的&#xff0c;凌乱的&#xff0c;需要多个环节才能完成的工作。 梳理工作流程 因为环节内容&#xff0c;每个环节处理不当都可能会导致我们整个工作目标实现受到影响&#xff0c;所以通过工作流程图&#xff0c…

力扣第516题 最长回文子序列 c++ 动态规划 附Java代码 注释版

题目 516. 最长回文子序列 中等 相关标签 字符串 动态规划 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。…

合作共赢 共克时艰

​ 采访人&#xff1a;最近财政部11月6日通报隐性债务问责典型案例&#xff0c;这中间涉及湖北多所重要地市&#xff0c;形成新增隐性债务200多亿&#xff0c;您怎么看这件事&#xff1f; 辜渝傧&#xff1a;是的&#xff0c;无论是数字还是涉及的范围都可以明显感觉到“防范…

计算机毕业设计项目选题推荐(免费领源码)Springboot+MySQL智能购房推荐系统09040

摘 要 近年来随着我国经济的高速发展&#xff0c;房地产业也随之蓬勃发展&#xff0c;尤其是最近国家新出台的房改政策。鼓励居民购房&#xff0c;这对房产公司无疑是一个极好的发展势头。尤为重要的是&#xff0c;近几年随着信息技术和电子商务的快速发展&#xff0c;许多企业…

CSS 滚动捕获 scroll-snap-type

scroll-snap-type 语法实例 捕获轴 y 捕获严格程度 mandatory捕获轴 y 捕获严格程度 proximity同理看下捕获轴 x 一些注意事项兼容性 scroll-snap-type 用来指定一个滚动容器(scroll container)是否是滚动捕获容器(scroll snap container)、捕获的严格程度以及在什么方向上执行…

【数据结构与算法】JavaScript实现单向链表

文章目录 一、单向链表简介二、封装单向链表类2.0.创建单向链表类2.1.append(element)2.2.toString()2.3.insert(position,element)2.4.get(position)2.5.indexOf(element)2.6.update(position,element)2.7.removeAt(position)2.8.其他方法2.9.完整实现 一、单向链表简介 链表…

租用服务器带宽类型应用

服务器带宽类型多样&#xff0c;以满足不同行业的需求。本文将介绍香港常见的服务器带宽类型及其应用领域。 1. 共享带宽 共享带宽是指多个用户共同使用同一台服务器的带宽资源。这种带宽类型适用于小型企业或个人网站&#xff0c;因为其成本较低。由于多个用户共享带宽资源&…

【C语言】解开指针|编址内存解引用指针产量|

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; &#x1f60a;啊森要自信的主页 ✨ 作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心的勇气和无限的潜能&#xff0c;只要你有决心&#xff0c;就没有什么事情是不可…

Linux操作系统使用及C高级编程-D3Linux shell命令(权限、输入输出)

Shell 是一种应用程序&#xff0c;用以完成用户与内核之间的交互 一个功能强大的编程语言&#xff08;C语言&#xff09; 一个解释执行的脚本语言&#xff0c;不需要编译&#xff0c;写完直接执行 目前Linux 乌班图的Shell默认是bash 查看当前提供的Shell&#xff1a;cat /…

Vue.js中的路由(router)和Vue Router的作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

2.8 CE修改器:寻找共享代码

本关我们将学习共享代码&#xff0c;在C语言中角色属性都是以结构体的方式进行存储的&#xff0c;而结构体所存储的信息都是连续性的&#xff0c;这一关我们将会解释如何处理游戏中的共用代码&#xff0c;这种代码是通用在除了自己以外的其他同类型对像上的常常你在修改游戏的时…

在Vue.js中,什么是mixins?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Linux基础环境开发工具的使用(三):gdb调试器

Linux基础环境开发工具的使用[三]:gdb调试器 一.调试命令的应用场景1.为什么要介绍调试命令的应用场景呢?2.调试命令的应用场景1.找到问题1.不借助调试2.调试 2.解决问题1.不借助调试2.借助调试 二.调试命令1.gdb使用的前置说明2.基础指令3.断点相关指令4.范围查找相关操作5.局…