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,一经查实,立即删除!

相关文章

CSS——7.CSS注释

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css注释</title><link rel"stylesheet" type"text/css" href"a.css"/></head><body><!--头部开始&#xff08;h…

电子信息硕士面试经验

回顾2024年秋招一些面试常见的问题,主要涉及软件开发和嵌入式部分内容。 1. 浅拷贝深拷贝 深拷贝和浅拷贝是两种不同的拷贝方式,用于复制对象。它们主要区别在于对嵌套对象的处理方式。 浅拷贝:只复制对象的顶层,嵌套对象仍然是共享引用。 深拷贝:递归复制所有对象及其嵌…

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、物体切割效果的基本原理 在片元着色器中判断片…

GTX750Ti打DP补丁

背景 咸鱼收了一个二手的GTX750Ti,用于4K60Hz显示器,HDMI接口勉强可以4K60Hz,不过色彩和帧率都不是太正常,理论上它的HDMI接口是不支持的,原本也是打算用DP接口接显示器的,但是发现接DP口之后无法通过bios的vga检测最终一直重启,在华硕B760-K的BIOS中使能CSM是可以使用…

接口测试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…

人工智能-Python网络编程-TCP

1 TCP-概念版 服务端 import socket ​ # 1 创建服务端套接字对象 # socket.AF_INET IPV4 # socket.SOCK_STREAM TCP # socket.SOCK_DGRAM UDP tcp_server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) ​ # 2 绑定端口号 tcp_server_socket.bind((192.…

小程序组件 —— 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;那么废话不…

集合划分.

本节通过解决集合划分的问题进行一个递归算法的简单实现. 问题描述: 给定正整数n和m,计算出n个元素的集合{1,2,3....}可以划分为多少个不同的有m个非空子集组成的集合. 思路解析: 解读题目,将由n个元素组成的集合拆分成m个非空子集,假设函数名为f.若想将n个元素分成m组,就需要…

广告联盟项目实操教程

我认为很多行业就像一层窗户纸&#xff0c;捅破了大家都能听得懂&#xff0c;谁能在这个行业赚到钱&#xff0c;主要在于你能不能深入了解这个行业的运作逻辑&#xff0c;和你有没有强大的执行力&#xff0c;做到这两点&#xff0c;你不赚钱都难。广告联盟项目也一样&#xff0…

数据结构(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…

力扣--35.搜索插入位置

题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例 …

JavaScript 日期格式

在 JavaScript 中,日期格式可以通过 Date 对象进行操作和格式化。下面是一些常见的 JavaScript 日期格式及其示例: 1. ISO 8601 格式 ISO 8601 是一种标准的日期和时间表示方法,格式为 YYYY-MM-DDTHH:mm:ss.sssZ,例如: let date = new Date(); console.log(date.toISOS…

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…

Qt C++ 软件调试内存分析工具Heob(推荐三颗星)

点击上方"蓝字"关注我们 01、Heob 是 what? >>> 绝大部分的文章都说Heob是一个内存泄漏分析工具,其实Heob只是内存泄漏分析功能比较突出,实际上Heob可以分析很多内存问题。 Heob是一个Windows下检测缓冲区溢出(野指针、空指针、内存越界、重复释放、异…

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

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