首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Three.js SSAOPass在AFrame中的实现

Three.js SSAOPass在AFrame中的实现
EN

Stack Overflow用户
提问于 2021-04-17 06:34:10
回答 1查看 442关注 0票数 2

我成功地将aframe中的THREE.Effectcomposer集成为一个组件,方法是导出所有内容(如THREE.Effectcomposer、THREE.SSAOPass等),并在aframe组件中添加效果,并且我调整了AFrame呈现器以更新场景中的效果。在这段代码中,来自三个is的OutlinePass工作得很好,但是SSAO没有工作,我也没有发现任何错误。请有人帮我解决这个问题。SSAOPass的代码如下所示

代码语言:javascript
运行
复制
AFRAME.registerComponent('ssao', {

  init: function () {
    this.el.addEventListener('that', evt => this.onEnter());
    this.el.addEventListener('mouseleave', evt => this.onLeave());
    setTimeout(() => this.el.emit("that"), 2000);
  },
  onEnter: function () {
    const scene = this.el.sceneEl.object3D;
    const camera = this.el.sceneEl.camera;
    const renderer = this.el.sceneEl.renderer;
    const render = renderer.render;
    const composer = new THREE.EffectComposer(renderer);
    //let renderPass = new THREE.RenderPass(scene, camera);
    //let outlinePass = new THREE.OutlinePass(new THREE.Vector2(window.innerWidth, window.innerHeight), scene, camera);
    const ssaoPass = new THREE.SSAOPass( scene, camera, window.innerWidth, window.innerHeight );
    //composer.addPass(renderPass);
    //composer.addPass(outlinePass);
    ssaoPass.kernelRadius = 16;
        composer.addPass( ssaoPass );
    // let objects = [];
    // this.el.object3D.traverse(node => {
    //   if (!node.isMesh) return;
    //   objects.push(node);
    // });
    // outlinePass.selectedObjects = objects;
    // outlinePass.renderToScreen = true;
    // outlinePass.edgeStrength = this.data.strength;
    // outlinePass.edgeGlow = this.data.glow;
    // outlinePass.visibleEdgeColor.set(this.data.color);
    // HACK the AFRAME render method (a bit ugly)
    const clock = new THREE.Clock();
    this.originalRenderMethod = render;
    let calledByComposer = false;
        renderer.render = function () {
      if (calledByComposer) {
        render.apply(renderer, arguments);
      } else {
        calledByComposer = true;
        composer.render(clock.getDelta());
        calledByComposer = false;
      }
    };
  },
  onLeave: function () {
    this.el.sceneEl.renderer.render = this.originalRenderMethod;
  },
  remove: function () {
    this.onLeave();
  }
});

我还创建了一个小故障项目,我在这里分享。请随时加入和合作我的项目编辑链接:https://glitch.com/edit/#!/accessible-torpid-partridge网站链接:https://accessible-torpid-partridge.glitch.me

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-17 19:34:30

代码是正确的,您只需要调整暴露的SSAOShader制服:

SSAOPass.kernelRadiusSSAOPass.minDistanceSSAOPass.maxDistance -就像在Three.js实例里。

记住--这个例子的规模是巨大的,所以在默认的aframe场景中,值需要不同。

动态更新组件是一个好主意(通过setAttribute() (如果您是正确处理更新),这样您就可以实时看到发生了什么。就像我在这里做的一样- A帧内的SSAO (也是基于唐·McCurdys 要旨的)。

我使用了一些基本的HTML元素,大多数三个示例都使用dat.GUI --它是为演示/调试调整而制作的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67135390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档