Three.js: [EffectComposer] 2 рд▓рдЧрд╛рддрд╛рд░ RenderPass рдХреЗ рд╕рд╛рде рдЕрдВрдХ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдлрд╝рд░ре░ 2012  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mrdoob/three.js

рд╕рдореНрдмрдиреНрдз

http://demo.bkcore.com/threejs/webgl_tron_glow.html

рдХреЛрдб

glowcomposer = new THREE.EffectComposer( renderer, renderTarget );

glowcomposer.addPass( renderModelGlow ); // RenderPass
glowcomposer.addPass( hblur ); // ShaderPass
glowcomposer.addPass( vblur ); // ShaderPass
glowcomposer.addPass( effectSave ); // SavePass

glowcomposer.addPass( renderModel ); // RenderPass
glowcomposer.addPass( finalPass ); // ShaderPass

рдкреНрд░рд╕рдВрдЧ

рдореБрдЭреЗ рдПрдХ рд╣реА рд╡рд╕реНрддреБ / рдХреИрдорд░рд╛ / рдкреНрд░рдХрд╛рд╢ рдХреЗ рд╕рд╛рде рджреЛ рджреГрд╢реНрдп рдорд┐рд▓реЗред рдлреИрд▓рд╛рдирд╛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдПрдХ (http://demo.bkcore.com/threejs/webgl_tron.html) рдФрд░ рдПрдХ рдЪрдордХрджрд╛рд░ рдмрдирд╛рд╡рдЯ (рдЪрдордХ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛рд▓реЗ рд░рдВрдЧ рдкрд░ рд╕рдлреЗрдж рд╣реЛрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рдеред

рдореЗрд░реА рдкреНрд░рддрд┐рдкрд╛рджрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдореИрдВ рдкрд╣рд▓реЗ рдЪрдордХ рджреГрд╢реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рдПрдЪ / рд╡реА рдХрд▓рдВрдХ рд▓рдЧрд╛рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕реЗрд╡рдкрдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлреНрд░реЗрдордмрд░реНрдлрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВред
рддрдм рдореИрдВ рдлреИрд▓рд╛рдирд╛ рджреГрд╢реНрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдФрд░ рдЕрдВрдд рдореЗрдВ рдЪрдордХ рдлреНрд░реЗрдордмрдлрд╝рд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВред

рд╕рдорд╕реНрдпрд╛

рдореЗрд░реА рдЪрдордХ sampler2D рдореЗрд░реЗ рдЕрдВрддрд┐рдо рдЪрд░рдг shader рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЧреБрдЬрд░ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдбреЗрдореЛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлреИрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ RenderPass рдХреЙрд▓ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рд▓реЗ рд░рдВрдЧ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд░реЗрдВрдбрд░ рдкрд╛рд╕ рдФрд░ рдЙрд╕ рдХрд╛рдо рдореЗрдВ рдбрд┐рдлреНрдпреВрдЬрд╝ рд╕реАрди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрд╣ рддрдм рд╣реИ рдЬрдм рдореИрдВ рдЗрд╕реЗ рджреВрд╕рд░реЗ RenderPass рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ ?

рдзрдиреНрдпрд╡рд╛рджред
рдерд┐рдмреБрдд рдбреАред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдбреЗрдореЛ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ I рдиреЗ рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рдПрдлрдПрдХреНрд╕ рд▓рдЧрд╛рдиреЗ рдФрд░ рдПрдбрд┐рдЯрд┐рд╡ рдмреНрд▓реЗрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдЪрдирд╛ (рдереНрд░реА.рдЬреЗрдПрд╕ v79 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд╛ рдПрдХ рдЫреАрди-рдбрд╛рдЙрди рдбреЗрдореЛ рдмрдирд╛рдпрд╛: https://www.airtightinteractive.com/demos/selective-fx/

рд╕рднреА 18 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, # 1017 рджреЗрдЦреЗрдВред

рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рджреЛ рдХрдВрдкреЛрдЬрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдВрдбрд░ рдЯрд╛рд░рдЧреЗрдЯ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреА рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХреЗ рд╕рд╛рде)ред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

glowComposer = new THREE.EffectComposer( renderer, renderTargetGlow );

glowComposer.addPass( renderModelGlow ); // RenderPass
glowComposer.addPass( hblur ); // ShaderPass
glowComposer.addPass( vblur ); // ShaderPass

finalComposer = new THREE.EffectComposer( renderer, renderTargetFinal );
finalComposer.addPass( renderModel ); // RenderPass
finalComposer.addPass( finalPass ); // ShaderPass

рдЕрдм рдлреИрд▓рд╛рдирд╛ рдкрд░рдд рдирд┐рдпрдорд┐рдд рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ tDiffuse рдореЗрдВ рдмрдирд╛рд╡рдЯ рдирдореВрдирд╛ finalComposer рдФрд░ рдкрд░рдд рдЖрдк рд╕реЗ рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдЧрд╛ рдЪрдордХ glowComposer ред

рдпрд╣ рдпрд╛ рддреЛ glowComposer.renderTarget1 рдпрд╛ glowComposer.renderTarget2 рдкрд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрдЧрд╛ рдФрд░ рдХреНрдпрд╛ рдкрд╛рд╕ рд╕реНрд╡рд┐рдЪ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдмрдлрд╝рд░реНрд╕, рд╕рд░рд▓рддрдо рджреЛрдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╣реИ рдФрд░ рджреЗрдЦрдирд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

finalshader.uniforms[ 'tGlow' ].texture = glowComposer.renderTarget1;

рдореИрдВрдиреЗ рд╡рд╣ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред

рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЛрдб рд╣реИ:
http://demo.bkcore.com/threejs/webgl_tron_glow_swap.html
рд░реЗрдВрдбрд░рдореЙрдбрд▓ рд╕реЗ рдЯрд┐рдлрд╝реНрдпреВрдЬрд╝ рдЕрднреА рднреА рдХрд╛рд▓рд╛ рд╣реИред

рдФрд░ рдпрд╣ рдареАрдХ рдЙрд╕реА рдХреЛрдб рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд░реЗрдВрдбрд░ рдкрд╛рд╕ рд╕реНрд╡реИрдк рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдлреИрд▓рд╛рдирд╛ рджреГрд╢реНрдп рдЪрдордХ рд╕рдВрдЧреАрддрдХрд╛рд░ рдореЗрдВ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рд╕рдВрдЧреАрддрдХрд╛рд░ рдореЗрдВ рдЪрдордХ рджреГрд╢реНрдп):
http://demo.bkcore.com/threejs/webgl_tron_glow_swap2.html
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдлреИрд▓ рдХреЗ рдзреБрдВрдзрд▓реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рдЪрдордХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рджреЛрдиреЛрдВ tGlow рдФрд░ tDiffuse samplers рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

рдФрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рднреА рд╕реНрд╡реИрдк (рдкрдВрдХреНрддрд┐ 130 рдФрд░ 175):
рдирдпрд╛ THREE.RenderPass (рджреГрд╢реНрдп, рдХреИрдорд░рд╛);
рд╕рд╛рде рдореЗрдВ
рдирдпрд╛ THREE.RenderPass (glowscene, glowcamera);

рдпрд╣ рдХрд╛рдлреА рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓реА рд╣реИред

рдпрджрд┐ рдЖрдк рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RGBA рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЦреИрд░, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд┐рд╕реА рднреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рдЪрдордХ рдкрд╛рд╕ рдХрд╛рд▓реЗ рд░рдВрдЧ рдкрд░ рд╕рдлреЗрдж рд╣реЛрддреА рд╣реИ рдФрд░ рдореЗрд░реА рдлреИрд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ ... рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рдлреИрд▓рддреА рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЬрд░реВрд░рдд рди рдкрдбрд╝реЗред

рдлрд┐рд░ рднреА, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЖрд░рдЯреА рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдЖрд░рдЬреАрдмреАрдП рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ред

рдпрд╣рд╛рдБ рд╡рд┐рдЪрд┐рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ, рдХрд┐ рдореЗрд░реЗ рджреГрд╢реНрдп / рдХреИрдорд░рд╛ RenderPass рдХреЛ рдореЗрд░реЗ Glowscene / Glowcamera RenderPass рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореЗрд░реЗ Glowscene / Glowcamera RenderPass рд╕реЗ рдкрд╣рд▓реЗ рдореЗрд░рд╛ рджреГрд╢реНрдп / рдХреИрдорд░рд╛ RenderPass рдХрд░рддрд╛ рд╣реИред

рд╣рдореНрдо, рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ (# 1211 рджреЗрдЦреЗрдВ)ред

рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗ:

function createScene( geometry, x, y, z, b ) {

    zmesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );

    // ...

    var geometryClone = THREE.GeometryUtils.clone( geometry );
    var gmat = new THREE.MeshBasicMaterial( { map: gtex } );
    var gmesh = new THREE.Mesh( geometryClone, gmat );

    // ...
}

рд╣рд╛рдБ ! рд╡рд╣ рдпрд╣ рдерд╛ред

рдореЗрд░реЗ рджреЛ рдирдореВрдиреЗ рдЕрдм рд╕рд╣реА рдврдВрдЧ рд╕реЗ рднрд░реЗ рдЧрдП рд╣реИрдВред рдзрдиреНрдпрд╡рд╛рдж :)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рд╣рдо ... рдПрдХ рдФрд░ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░, рдореЗрд░реЗ рджреЛ рдирдореВрдиреЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рдЬрдм рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ

gl_FragColor = texel;

рдореБрдЭреЗ рдлреИрд▓рд╛рдирд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрддрд╛ рд╣реИ (http://demo.bkcore.com/threejs/webgl_tron_glow_swap2.html)

рдЬрдм рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ

gl_FragColor = glow;

рдореБрдЭреЗ рдЪрдордХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдорд┐рд▓рддреА рд╣реИред

рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рджреЛрдиреЛрдВ рдкрд░ рдПрдХ рд╕рд░рд▓ рдпреЛрдЧрд╛рддреНрдордХ рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ
gl_FragColor = рдЯреЗрдХреНрд╕реЗрд▓ + рдЪрдордХ;
рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЪрдордХ рдорд┐рд▓рддреА рд╣реИ (http://demo.bkcore.com/threejs/webgl_tron_glow_swap.html)ред

рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдкрд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖред

EDIT2

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд░ рд░рд╣рд╛ рд╣реИ

gl_FragColor = texel + glow;

рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

gl_FragColor = glow + glow;

рдпрд╣ рдЯреЗрдХреНрд╕рд▓ vec4 рдХреА рддрд░рд╣ рд╣реИ, рдЗрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ vex4 рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рдЧрд▓ рд▓рдЧрддрд╛ рд╣реИред

рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдмрдирд╛рд╡рдЯ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдмрдирд╛рд╡рдЯ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

uniforms: {
    tDiffuse: { type: "t", value: 0, texture: null },
    tGlow:    { type: "t", value: 1, texture: null }
},

рдЙрддреНрддрдо!
http://demo.bkcore.com/threejs/webgl_tron_glow.html

рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж :)

рдЧрд░реНрдореА!

рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдереНрд░реАред рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдЪрдпрдирд╛рддреНрдордХ рдЪрдордХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: http://bkcore.com/blog/3d/webgl-three-js-animated-selective-glow.html

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреАред

рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛;)

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдФрд░ рд╕рд╕реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдЕрдзрд┐рдХ рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рдкрд╛рд╕реЛрдВ рдореЗрдВ рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕рдорд╛рди рдмрдлрд╝рд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ)ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреНрд▓реЛ рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рдмреЗрд╕рд┐рдХ рдордЯреАрд░рд┐рдпрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд▓реИрдВрдмрд░реНрдЯ рдордЯреЗрд░рд┐рдпрд▓ рдХреЛ рдЬрд╝реАрд░реЛ рдбрд┐рдлреНрдпреВрдЬрд╝ рд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдПрдореНрдмрд┐рдПрдВрдЯ рд▓рд╛рдЗрдЯ рдХреЗ рд╕рд╛рдеред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

glowScene.add( new THREE.AmbientLight( 0xffffff ) );

// ...

var gmat = new THREE.MeshLambertMaterial( { map: gtex, ambient: 0xffffff, color: 0x000000 } );
var gmesh = new THREE.Mesh( geometry, gmat );

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

http://demo.bkcore.com/threejs/webgl_tron_glow_seq.html

рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд▓реЗрдЦ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рдж !

рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ r60 рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдкрд░ рдкреНрд░рднрд╛рд╡ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рддреЗ рд╣реБрдП рдЖ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдЧреЛрдбреНрд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдкрд╛рд╕ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред "рдЯреИрдб" рдЯреЗрдХреНрд╕рдЯрд╛рдЗрд▓ рдЪреИрдирд▓ рдХреЛ рдСрдХреНрд▓реЛрдХреЛрдореНрдкрд╕рд░ рдЖрдЙрдЯрдкреБрдЯ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдЗрдлрд╝реЗрдХреНрдЯ рдХрдореНрдкреЛрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдБ !! рдореИрдВрдиреЗ рд░реЗрдВрдбрд░рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред PreserveDrawingBuffer = true, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЭреВрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рд╕реНрдерд╛рдкрдирд╛ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдерд╛ред

рдЕрдЧрд░ рдореИрдВ рдЕрдВрддрд┐рдо рдХрдВрдкреЛрдЬрд░ рдХреЗ рдмрд╛рдж рдСрдХрд▓рдХрдВрдкреЛрдЬрд░ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЧреЛрдбреНрд░реЗ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЧреЙрдбрд░реЗрдЬ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдХреЛрдИ рдореЙрдбрд▓ рдирд╣реАрдВред

рдЕрдВрддрд┐рдо рдкрд╛рд╕ рдореЗрдВ рдЯреИрдбрд▓ рдЪреИрдирд▓ рдХреЛ рдСрдХрд▓рдХрдВрдкреЛрдЬрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдореЗрд╢рдмреЗрд╕рд┐рдХрдореАрдЯрд░ рдкрд░ рдкрд╛рдЗрдк рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдЯреЗрдХреНрд╕рдЪрд░реНрдб рдХреНрд╡рд╛рдб рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рджреГрд╢реНрдп рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдЕрдм рдореИрдВ рдореЙрдбрд▓ рдФрд░ рдЧреЙрдбреЗрдЬрд╝ (рд╡рд┐рдорд╛рди рдкрд░) рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдирд╣реАрдВ рдореБрдЭреЗ рдЬреЛ рдкреНрд░рднрд╛рд╡ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрдирд╛рд╡рдЯ рдкрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред

// COMPOSERS
//-------------------
var renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, stencilBufer: false };

renderTargetOcl = new THREE.WebGLRenderTarget( SCREEN_WIDTH/2, SCREEN_HEIGHT/2, renderTargetParameters );

hblur = new THREE.ShaderPass( THREE.ShaderExtras[ "horizontalBlur" ] );
vblur = new THREE.ShaderPass( THREE.ShaderExtras[ "verticalBlur" ] );
var bluriness = 2;

hblur.uniforms[ 'h' ].value = bluriness / SCREEN_WIDTH*2;
vblur.uniforms[ 'v' ].value = bluriness / SCREEN_HEIGHT*2;

var renderModel = new THREE.RenderPass( scene, camera );
var renderModelOcl = new THREE.RenderPass( oclscene, oclcamera );

grPass = new THREE.ShaderPass( THREE.Extras.Shaders.Godrays );
grPass.needsSwap = true;
grPass.renderToScreen = false;

oclcomposer = new THREE.EffectComposer( renderer, renderTargetOcl );

oclcomposer.addPass( renderModelOcl );
oclcomposer.addPass( hblur );
oclcomposer.addPass( vblur );
oclcomposer.addPass( grPass );

var finalPass = new THREE.ShaderPass( THREE.Extras.Shaders.Additive );
finalPass.needsSwap = true;
finalPass.renderToScreen = true;
finalPass.uniforms[ 'tAdd' ].texture = oclcomposer.renderTarget1;

renderTarget = new THREE.WebGLRenderTarget( SCREEN_WIDTH, SCREEN_HEIGHT, renderTargetParameters );
finalcomposer = new THREE.EffectComposer( renderer, renderTarget );

finalcomposer.addPass( renderModel );
finalcomposer.addPass( finalPass );

//RENDER
//-----------
oclcomposer.render(0.1);
finalcomposer.render( 0.1 );

@bbiswas рдореЗрд░реЗ рдкрд╛рд╕ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреБрдЫ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ?

рд╣рд╛рдВ рдореБрдЭреЗ рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ - рдпрд╣рд╛рдВ рдХреЛрдб рд╣реИ

var renderTargetOcl = new THREE.WebGLRenderTarget( webGL_window_width/4, webGL_window_height/4, renderTargetParameters );

            hblur = new THREE.ShaderPass( THREE.ShaderExtras[ "horizontalBlur" ] );
            vblur = new THREE.ShaderPass( THREE.ShaderExtras[ "verticalBlur" ] );

            var bluriness = 3;

            hblur.uniforms[ 'h' ].value = bluriness / webGL_window_width*2;
            vblur.uniforms[ 'v' ].value = bluriness / webGL_window_height*2;

            var renderModel = new THREE.RenderPass( scene, camera );
            var renderModelOcl = new THREE.RenderPass( g_occlusion_buffer, g_occlusion_camera );

            grPass = new THREE.ShaderPass( THREE.Extras.Shaders.Godrays );
            grPass.needsSwap = true;
            grPass.renderToScreen = false;

            g_volumetric_light_composer = new THREE.EffectComposer( webGLRenderer, renderTargetOcl );

            g_volumetric_light_composer.addPass( renderModelOcl );
            g_volumetric_light_composer.addPass( hblur );
            g_volumetric_light_composer.addPass( vblur );
            g_volumetric_light_composer.addPass( hblur );
            g_volumetric_light_composer.addPass( vblur );
            g_volumetric_light_composer.addPass( grPass );

            var finalPass = new THREE.ShaderPass( THREE.Extras.Shaders.Additive );
            finalPass.needsSwap = true;
            finalPass.renderToScreen = true;
            finalPass.uniforms[ 'tAdd' ].value = g_volumetric_light_composer.renderTarget1;

            finalcomposer.addPass( renderModel );
            finalcomposer.addPass( finalPass );

//in Render Loop



                g_occlusion_camera.position = camera.position;

                g_occlusion_camera.lookAt( new THREE.Vector3(0,0,0) );
                camera.lookAt( new THREE.Vector3(0,0,0)  );

                vlight.position = pointLight1.position;
                vlight.updateMatrixWorld();

                var lPos = THREE.Extras.Utils.projectOnScreen(pointLight1, camera);
                grPass.uniforms["fX"].value = lPos.x;
                grPass.uniforms["fY"].value = lPos.y;

                g_volumetric_light_composer.render(0.1);
                finalcomposer.render( 0.1 );

рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣ finalPass.uniforms[ 'tAdd' ].value рд╕рд╛рде рдХреА рд░реЗрдЦрд╛ рдереАред рдореЗрд░реЗ рдкрд╛рд╕ finalPass.uniforms[ 'tAdd' ].texture рдкрд╣рд▓реЗ рдерд╛ред

рдЕрд░реЗ bbwwas, рдХреНрдпрд╛ рдЖрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдкрдиреЗ рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП g_occlusion_buffer рдмрдирд╛рдпрд╛ рд╣реИ:

var renderModelOcl = рдирдпрд╛ THREE.RenderPass (g_occlusion_buffer, g_occlusion_camera);

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдбреЗрдореЛ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ:

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ I рдиреЗ рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рдПрдлрдПрдХреНрд╕ рд▓рдЧрд╛рдиреЗ рдФрд░ рдПрдбрд┐рдЯрд┐рд╡ рдмреНрд▓реЗрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдЪрдирд╛ (рдереНрд░реА.рдЬреЗрдПрд╕ v79 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд╛ рдПрдХ рдЫреАрди-рдбрд╛рдЙрди рдбреЗрдореЛ рдмрдирд╛рдпрд╛: https://www.airtightinteractive.com/demos/selective-fx/

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

boyravikumar picture boyravikumar  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

makc picture makc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alexprut picture alexprut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

clawconduce picture clawconduce  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

filharvey picture filharvey  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ