首页 > 其他分享 >webgl 渲染带透明通道的视频(threeJS)

webgl 渲染带透明通道的视频(threeJS)

时间:2023-05-31 11:03:26浏览次数:53  
标签:视频 threeJS 渲染 webgl THREE vUv renderer var new

首先,你需要一个这样的视频

 

或者一个这样的视频

 webgl渲染可以用three.js,上下叠加的代码如下:

import * as THREE from 'three';
    let videoWidth = 540; //视频实际的宽度
    let videoHeight = 540;//原视频实际的高度的一般
    //定义渲染器
    var renderer = new THREE.WebGLRenderer({
      antialias: true,
      alpha: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setClearColor(new THREE.Color("lightgrey"), 0);
    renderer.setSize(videoWidth, videoHeight);

    //居中显示
    // renderer.domElement.style.position = "absolute"; 

    renderer.domElement.style.top = (window.innerHeight - videoWidth) / 2 + "px";
    renderer.domElement.style.left = (window.innerWidth - videoWidth) / 2 + "px";
    // renderer.domElement.style.backgroundColor = "#999";
    // canvas的背景图
    // renderer.domElement.style.backgroundImage = "url('./images/6b4b2ec4_E812211_16ce1ab6.jpg')";

    document.body.appendChild(renderer.domElement);
    var scene = new THREE.Scene();
    var camera = new THREE.Camera();
    scene.add(camera);
    //播放视频
    var video = document.getElementById("video");
    video.onended = () => {
      video.play();

    }
    //获取视频纹理
    var texture = new THREE.VideoTexture(video);
    texture.minFilter = THREE.LinearFilter;
    texture.magFilter = THREE.LinearFilter;
    texture.format = THREE.RGBAFormat;

    //定义几何体
    var geometry = new THREE.PlaneBufferGeometry(2, 2);

    //处理视频纹理
    var uniforms = {
      time: { type: "f", value: 1.0 },
      videoTexture: { type: "sampler2D", value: texture }
    };
    var material = new THREE.ShaderMaterial({
      uniforms: uniforms,
      vertexShader:
        `varying vec2 vUv;
    void main() {
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
    }`,
      fragmentShader:
        `#ifdef GL_ES
    precision highp float;
    #endif
    
    uniform float time;
    uniform sampler2D videoTexture;
    varying vec2 vUv;
    
    void main( void ) {
      gl_FragColor = vec4(
      texture2D(videoTexture, vec2(vUv.x, 0.5 + vUv.y/2.)).rgb,
      texture2D(videoTexture, vec2(vUv.x, vUv.y/2.)).r
      );
    }`,

      // 通过视频的rgb值,转换成webGl渲染需要的rgba值
      // vec4是取样器获取的是值对应的是(r,g,b,a)
      // texture2D是取样器获取的是视频的rgb值,可以通过.r,.g,.b或者.rg,.rb,.gb,.rgb分别取样
      // vUv传入的是纹理的坐标(浮点数)

      transparent: true
    });
    var mesh = new THREE.Mesh(geometry, material)
    scene.add(mesh);


    var animate = function () {
      requestAnimationFrame(animate);
      renderer.render(scene, camera);
    };

    // document.getElementById('play-button').addEventListener('click', e => {
    //   video.play();
    //   requestAnimationFrame(animate);
    // });
    video.play();
    requestAnimationFrame(animate);

如果是左右,只需要改一下叠加的方向就行,代码中的 fragmentShader 属性改为如下:

fragmentShader: 
    `#ifdef GL_ES
    precision highp float;
    #endif
    
    uniform float time;
    uniform sampler2D texture;
    varying vec2 vUv;
    
    void main( void ) {
      gl_FragColor = vec4(
      texture2D(texture, vec2(vUv.x/2., vUv.y)).rgb,
      texture2D(texture, vec2(vUv.x/2., vUv.y)).r
      );
    }`,

以上解决视频背景透明问题 

参考原文:前端如何制作出透明背景视频

标签:视频,threeJS,渲染,webgl,THREE,vUv,renderer,var,new
From: https://www.cnblogs.com/hyt09/p/17445435.html

相关文章

  • threejs绘制球体
    threejs绘制球体在Three.js中,可以使用geometry对象和geometryMaterial对象来创建和渲染球体几何体。下面是一个绘制球体的示例代码://创建一个立方体几何体varcubeGeometry=newTHREE.BoxGeometry(0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5);......
  • 如何使用WebGL绘制图片
    1.获取画布元素:首先需要获取到HTML中的canvas元素,这个元素将作为WebGL渲染的目标。2.获取WebGL上下文:使用canvas元素的getContext()方法获取WebGL上下文,这个上下文是WebGL渲染的核心。3.创建顶点数据:WebGL渲染需要定义顶点数据,这些数据描述了要绘制的形状。在这里,我们需要创建一......
  • Focus On 3D Terrain Programming三维地形渲染-Trent Polack-2003
    前言:你有多少次访问过你最喜欢的编程论坛或邮件列表,并对大量关于地形渲染算法的帖子感到惊讶,这些帖子似乎从各个角度向你袭来?地形渲染似乎是当今业余程序员最喜欢的主题;它是一个很好的门户网站,可以了解更高要求的问题及其解决方案。然而,地形渲染决不是一个简单的问题,特定的解决方......
  • 关于动态渲染的组件watch监听不到传入的props的问题
    watch:{propsTime:{handler(newValue,oldValue){console.log('props',newValue)this.getOverviewData()},//这里增加了一个immediate属性,说明监听到props传参后立即先去执行handler方法immediate:true,}......
  • threejs创建圆柱体
    threejs创建圆柱体 创建一个几何体(geometry):使用Three.js的几何体类创建一个几何体,该类将定义您的几何体的形状和大小。例如,您可以使用以下代码创建一个圆柱体:vargeometry=newTHREE.CylinderGeometry(5,32,32); 这将创建一个高度为5、半径为32的圆柱体。创建......
  • 延迟渲染
     基础概念概念缩写中文名解析RenderTargetRT渲染目标/渲染纹理一种位于GPU显存的纹理缓冲区,可用作颜色写入和混合目标GeometryBufferGBuffer几何缓冲区一种特殊的RenderTarget,延迟着色技术的几何数据存储区RenderingPath-......
  • 渲染管线导论(龙书笔记)
    渲染管线总体流程InputAssembler(IA)->VSShader(VS)->HullShader(HS)->TessellatorStage->DomainShader(DS)->GeometryShader(GS)->[StreamOutput(SO)]->Rasterizer(RS)->PixelShader(PS)->OutputMerget(OM)输入(图元)装配->......
  • vue3 reactive响应式赋值页面不渲染问题
    问题描述://声明变量letdata=reactive([]);http().then(res=>{data=res.dataconsole.log(data)})//data数据更新,页面没有渲染,1、因数据结构而导致的未渲染解决方法:依旧是reactive,可以在外面包一层//声明letstate=reactive({data:[]})//赋值state......
  • WebGL几种常用服务图层的制作流程
    当前,越来越多的用户开始使用三维GIS平台SuperMapiClent3DforWebGL,对于新用户来说最常见的两个问题就是:1.为什么打开场景看不到数据?2.为何范例能实现的效果,我的数据就不行了?而造成这两个问题绝大多数的原因是数据处理不当,本文将讲解制作WebGL常用服务图层的流程及注意事项。 ......
  • vue iview render函数渲染table表头和列表内容
    1computed:{2tableColumns(){3return[4{5title:"封面",6key:"pageImage",7render:(h,params)=>{8returnh("img",{9style:{10......