微信小游戏中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 相关文章推荐
浅析XMLHttpRequest的缓存问题
Dec 13 Javascript
js 高效去除数组重复元素示例代码
Dec 19 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
Aug 13 Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 Javascript
js 定义对象数组(结合)多维数组方法
Jul 27 Javascript
用director.js实现前端路由使用实例
Jan 27 Javascript
Javascript下拉刷新的简单实现
Feb 14 Javascript
ES6新数据结构Set与WeakSet用法分析
Mar 31 Javascript
js实现简易聊天对话框
Aug 17 Javascript
对angularJs中自定义指令replace的属性详解
Oct 09 Javascript
vue通过数据过滤实现表格合并
Nov 30 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 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
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
Python中实现对list做减法操作介绍
2015/01/09 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
python 的topk算法实例
2020/04/02 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
浅谈Python 参数与变量
2020/06/20 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
微型企业创业投资计划书
2014/01/10 职场文书
微电影大赛策划方案
2014/06/05 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
党的生日演讲稿
2014/09/10 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
素质拓展训练感想
2015/08/07 职场文书
初中政治教学工作总结
2015/08/13 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技