问题解决了,记录一下: 输出一下 `VKFrame.getCameraTexture` 的方法,内容如下: function getCameraTexture(e, t = "yuv") { if (!this[jse].native || !this[jse].session) return null; "string" == typeof e && (t = e, e = null); var r = this[jse].session; if (!(e = e || r[Vse].options.gl)) return null; if ("yuv" === t) { var n = r[Vse].yTexture; n || (n = e.createTexture()); var i, a = r[Vse].uvTexture; a || (a = e.createTexture()); var o = !1; if (he && Use) { o = this[jse].native.updateCameraYUVTextureIOS(n, a, e) } else { i = this[jse].native.getCameraYUVBuffer() } e.bindTexture(e.TEXTURE_2D, n); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE); if (i) { e.texImage2D(e.TEXTURE_2D, 0, e.LUMINANCE, i.width, i.height, 0, e.LUMINANCE, e.UNSIGNED_BYTE, new Uint8Array(i.yAddress)) } r[Vse].yTexture = n; n._gl = e; e.bindTexture(e.TEXTURE_2D, null); e.bindTexture(e.TEXTURE_2D, a); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE); e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE); if (i) { e.texImage2D(e.TEXTURE_2D, 0, e.LUMINANCE_ALPHA, i.width / 2, i.height / 2, 0, e.LUMINANCE_ALPHA, e.UNSIGNED_BYTE, new Uint8Array(i.uvAddress)) } r[Vse].uvTexture = a; a._gl = e; e.bindTexture(e.TEXTURE_2D, null); return { yTexture: n, uvTexture: a } } return null } 可以看到,创建纹理后直接绑定了,并没有指定激活纹理序号,所以默认绑定到了 `gl.TEXTURE0`。 而这时候模型的贴图也使用了这个序号,第一帧渲染的时候应该是没有问题的,问题是在第二帧的时候,这个纹理又被重新更新覆盖了。 解决办法很简单,在调用 `getCameraTexture` 前提前激活一个不会用到的纹理号: gl.disable(gl.DEPTH_TEST); gl.activeTexture(gl.TEXTURE0 + 7); // 比如这样 const { yTexture, uvTexture } = frame.getCameraTexture(gl, "yuv"); 如此,问题就解决了。 哎,不开源,只能这样迂回 hack 了。
VKFrame.getCameraTexture方法导致无法正常渲染模型?我们目前使用的playcanvas引擎渲染3D场景,在AR开发时,我们已经定位到如果不使用VKFrame.getCameraTexture方法,模型可以正常渲染,使用该方法会导致部分模型材质无法正常渲染(全变成黑色)。 我们参考的是官方”小程序示例“里的代码。链接:https://github.com/wechat-miniprogram/miniprogram-demo/blob/master/miniprogram/packageAPI/pages/ar/plane-ar/yuvBehavior.js 在此,我想请问该方法是否针对WebGLContext有过操作?具体操作了哪些东西?我们需要再校正过来,万分谢谢。
2023-03-27遇到了同样的问题
xr-frame页面和three.js页面中canvas冲突问题?在测试 xr-frame功能,页面一是xr-frame 创建的3D场景,页面二是three.js 创建的3D场景,现在问题是如果我先打开three.js场景页面返回再打开xr-frame场景页面就黑屏不显示,如果两个页面打开顺序换下又可以正常显示。测试环境 xs- ios14.8.1 xr-frame页面报错如下 [图片]
2023-03-24关联问题
xr-frame 背景怎么设置为透明?xr-frame 背景如何设置为透明?功能类似于 THREE.WebGLRenderer 中的 alpha 属性 xr-frame 层级之下还有其他元素需要显示。 [图片]
2023-03-10关联问题
XR-FRAME 如何设置透明背景?目前默认的背景似乎是黑色的,`xr-camera`的`clear-color`设置为透明无效。 类似于: const gl = canvas.getContext('webgl', { alpha: true }); gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT);
2023-03-10同样的问题。
「基础库2.30.3」无法使用worker基础库升级到2.30.3之后,创建的worker无法使用postMessage,其他基础库可以使用。急需解决!!! [图片]
2023-03-10const node = scene.createElement(xrFrameSystem.XRNode); node.addComponent(xrFrameSystem.Mesh, { geometry, material }); 将 XRMesh 替换为 XRNode 就可以了,记录一下。
XR-FRAME 如何动态创建 Geometry 和 Material 并设置给 Mesh?目前 Geometry 是通过 Scene.createGeometry 动态创建的,之后,尝试通过以下方法设置,均无效: 尝试动态设置: const mesh = scene.getElementById("mesh").getComponent(xrFrameSystem.Mesh); mesh.setDataOne("geometry", geometry); // 无效 mesh.geometry = geometry; // readonly 尝试动态创建节点并绑定到 shadow 下: const node = scene.createElement(xrFrameSystem.XRMesh); node.addComponent(xrFrameSystem.Mesh, { geometry, material }); const shadow = scene.getElementById('shadow'); shadow.addChild(node); 通过 `xrFrameSystem.registerGeometry` 注册后使用没有问题。
2023-03-09看到答案了,问题关闭……
XR-FRAME 目前只支持绘制三角形吗?想用 XR-FRAME 绘制点或线,但是发现好像只有 mesh,也无法指定绘制模式。 类似于 WebGLRenderingContext.drawArrays() 或 WebGLRenderingContext.drawElements() 的 mode 参数,看到了内部的 EPrimitiveType 这个枚举,但是似乎没有开放API去设置。
2023-03-04