我成功地将aframe中的THREE.Effectcomposer集成为一个组件,方法是导出所有内容(如THREE.Effectcomposer、THREE.SSAOPass等),并在aframe组件中添加效果,并且我调整了AFrame呈现器以更新场景中的效果。在这段代码中,来自三个is的OutlinePass工作得很好,但是SSAO没有工作,我也没有发现任何错误。请有人帮我解决这个问题。SSAOPass的代码如下所示
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
提前感谢
发布于 2021-04-17 19:34:30
代码是正确的,您只需要调整暴露的SSAOShader
制服:
SSAOPass.kernelRadius
,SSAOPass.minDistance
,SSAOPass.maxDistance
-就像在Three.js实例里。
记住--这个例子的规模是巨大的,所以在默认的aframe场景中,值需要不同。
动态更新组件是一个好主意(通过setAttribute()
(如果您是正确处理更新),这样您就可以实时看到发生了什么。就像我在这里做的一样- A帧内的SSAO (也是基于唐·McCurdys 要旨的)。
我使用了一些基本的HTML元素,大多数三个示例都使用dat.GUI --它是为演示/调试调整而制作的。
https://stackoverflow.com/questions/67135390
复制相似问题