微信小游戲中three.js離屏畫布的示例代碼
國慶8天長假,重慶之行因故未成,偶得閑,用three.js結(jié)合cannon.js寫個3D小游戲耍耍。
在微信小游戲中,把three.js的3D內(nèi)容在離屏畫布處理,然后復(fù)制到在屏畫布,方法是:
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區(qū)域 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); //畫游戲結(jié)束臨界線 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手機(jī)都表現(xiàn)正常,但是,華為手機(jī)顯示不出來:
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區(qū)域(因?yàn)閣ebGL是用的透明繪制) 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); //上下鏡像翻轉(zhuǎn) ctx_huawei2.translate(0,canvas_huawei2.height); ctx_huawei2.scale(1, -1); ctx_huawei2.drawImage(canvas_huawei,0,0); //恢復(fù) ctx_huawei2.translate(0,canvas_huawei2.height); ctx_huawei2.scale(1, -1); wx.tmGlobal.ctx_bkg.drawImage(canvas_huawei2, 0,c_toolbarHeight*sysInfo.pixelRatio); ...... }
到此這篇關(guān)于微信小游戲中three.js離屏畫布的示例代碼的文章就介紹到這了,更多相關(guān)微信小游戲three.js離屏畫布內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- three.js如何實(shí)現(xiàn)3D動態(tài)文字效果
- three.js 實(shí)現(xiàn)露珠滴落動畫效果的示例代碼
- three.js中多線程的使用及性能測試詳解
- three.js顯示中文字體與tween應(yīng)用詳析
- three.js 利用uv和ThreeBSP制作一個快遞柜功能
- three.js著色器材質(zhì)的內(nèi)置變量示例詳解
- vue頁面引入three.js實(shí)現(xiàn)3d動畫場景操作
- three.js 制作動態(tài)二維碼的示例代碼
- three.js 將圖片馬賽克化的示例代碼
- 如何用threejs實(shí)現(xiàn)實(shí)時(shí)多邊形折射
相關(guān)文章
微信小程序數(shù)據(jù)劫持代理的實(shí)現(xiàn)
本文主要介紹了微信小程序?數(shù)據(jù)劫持代理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01基于JavaScript實(shí)現(xiàn)單選框下拉菜單添加文件效果
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)單選框下拉菜單添加文件效果的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06解決在Bootstrap模糊框中使用WebUploader的問題
這篇文章主要介紹了在Bootstrap模糊框中使用WebUploader的問題及解決方法,,需要的朋友可以參考下2018-03-03js 多種變量定義(對象直接量,數(shù)組直接量和函數(shù)直接量)
js 多種變量定義(對象直接量,數(shù)組直接量和函數(shù)直接量),大家可以參考下,對于以后學(xué)習(xí)js 面向?qū)τ谂cjson操作會有幫助。2010-05-05javascript實(shí)現(xiàn)日期時(shí)間動態(tài)顯示示例代碼
這篇文章主要介紹了javascript實(shí)現(xiàn)日期時(shí)間動態(tài)顯示示例代碼,頁面動態(tài)顯示時(shí)間變化的方法有很多,本文為大家介紹下使用javascript的具體實(shí)現(xiàn),感興趣的朋友可以參考一下2015-09-09javascript關(guān)于open.window子頁面執(zhí)行完成后刷新父頁面的問題分析
這篇文章主要介紹了javascript關(guān)于open.window子頁面執(zhí)行完成后刷新父頁面的問題,實(shí)例分析了javascript操作子頁面的執(zhí)行與父頁面的刷新技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04