L7 icon indicating copy to clipboard operation
L7 copied to clipboard

WebGL 状态污染

Open Nxtspace opened this issue 2 months ago • 5 comments

ThreeLayer加载多个gltf模型,鼠标移动触发射线检测模型里面,再移出模型,PolygonLayer的填充颜色会变白色

Nxtspace avatar Oct 27 '25 07:10 Nxtspace

hi @Editor-Studio, welcome!

github-actions[bot] avatar Oct 27 '25 07:10 github-actions[bot]

Hi @Editor-Studio, Please star this repo if you find it useful! Thanks :star:! 你好~ @Editor-Studio 🌟 如果这个仓库对你有帮助,可以给我们点个star支持一下~你的支持对我们来说是最大的鼓励,感谢你的支持与点赞 🌟

github-actions[bot] avatar Oct 27 '25 07:10 github-actions[bot]

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();

这样写就不会触发

Nxtspace avatar Oct 27 '25 07:10 Nxtspace

这个应该还是context 切换导致的bug,可以提个PR

lzxue avatar Oct 27 '25 07:10 lzxue

你们会修复这个问题吗

Nxtspace avatar Oct 27 '25 07:10 Nxtspace