微信小游戏中three.js离屏画布的示例代码

 更新时间:2020年10月12日 10:54:23   作者:火星牛  
这篇文章主要介绍了微信小游戏中three.js离屏画布的示例代码,主要是用three.js结合cannon.js写个3D小游戏,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

国庆8天长假,重庆之行因故未成,偶得闲,用three.js结合cannon.js写个3D小游戏耍耍。

在微信小游戏中,把three.js的3D内容在离屏画布处理,然后复制到在屏画布,方法是:

let c_toolbarHeight=140;
 
let sysInfo=wx.getSystemInfoSync();
require('./js/libs/weapp-adapter.js');
var canvas_webGL=window.canvas;
canvas_webGL.width = sysInfo.screenWidth * sysInfo.pixelRatio;
canvas_webGL.height = (sysInfo.screenHeight-c_toolbarHeight) * sysInfo.pixelRatio;
var ctx_webGL=canvas_webGL.getContext('webgl');
 
let options={context: ctx_webGL}
let renderer = new THREE.WebGLRenderer(options);
renderer.setSize(sysInfo.screenWidth, sysInfo.screenHeight-c_toolbarHeight);
renderer.setPixelRatio(sysInfo.pixelRatio);
 
function render(){
  //清除canvas_bkg的3D区域
  wx.tmGlobal.eraseZone(0,
    c_toolbarHeight,
    sysInfo.screenWidth,
    sysInfo.screenHeight);
  renderer.render(scene, camera);
  wx.tmGlobal.ctx_bkg.drawImage(canvas_webGL,
    0,c_toolbarHeight*sysInfo.pixelRatio);
  //画一条横的红线
  wx.tmGlobal.ctx_bkg.strokeStyle = '#FF8C00';
  wx.tmGlobal.ctx_bkg.lineWidth = 2;
  wx.tmGlobal.ctx_bkg.beginPath();
  wx.tmGlobal.ctx_bkg.moveTo(0,
    (c_toolbarHeight)*sysInfo.pixelRatio);
  wx.tmGlobal.ctx_bkg.lineTo(
    sysInfo.screenWidth*sysInfo.pixelRatio,
    (c_toolbarHeight)*sysInfo.pixelRatio);
  //画游戏结束临界线
  wx.tmGlobal.ctx_bkg.moveTo(0,
    (c_toolbarHeight+c_yugaoHeight)*sysInfo.pixelRatio);
  wx.tmGlobal.ctx_bkg.lineTo(
    sysInfo.screenWidth*sysInfo.pixelRatio,
    (c_toolbarHeight+c_yugaoHeight)*sysInfo.pixelRatio);
  wx.tmGlobal.ctx_bkg.stroke();
  //把canvas_bkg画到在屏画布
  wx.tmGlobal.ctx_main.clearRect(0,0,
    wx.tmGlobal.canvas_main.width,wx.tmGlobal.canvas_main.height);
    wx.tmGlobal.ctx_main.drawImage(wx.tmGlobal.canvas_bkg,0,0);
}

在vivo和iphone手机都表现正常,但是,华为手机显示不出来:

https://developers.weixin.qq.com/community/develop/doc/00026c3c1c8eb010de384a82d51000?jumpto=

其它用户也提了好久了,腾讯或华为都没有解决,试来试去,终于找到了另一种写法:

renderer = new THREE.WebGLRenderer();
let target = new THREE.WebGLRenderTarget(
  sysInfo.screenWidth*sysInfo.pixelRatio, 
  (sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio);
renderer.setRenderTarget(target);
gl=renderer.getContext();
​
var canvas_huawei=wx.createCanvas();
canvas_huawei.width=sysInfo.screenWidth*sysInfo.pixelRatio;
canvas_huawei.height=(sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio;
var ctx_huawei=canvas_huawei.getContext('2d');
​
var canvas_huawei2=wx.createCanvas();
canvas_huawei2.width=sysInfo.screenWidth*sysInfo.pixelRatio;
canvas_huawei2.height=(sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio;
var ctx_huawei2=canvas_huawei2.getContext('2d');
​
var imageData = ctx_huawei.createImageData(
  sysInfo.screenWidth*sysInfo.pixelRatio,
  (sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio);
var pixels = new Uint8Array(imageData.data.length);
​
function render(){
  //擦除背景画布的webGL区域(因为webGL是用的透明绘制)
  wx.tmGlobal.eraseZone(0,
    c_toolbarHeight,
    sysInfo.screenWidth,
    sysInfo.screenHeight);
  renderer.render(scene, camera);
  gl.readPixels(
      0,
      0,
      gl.drawingBufferWidth,
      gl.drawingBufferHeight,
      gl.RGBA,gl.UNSIGNED_BYTE,pixels);
  imageData.data.set(pixels);
  ctx_huawei.putImageData(imageData,0,0);
  //清除   
  ctx_huawei2.clearRect(0,0,canvas_huawei2.width,canvas_huawei2.height);
  //上下镜像翻转
  ctx_huawei2.translate(0,canvas_huawei2.height);
  ctx_huawei2.scale(1, -1);
  ctx_huawei2.drawImage(canvas_huawei,0,0);
  //恢复
  ctx_huawei2.translate(0,canvas_huawei2.height);
  ctx_huawei2.scale(1, -1);
  wx.tmGlobal.ctx_bkg.drawImage(canvas_huawei2,
      0,c_toolbarHeight*sysInfo.pixelRatio);
  ......
}

到此这篇关于微信小游戏中three.js离屏画布的示例代码的文章就介绍到这了,更多相关微信小游戏three.js离屏画布内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JS携带参数实现页面跳转功能

    JS携带参数实现页面跳转功能

    这篇文章主要介绍了js携带参数实现页面跳转,实现方法也很简单,方式一是跳转路径携带参数,第二种方法是通过sessionStorage传递,需要的朋友可以参考下
    2022-11-11
  • 很全面的JavaScript常用功能汇总集合

    很全面的JavaScript常用功能汇总集合

    这篇文章主要为大家分享了一份很全面的JavaScript常用功能汇总集合,一些常用的额JS 对象、基本数据结构、功能函数等,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • ion content 滚动到底部会遮住一部分视图的快速解决方法

    ion content 滚动到底部会遮住一部分视图的快速解决方法

    本文给大家带来了ion content 滚动到底部会遮住一部分视图的快速解决方法,其实解决方法超简单的,只要在你的controller里面预先注入$ionicScrollDelegate就可以了,感兴趣的朋友通过本文一起学习吧
    2016-09-09
  • javascript下4个跨浏览器必备的函数

    javascript下4个跨浏览器必备的函数

    如果你的项目要用到 JavaScript,而你不使用任何 JavaScript 框架,那么对于那些常用且各个浏览器明显不同的地方就需要用函数来封装起来。
    2010-03-03
  • 基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)

    基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)

    这篇文章主要介绍了基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)的相关资料,需要的朋友可以参考下
    2015-12-12
  • webpack 3.X学习之多页面打包的方法

    webpack 3.X学习之多页面打包的方法

    这篇文章主要介绍了webpack 3.X学习之多页面打包的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • js扁平数组和树结构相互转换处理方法

    js扁平数组和树结构相互转换处理方法

    这篇文章主要给大家介绍了关于js扁平数组和树结构相互转换处理方法的相关资料,之前面试有遇到过这个问题,面试官问如何把一个数组数据扁平,然后转化为Tree结构数据,工作中刚好也用到了,所以总结下,需要的朋友可以参考下
    2023-07-07
  • JavaScript基本数据类型及值类型和引用类型

    JavaScript基本数据类型及值类型和引用类型

    大家经常可以见到javascript中的一些数据类型,比如“undefined”、“boolean”、“string”等等,这篇文章就和大家一起来学习JavaScript基本数据类型及值类型和引用类型,有需要的童鞋参考下,本文写的不好地方,还望大家提出,共同学习进步
    2015-08-08
  • 使用JS画图之点、线、面

    使用JS画图之点、线、面

    这篇文章主要介绍了使用js绘制几何图形的基础,绘制点、线、面,需要的朋友可以参考下
    2015-01-01
  • JavaScript高级程序设计 DOM学习笔记

    JavaScript高级程序设计 DOM学习笔记

    DOM是针对XML和HTML文档的一个API:即规定了实现文本节点操控的属性、方法,具体实现由各自浏览器实现。
    2011-09-09

最新评论