xr-frame 通过shader去除视频背景色,加载透明视频

目录

前言 

实现思路

获取 XR 框架系统:

注册自定义效果

 创建效果对象

渲染通道配置

 着色器代码

顶点着色器

片元着色器(颜色分量g达到条件的片元将被透透明)

effect-removeBlack 完整代码

wxml中使用


 

前言 

实现了一个用于注册自定义效果(Effect)的 代码,用于 xr-frame框架中。这个效果的核心功能是去除场景中的黑色部分,或者说是对视频纹理进行处理 

实现思路

获取 XR 框架系统

const xrFrameSystem = wx.getXrFrameSystem();

 这里通过 wx.getXrFrameSystem() 获取了 XR 框架系统对象 xrFrameSystem,它提供了对 XR 场景的管理和操作接口。

注册自定义效果

xrFrameSystem.registerEffect('removeBlack', scene => {// 自定义效果的实现
});

使用 xrFrameSystem.registerEffect 方法注册了一个名为 'removeBlack' 的自定义效果。这个效果会在指定的场景中生效。

 创建效果对象

scene.createEffect({name: "removeBlack",images: [{key: 'u_videoMap',default: 'white',macro: 'WX_USE_VIDEOMAP'}],defaultRenderQueue: 2000,passes: [{}],shaders: [/* GLSL 代码 */]
});
  • name: "removeBlack":效果的名称,标识这个效果。
  • images:定义了效果中使用的纹理图像。
    • key: 'u_videoMap':纹理的键名,用于在 GLSL 代码中引用。
    • default: 'white':默认的纹理颜色为白色。
    • macro: 'WX_USE_VIDEOMAP':定义了一个宏,用于在 GLSL 代码中条件编译。
  • defaultRenderQueue: 2000:设置渲染队列的优先级,值越大越靠后渲染。
  • passes:定义渲染效果的各个渲染通道。
  • shaders:包含顶点和片段着色器的 GLSL 代码。

渲染通道配置

passes: [{"renderStates": {cullOn: false,blendOn: true,blendSrc: xrFrameSystem.EBlendFactor.SRC_ALPHA,blendDst: xrFrameSystem.EBlendFactor.ONE_MINUS_SRC_ALPHA,cullFace: xrFrameSystem.ECullMode.BACK,},lightMode: "ForwardBase",useMaterialRenderStates: true,shaders: [0, 1]
}]
  • renderStates:定义了渲染状态。
    • cullOn: false:关闭剔除。
    • blendOn: true:启用混合。
    • blendSrc: xrFrameSystem.EBlendFactor.SRC_ALPHA:设置混合源因子为源 alpha。
    • blendDst: xrFrameSystem.EBlendFactor.ONE_MINUS_SRC_ALPHA:设置混合目标因子为 1 减去源 alpha。
    • cullFace: xrFrameSystem.ECullMode.BACK:剔除背面。
  • lightMode: "ForwardBase":设置光照模式为前向基础光照。
  • useMaterialRenderStates: true:使用材质的渲染状态。
  • shaders: [0, 1]:指定使用的着色器,分别是顶点着色器和片段着色器。

 着色器代码

顶点着色器

#version 100uniform highp mat4 u_view;
uniform highp mat4 u_viewInverse;
uniform highp mat4 u_vp;
uniform highp mat4 u_projection;
uniform highp mat4 u_world;attribute vec3 a_position;
attribute highp vec2 a_texCoord;varying highp vec2 v_UV;void main()
{v_UV = a_texCoord;vec4 worldPosition = u_world * vec4(a_position, 1.0);gl_Position = u_projection * u_view * worldPosition;
}
  • u_viewu_viewInverseu_vpu_projectionu_world:这些是 MVP(模型-视图-投影)矩阵,负责将顶点从局部坐标转换到屏幕坐标。
  • a_position:顶点位置。
  • a_texCoord:纹理坐标。
  • v_UV:将纹理坐标传递给片段着色器。
  • worldPosition:将顶点转换到世界坐标系。
  • gl_Position:最终的裁剪空间坐标。

片元着色器(颜色分量g达到条件的片元将被透透明)

#version 100precision mediump float;
precision highp int;
varying highp vec2 v_UV;#ifdef WX_USE_VIDEOMAPuniform sampler2D u_videoMap;
#endifvoid main()
{
#ifdef WX_USE_VIDEOMAPvec4 baseColor = texture2D(u_videoMap, v_UV);
#elsevec4 baseColor = vec4(1.0, 1.0, 1.0, 1.0);
#endiffloat rgbSum = baseColor.r + baseColor.g + baseColor.b;// 设定阈值避免异常情况if (baseColor.g < 1.1) {gl_FragData[0] = vec4(1.0, 1.0, 1.0, 0.0);} else {gl_FragData[0] = vec4(baseColor.rgb, 1.0);}
}
  • v_UV:从顶点着色器传递过来的纹理坐标。
  • u_videoMap:视频纹理。
  • baseColor:从视频纹理中采样的颜色。
  • rgbSum:计算颜色的 RGB 分量之和。
  • if (baseColor.g < 1.1):通过阈值判断是否为黑色,如果绿色分量小于 1.1(接近黑色),则输出 (1.0, 1.0, 1.0, 0.0),即白色且透明;否则输出原始颜色。

effect-removeBlack 完整代码

const xrFrameSystem = wx.getXrFrameSystem();xrFrameSystem.registerEffect('removeBlack', scene => scene.createEffect({name: "removeBlack",images: [{key: 'u_videoMap',default: 'white',macro: 'WX_USE_VIDEOMAP'}],defaultRenderQueue: 2000,passes: [{"renderStates": {cullOn: false,blendOn: true,blendSrc: xrFrameSystem.EBlendFactor.SRC_ALPHA,blendDst: xrFrameSystem.EBlendFactor.ONE_MINUS_SRC_ALPHA,cullFace: xrFrameSystem.ECullMode.BACK,},lightMode: "ForwardBase",useMaterialRenderStates: true,shaders: [0, 1]}],shaders: [`#version 100uniform highp mat4 u_view;
uniform highp mat4 u_viewInverse;
uniform highp mat4 u_vp;
uniform highp mat4 u_projection;
uniform highp mat4 u_world;attribute vec3 a_position;
attribute highp vec2 a_texCoord;varying highp vec2 v_UV;void main()
{v_UV = a_texCoord;vec4 worldPosition = u_world * vec4(a_position, 1.0);gl_Position = u_projection * u_view * worldPosition;}`,`#version 100precision mediump float;
precision highp int;
varying highp vec2 v_UV;#ifdef WX_USE_VIDEOMAPuniform sampler2D u_videoMap;
#endifvoid main()
{
#ifdef WX_USE_VIDEOMAPvec4 baseColor = texture2D(u_videoMap, v_UV);
#elsevec4 baseColor = vec4(1.0, 1.0, 1.0, 1.0);
#endiffloat rgbSum = baseColor.r + baseColor.g + baseColor.b;// 设定阈值避免异常情况if (baseColor.g < 1.1) {gl_FragData[0] = vec4(1.0, 1.0, 1.0, 0.0);} else {gl_FragData[0] = vec4(baseColor.rgb, 1.0);}
}
`],
}));

wxml中使用

在js中引用 import '../../utils/effect-removeBlack.js';,并如下使用

    <xr-asset-load type="video-texture" asset-id="xianhe" src="http://njyjxr.oss-cn-shanghai.aliyuncs.com/zhanghai/Chizhou/feiheback.mp4" options="autoPlay:true,loop:true" /><xr-asset-material asset-id="xianhe-mat" effect="removeBlack" /><xr-mesh id="xianhe" position="-8 12 2.1" rotation="90 100 0" scale="30 1 21.2" material="xianhe-mat" geometry="plane" uniforms="u_videoMap: video-xianhe" states="renderQueue:2500"></xr-mesh>

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

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

相关文章

fnm教程

常用命令 // 查看所有远程可供安装的 Node 版本 fnm list-remote// 安装某一 Node 版本 fnm install <version>// 切换某一 Node 版本 fnm use <version>// 查看当前使用的 Node 版本 fnm current// 查看所有已安装的 Node 版本 fnm list// 删除某一 Node 版本 fn…

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

接口测试Day06-UnitTest框架

UnitTest 是开发人员用来实现 “单元测试” 的框架。测试工程师&#xff0c;可以在自动化 “测试执行” 时使用。 使用 UnitTest 的好处&#xff1a; 方便管理、维护测试用例。提供丰富的断言方法。生成测试报告。&#xff08;需要插件 HTMLTestReport&#xff09; UnitTest框架…

《learn_the_architecture_-_trustzone_for_aarch64_102418_0101_03_en》学习笔记

1.TrustZone是Arm A-profile架构中安全架构的名称。TrustZone首次在Armv6K中引入&#xff0c;Armv7-A和Armv8-A也支持。TrustZone提供两个执行环境&#xff0c;它们之间具有系统范围的硬件强制隔离。在Arm架构中&#xff0c;有两种安全状态&#xff1a;安全和非安全。在EL0、EL…

小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式

这一节目标是实现底部推荐商品的结构和样式&#xff0c;由于这里要求横向滚动&#xff0c;所以需要使用上节介绍的 scroll-view 功能&#xff0c;并使用 scroll-x 属性支持横向滚动&#xff0c;推荐商品区域中的每一个商品是一个单独的 view&#xff0c;每个view 中需要写三个组…

【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

前言 &#x1f31f;&#x1f31f;本期讲解关于spring aop的入门介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

数据结构(AVL树)

BST的退化 仔细观察BST你会发现&#xff0c;虽然他有良好的“搜索”特性&#xff0c;也就是&#xff1a;你可以利用其节点之间的大小关系&#xff0c;很容易地从根节点开始往下走找到你要的节点&#xff0c;但他却无法保证这种搜索所需要的时间的长短&#xff0c;因为建立BST时…

SAP 01-初识AMDP(ABAP-Managed Database Procedure)

1. 什么是AMDP(ABAP-Managed Database Procedure) 1.&#xff09;AMDP - ABAP管理数据库程序&#xff0c;是一种程序&#xff0c;我们可以使用SQLSCRIPT在AMDP内部编写代码&#xff0c;SQLSCRIPT是一种与SQL脚本相同的数据库语言&#xff0c;这种语言易于理解和编码。 将AM…

Anaconda环境配置(Windows11+python3.9)

文章目录 一、 下载ANACONDA&#xff08;1&#xff09;点击**Free Download**。&#xff08;2&#xff09;点击“skip registration”&#xff0c;跳过登录。&#xff08;3&#xff09;下载对应操作系统的ANACONDA版本。 二、 安装ANACONDA&#xff08;1&#xff09;双击运行安…

Git命令行的使用

目录 一、什么是Git 1、本地仓库 vs 远端仓库 本地仓库 远端仓库 2、.git vs .gitignore .git .gitignore 二、使用Git命令 1、安装git 2、git首次使用需要配置用户邮箱和用户名 3、上传目录/文件到远端仓库步骤 1&#xff09;创建放置文件的目录 2&#xff09;cd…

后台管理系统动态面包屑Breadcrumb组件的实现

在后管理系统开发中&#xff0c;面包屑导航是一个非常常见的功能&#xff0c;通常是根据当前的 url 自动生成面包屑导航菜单&#xff0c;当跳转路由发生变化时&#xff0c;面包屑导航都会随之发生变化&#xff0c;即动态面包屑。 要完成动态面包屑我们需要制作一个动态数组&am…

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案&#xff0c;旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能&#xff0c;如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好&#xff0c;让用户能够轻松选择所需的商品或服务&…

凸包(convex hull)简述

凸包&#xff08;convex hull&#xff09;简述 这里主要介绍二维凸包&#xff0c;二维凸多边形是指所有内角都在 [ 0 , Π ] [0,\Pi ] [0,Π]范围内的简单多边形。 凸包是指在平面上包含所有给定点的最小凸多边形。 数学定义&#xff1a;对于给定集合 X X X&#xff0c;所有…

小波与傅里叶变换在去噪效果上的对比分析-附Matlab源程序

&#x1f468;‍&#x1f393; 博主简介&#xff1a;博士研究生 &#x1f52c; 超级学长&#xff1a;超级学长实验室&#xff08;提供各种程序开发、实验复现与论文指导&#xff09; &#x1f4e7; 个人邮箱&#xff1a;easy_optics126.com &#x1f56e; 目 录 摘要一、…

CVPR2019 | AA | 特征空间扰动产生更具迁移性的对抗样本

Feature Space Perturbations Yield More Transferable Adversarial Examples 摘要-Abstract引言-Introduction相关工作-Related WorkTransferability Metrics-迁移性指标激活攻击方法-Activation Attack Methodology损失函数-Loss Function攻击算法-Attack Algorithm 实验设置…

游戏如何检测Root权限

Root权限&#xff0c;即超级用户权限&#xff0c;在Android系统中&#xff0c;获取Root权限意味着用户可以修改系统文件、移除预装应用、安装特殊应用等。 在Root环境下&#xff0c;游戏面临着相当大的安全隐患&#xff0c;用户获取了最高权限&#xff0c;意味着可以通过各类工…

MySQL性能优化explain关键字详解

系列文章目录 一、MySQL数据结构选择 二、MySQL性能优化explain关键字详解 三、MySQL索引优化 文章目录 系列文章目录一、explain是什么&#xff1f;二、explain字段详解2.1、ID2.2、select_type2.3、table2.4、partitions2.5、type&#xff08;重点&#xff09;2.6、key2.7、…

【Go学习】-01-5-网络编程

【Go学习】-01-5-网络编程 1 互联网协议介绍1.1 互联网分层模型 2 Go网络编程2.1 socket编程2.1.1 socket图解2.2.2 TCP编程2.2.3 UDP编程 2.3 http编程2.3.1 web工作流程2.3.2 HTTP协议 2.4 WebSocket编程2.5 聊天室的小例子2.5.1 server.go文件代码2.5.2 hub.go文件代码2.5.3…

推荐系统重排:MMR 多样性算法

和谐共存&#xff1a;相关性与多样性在MMR中共舞 推荐系统【多样性算法】系列文章&#xff08;置顶&#xff09; 1.推荐系统重排&#xff1a;MMR 多样性算法 2.推荐系统重排&#xff1a;DPP 多样性算法 引言 在信息检索和推荐系统中&#xff0c;提供既与用户查询高度相关的文…

简历_熟悉缓存高并发场景处理方法,如缓存穿透、缓存击穿、缓存雪崩

系列博客目录 文章目录 系列博客目录1.缓存穿透总结 2.缓存雪崩3.缓存击穿代码总结 1.缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对…