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


Posted in Javascript onOctober 12, 2020

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

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

在微信小游戏中,把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离屏画布内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Gird组件 Part-3:范例RSSFeed Viewer
Mar 10 Javascript
prototype Element学习笔记(篇一)
Oct 26 Javascript
jQuery 添加/移除CSS类实现代码
Feb 11 Javascript
javascript中"/"运算符常见错误
Oct 13 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
JavaScript中常见的字符串操作函数及用法汇总
May 04 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
Oct 15 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
ES6基础之 Promise 对象用法实例详解
Aug 22 Javascript
js实现时钟定时器
Mar 26 Javascript
原生JavaScript实现弹幕组件的示例代码
Oct 12 #Javascript
分享8个JavaScript库可更好地处理本地存储
Oct 12 #Javascript
浅析我对JS延迟异步脚本的思考
Oct 12 #Javascript
Webpack5正式发布,有哪些新特性
Oct 12 #Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 #Javascript
移动端JS实现拖拽两种方法解析
Oct 12 #Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 #Javascript
You might like
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP中的string类型使用说明
2010/07/27 PHP
PHP对字符串的递增运算分析
2010/08/08 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
accesskey 提交
2006/06/26 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
培训讲师岗位职责
2014/04/13 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
热血教师观后感
2015/06/10 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
OpenCV 图像梯度的实现方法
2021/07/25 Python