於是我開始之前,我只是想給一個喊出來Martin Schuhfuß誰提供的洞察力,這種解決方案。
免責聲明
我不是一個專家或專業程序員決不javascript和我認爲,這是這樣做的唯一途徑,我的演講應該採取以抽象的方式。我的想法僅僅解釋瞭解決方案所基於的理論前提,並且這將取決於您自己的架構。
架構
我在這個例子中使用OOP方法,你應該能夠操縱解決任何你正在使用。
方法
因此,基於馬丁目前的例子中,你可以看到,我們能夠作曲家屬性/對象添加到我們的場景中的對象,這意味着場景可能然而,在繼承相同的作曲家的效果是輝煌的,我的情況我有許多不同作曲家效果的場景,所以我需要重新思考這個問題。
1.創建一個Composer對象。
所以我創建了一個對象來放置composer對象,並在引用我的效果時保持好的'composer'名稱約定。
This.composer = {};
2.創建一個函數來初始化有關場景的RenderPasses。
因此,重要的是要記住,在調用我們的作曲家之前,我們需要先定義並初始化RenderPasses。 RenderPasses允許我們歸類我們想要的效果(知道有着色器)。在我的示例中,我有兩個場景因此需要創建:
- 兩個RenderPasses。
- One RenderPass複製場景。
- 另一個RenderPass將棕褐色效果應用於其場景。代碼的
例子:
this.init = function() {
stackoverflow.webgl.pass.base = new THREE.RenderPass(stackoverflow.webgl.scene.default,
stackoverflow.webgl.camera);
stackoverflow.webgl.pass.base2 = new THREE.RenderPass(stackoverflow.webgl.scene.test,
stackoverflow.webgl.camera);
stackoverflow.webgl.pass.sepia = new
THREE.ShaderPass(THREE.SepiaShader);
stackoverflow.webgl.pass.sepia.renderToScreen = true;
stackoverflow.webgl.pass.copy = new THREE.ShaderPass(THREE.CopyShader);
stackoverflow.webgl.pass.copy.renderToScreen = true;
}
注:一些文件名必須重命名,由於法律上的原因,但問題的關鍵是在於,這個函數被調用到一個更大的物體。
3.創建一個啓動功能,讓指定作曲家場景
此功能的目的只是爲了證明我們如何結合起來一起。所以我們的代碼就是這樣的。
// so we create an object to use for reference for EffectComposer objects
this.composer = {};
// this property is used to set the scene that we want
// this.scene.default = new THREE.Scene();
this.activeScene = this.scene.default;
// this function is just a wrapper for our code
this.start = function() {
// so call our initialise our RenderPasses
stackoverflow.webgl.pass.init();
// my own method of seting up the WebGLRenderer scene (You do it your Way!)
stackoverflow.webgl.renderer.default.setup;
// Create a new composer for scene 1
this.composer.ui = new THREE.EffectComposer(stackoverflow.webgl.renderer.default.init);
// Create a new composer for scene 1
this.composer.ui2 = new THREE.EffectComposer(stackoverflow.webgl.renderer.default.init);
// Now here is the cool stuff you can assign a composer to each scene
this.scene.default.composer = stackoverflow.webgl.composer.ui;
this.scene.test.composer = stackoverflow.webgl.composer.ui2;
// and i always like to check that things happen and they do ;)
console.log(this.scene.default);
console.log(this.scene.test);
console.log(this.composer);
// so you will need to add the passes some place, I created a function call render, (you do according to your code structure)
stackoverflow.webgl.render();
}
4.定義,你在你的架構添加通行證
所以現在我們需要(從作曲家addpass功能)添加pass聲明對我們的影響發生。
this.render = function() {
stackoverflow.webgl.composer.ui.addPass(stackoverflow.webgl.pass.base);
stackoverflow.webgl.composer.ui.addPass(stackoverflow.webgl.pass.copy);
stackoverflow.webgl.composer.ui2.addPass(stackoverflow.webgl.pass.base2);
stackoverflow.webgl.composer.ui2.addPass(stackoverflow.webgl.pass.sepia);
};
5.添加EffectComposer渲染方法
所以這行代碼都需要無論你做了作曲家處理放置(取決於你的設置)。
stackoverflow.webgl.activeScene.composer.render();
請大家注意,「activecScene」部分提到了當時使用的實際場景。這是允許我們改變場景的。
6.創建一個按鈕,並
所以我在dat.gui實例,讓我的兩個場景之間切換創建了兩個按鈕的場景之間切換。
再次,你可以創建一個按鈕,無論你喜歡什麼功能。
// again just change the vale of active scene to the scene you wish to change to
// button 1 value will be something like this:
stackoverflow.webgl.activeScene = stackoverflow.webgl.scene.test;
// button 2 value will takes us back to scene 1
stackoverflow.webgl.activeScene = stackoverflow.webgl.scene.default;
結論 這是我實現這個效果的方法,但如果有更好的或替代方法,那麼請加入到討論和分享。
我很抱歉沒有早日回覆你,謝謝你的這個例子,我做了一個快速實現,它通過切換效果器中的場景來工作,正如你提到的我可以使用多種effectComposers我只是想要可視化通過你的例子,這看起來如何,仍然使用效果作曲家的方法對我來說都是新的。是否有可能提供一個這樣的小代碼片段。非常感謝 – W9914420
我真的不知道你的用例,所以有點難以想出有關架構的建議。您可以將作曲者附加到場景對象,以便只需切換場景並始終使用'activeScene.composer.render()'進行渲染。關於Effect-Composer本身的更多細節,我會建議添加一個單獨的問題(也許,這可能有助於:https://github.com/hughsk/three-effectcomposer) –
是的,我認爲activeScene.composer是我正在尋找對於。 thnxs的提示和編輯的例子,我會加我的解決方案到我的問題:) – W9914420