使用 PlayCanvas 创建带有后处理效果的 3D 场景

Alt

本文由ScriptEcho平台提供技术支持

项目地址:传送门

使用 PlayCanvas 创建带有后处理效果的 3D 场景

应用场景介绍

本代码演示了如何使用 PlayCanvas 创建一个带有后处理效果的 3D 场景。用户可以在场景中查看一个棋盘模型,并使用后处理效果为场景添加色彩效果。

代码基本功能介绍

该代码实现了以下基本功能:

  • 使用 PlayCanvas 创建一个 3D 场景,包括棋盘模型和相机。
  • 创建一个渲染通道,将场景渲染到纹理中。
  • 使用自定义着色器创建渲染通道,对纹理应用色彩效果。
  • 将两个渲染通道分配给相机,以应用后处理效果。
  • 实时更新色彩效果,以创建动态效果。

功能实现步骤及关键代码分析说明

1. 初始化 PlayCanvas

首先,我们使用 PlayCanvas 的 createGraphicsDevice() 函数创建图形设备。然后,我们使用 AppBase 类创建一个应用程序并初始化它。

const device = await pc.createGraphicsDevice(canvas, gfxOptions)
const app = new pc.AppBase(canvas)
app.init(createOptions)
2. 创建场景和相机

接下来,我们创建一个场景并添加一个棋盘模型。我们还创建一个相机实体并将其添加到场景中。

const boardEntity = assets.board.resource.instantiateRenderEntity({castShadows: false,receiveShadows: false,
})
app.root.addChild(boardEntity)const cameraEntity = new pc.Entity()
cameraEntity.addComponent('camera', {clearColor: new pc.Color(0.4, 0.45, 0.5),farClip: 500,
})
cameraEntity.setLocalPosition(0, 30, -60)
cameraEntity.lookAt(0, 0, 100)
app.root.addChild(cameraEntity)
3. 创建渲染通道

我们创建一个渲染通道,将场景渲染到纹理中。

const texture = new pc.Texture(device, {name: 'RTTexture',width: 4,height: 4,format: pc.PIXELFORMAT_RGBA8,mipmaps: false,minFilter: pc.FILTER_LINEAR,magFilter: pc.FILTER_LINEAR,addressU: pc.ADDRESS_CLAMP_TO_EDGE,addressV: pc.ADDRESS_CLAMP_TO_EDGE,
})const rt = new pc.RenderTarget({colorBuffer: texture,depth: true,
})const renderPass = new pc.RenderPassForward(app.graphicsDevice,app.scene.layers,app.scene,app.renderer,
)
renderPass.init(rt, {resizeSource: null,
})
renderPass.addLayer(cameraEntity.camera, worldLayer, false)
renderPass.addLayer(cameraEntity.camera, uiLayer, true)
4. 创建着色器和渲染通道

我们创建一个自定义着色器,将色彩效果应用于纹理。然后,我们创建一个渲染通道来应用着色器。

class RenderPassTint extends pc.RenderPassShaderQuad {constructor(device, sourceTexture) {super(device)this.sourceTexture = sourceTexturethis.tint = pc.Color.WHITE.clone()this.shader = this.createQuadShader('TintShader',`uniform sampler2D sourceTexture;uniform vec3 tint;varying vec2 uv0;void main() {vec4 color = texture2D(sourceTexture, uv0);gl_FragColor = vec4(color.rgb * tint, color.a);}`,)}execute() {this.device.scope.resolve('sourceTexture').setValue(this.sourceTexture)this.device.scope.resolve('tint').setValue([this.tint.r, this.tint.g, this.tint.b])super.execute()}
}const tintPass = new RenderPassTint(app.graphicsDevice, texture)
tintPass.init(null)
5. 将渲染通道分配给相机

我们为相机分配两个渲染通道:一个用于渲染场景,另一个用于应用色彩效果。

cameraEntity.camera.renderPasses = [renderPass, tintPass]
6. 更新效果

我们通过更新色彩效果来创建动态效果。

app.on('update', function (/** @type {number} */ dt) {angle += dttintPass.tint.lerp(pc.Color.YELLOW,pc.Color.CYAN,Math.sin(angle * 0.5) * 0.5 + 0.5,)
})

总结与展望

通过使用 PlayCanvas,我们能够创建带有后处理效果的动态 3D 场景。这种技术可以用于创建各种视觉效果,例如色彩校正、模糊和发光。

未来,我们计划扩展此代码,添加更多后处理效果,并探索使用 PlayCanvas 的其他功能,例如物理和动画。

更多组件:



获取更多Echos

本文由ScriptEcho平台提供技术支持

项目地址:传送门

扫码加入AI生成前端微信讨论群:

扫码加入群聊

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

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

相关文章

达梦 执行查询语句时报[-544]:Out of sort buf space

达梦数据库有时执行SQL中有时报[-544]:Out of sort buf space, try to adjust SORT_BUF_GLOBAL_SIZE, SORT_BUF_SIZE, SORT_BLK_SIZE. 第一反应是这条语句占用排序区太大。但真实原因是前面执行的语句耗光了全局排序区,后面SQL任何小的排序操作都会报这个错误从而执…

freeRTOS中使用cJSON死机的问题

问题描述 在freeRTOS中使用cJSON来处理PC通过串口发送的信息,但是在串口接收处理任务中调用cJSON处理的函数后会出现死机的问题 // 处理PC的信息 void ProcessPCData(uint8_t* data, uint32_t len) {int functionCode 0;cJSON* json NULL;printf("Start Pr…

天润融通助力浪鲸卫浴,智能化革新引领客户服务新高度

头部家装品牌如何用优质服务抓住客户? 每年初春,万物复苏的同时,家装市场也正式进入旺季。 因为春天气温回升,潮气逐渐散去,开始进入最适合施工的季节,木材不易变形、油漆不易起皮,再加上春季…

算法金 | 再见!!!KNN

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 KNN算法的工作原理简单直观,易于理解和实现,这使得它在各种应用场景中备受青睐。 我们将深入探讨KNN算法&…

Easy 同学:AI 时代将加速计算机专业和程序员职业的分化

一、原贴 2024 年 6 月 5 日 拥有 60多万粉丝的方糖气球(ftqq.com)博主 、独立开发者:Easy 发表了一篇 AI 对计算机专业和程序员行业影响的新浪博客,看后很有启发,故而将原文摘录于此: 单独开个贴说一下吧…

文心一言 VS 讯飞星火 VS chatgpt (275)-- 算法导论20.3 2题

二、修改 vEB 树以支持带有卫星数据的关键字。如果要写代码,请用go语言。 文心一言: vEB 树(van Emde Boas 树)是一种用于处理稀疏位集合的高效数据结构,它允许在常数时间内执行查找、插入、删除和前驱/后继操作。然…

服务器硬件基础知识:从零开始了解你的数字工作马

在现代社会,服务器是我们数字世界的基石。无论是网站、云服务还是大数据处理,背后都有强大的服务器在默默工作。对于许多人来说,服务器的工作原理和组成可能显得神秘且复杂。今天,我们将通过一篇通俗易懂的文章,逐步揭…

6.更复杂的光照

一、Unity的渲染路径 渲染路径决定了光照是如何应用到Unity Shader中的。我们需要为每个Pass指定它使用的渲染路径 如何设置渲染路径? Edit>Project Settings>Player>Other Settinigs>Rendering 如何使用多个渲染路径?如:摄像…

Vuex 4与状态管理实战指南

title: Vuex 4与状态管理实战指南 date: 2024/6/6 updated: 2024/6/6 excerpt: 这篇文章介绍了使用Vuex进行Vue应用状态管理的最佳实践,包括为何需要状态管理,Vuex的核心概念如store、actions、mutations和getters,以及如何处理异步操作和模…

网工内推 | 网络运维工程师,H3CIE认证优先,13薪,享股票期权

01 畅读 🔷招聘岗位:高级网络运维工程师 🔷职责描述: 1.负责线上业务网络技术运维工作,保障并优化线上网络质量; 2.规划并构建公司线上业务网络架构; 3.规划线上业务网络质量评估与监控体系&…

USB (1)

再看USB 其实回过头看USB 是可以和无线 有线(internet) 可以和PCIe 甚至AXI类比的 它们共通处在于都是communication 有限通信 有7层网络协议 在USB也是分层的 不同的协议,依赖的介质不一样 这就要求相应的Physical层处理 USB的physical层是基于Serdes的,所以有串并/并串的…

找寻卓越的生成式人工智能应用案例?别浪费在无趣之处!

“ 生成式AI(AI)技术的强大众所周知。但不知道你们是否和我有一样感觉,目前市面上,企业对生成式AI的应用,场景大多较为单一。” Ingo Mierswa Altair产品开发高级副总裁 我说这些生成式AI的应用单一,是指…

整理好了!2024年最常见 20 道 Kafka面试题(十)

上一篇地址:整理好了!2024年最常见 20 道 Kafka面试题(九)-CSDN博客 十九、Kafka的消费者如何实现幂等性? 在Kafka中,幂等性指的是消费者处理消息时,即使多次接收到同一条消息,也能…

MongoDBTemplate-基本文档查询

文章目录 流程概述步骤1:创建一个MongoDB的连接步骤2:创建一个查询对象Query步骤3:设置需要查询的字段步骤4:使用查询对象执行查询操作 流程概述 步骤描述步骤1创建一个MongoDB的连接步骤2创建一个查询对象Query步骤3设置需要查询…

中介子方程二

*#X$XyXpXyX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XyX$XpX$XyX$XyXeXαX$XpXyXpX$XαXeXyX$XyX$XpX$XyX$XhXαXeX$XηXqXαXpX$XWXyX$XyXWX$XαXtXηXαXpX$XEX$XZX$XpXαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XyX$XpX$XyX$XyXeXαX$XpXyXpX$XαXeXyX$XyX$Xp…

让你工作效率飞起的五款软件

🌟 No.1:亿可达 作为一款自动化工具,亿可达被誉为国内版的免费Zaiper。它允许用户无需编程知识即可将不同软件连接起来,构建自动化的工作流程。其界面设计清新且直观,描述语言简洁易懂,使得用户可以轻松上…

【数据结构与算法 经典例题】反转链表(图文详解)

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路分析 三、代码实现 一、问题描述 二、解题…

[笔记] 记录docker-compose的部署过程

容器技术 第二章 记录docker-compose的部署过程 容器技术记录docker-compose的部署过程(可选)新建docker用户(可选)迁移docker-ce目录docker-compose官方插件形式安装官方二进制形式独立安装(可选) 使用docker-compose二进制包的 bash_completion 命令补齐 参考来源 记录docker…

⾃动化批量管理-Ansible

目录 一、ansible 简介 自动化工具选择 (了解)​编辑 1、ansible 是什么? 2、ansible 特点 3、ansible 架构图 二、ansible 任务执行 1、ansible 任务执行模式 2、ansible 执行流程 3、ansible 命令执行过程 三、ansible 配置详解 …

一文看懂Llama 2:原理、模型与训练

一文看懂Llama 2:原理、模型与训练 Llama 2是一种大规模语言模型(LLM),由Meta(原Facebook)研发,旨在推动自然语言处理(NLP)领域的发展。本文将详细介绍Llama 2的原理、模…