微信小游戏中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 相关文章推荐
javascript:以前写的xmlhttp池,代码
May 18 Javascript
JavaScript Event事件学习第一章 Event介绍
Feb 07 Javascript
js 获取服务器控件值的代码
Mar 05 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 Javascript
改变checkbox默认选中状态及取值的实现代码
May 26 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
vue.js初学入门教程(1)
Nov 03 Javascript
Vue ElementUI之Form表单验证遇到的问题
Aug 21 Javascript
在Vue.js中使用Mixins的方法
Sep 12 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
JavaScript实现更换背景图片
Oct 18 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php之XML转数组函数的详解
2013/06/07 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
python统计日志ip访问数的方法
2015/07/06 Python
python多进程共享变量
2016/04/06 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
基于python的Paxos算法实现
2019/07/03 Python
python实现拼图小游戏
2020/02/22 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
python飞机大战游戏实例讲解
2020/12/04 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
社区七一党员活动方案
2014/01/25 职场文书
培训自我鉴定
2014/01/31 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
治庸问责心得体会
2014/09/12 职场文书
成本会计实训报告
2014/11/05 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python