L7
L7 copied to clipboard
WebGL 状态污染
ThreeLayer加载多个gltf模型,鼠标移动触发射线检测模型里面,再移出模型,PolygonLayer的填充颜色会变白色
hi @Editor-Studio, welcome!
Hi @Editor-Studio, Please star this repo if you find it useful! Thanks :star:! 你好~ @Editor-Studio 🌟 如果这个仓库对你有帮助,可以给我们点个star支持一下~你的支持对我们来说是最大的鼓励,感谢你的支持与点赞 🌟
const gl = renderer.getContext();
// 🔧 保存当前 WebGL 状态
const savedState = {
blendEnabled: gl.isEnabled(gl.BLEND),
blendSrcRGB: gl.getParameter(gl.BLEND_SRC_RGB),
blendDstRGB: gl.getParameter(gl.BLEND_DST_RGB),
blendSrcAlpha: gl.getParameter(gl.BLEND_SRC_ALPHA),
blendDstAlpha: gl.getParameter(gl.BLEND_DST_ALPHA),
depthTest: gl.isEnabled(gl.DEPTH_TEST),
depthMask: gl.getParameter(gl.DEPTH_WRITEMASK),
cullFace: gl.isEnabled(gl.CULL_FACE),
viewport: gl.getParameter(gl.VIEWPORT),
};
// 渲染 Three.js 场景
// @ts-ignore
renderer.render(threeScene, threeCamera);
// 🔧 恢复 WebGL 状态
if (savedState.blendEnabled) {
gl.enable(gl.BLEND);
} else {
gl.disable(gl.BLEND);
}
gl.blendFuncSeparate(
savedState.blendSrcRGB,
savedState.blendDstRGB,
savedState.blendSrcAlpha,
savedState.blendDstAlpha
);
if (savedState.depthTest) {
gl.enable(gl.DEPTH_TEST);
} else {
gl.disable(gl.DEPTH_TEST);
}
gl.depthMask(savedState.depthMask);
if (savedState.cullFace) {
gl.enable(gl.CULL_FACE);
} else {
gl.disable(gl.CULL_FACE);
}
gl.viewport(
savedState.viewport[0],
savedState.viewport[1],
savedState.viewport[2],
savedState.viewport[3]
);
// 重置 Three.js 渲染器状态
renderer.state.reset();
这样写就不会触发
这个应该还是context 切换导致的bug,可以提个PR
你们会修复这个问题吗