Three.js: рд╕рд╛рдордЧреНрд░реА: рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ onBeforeCompile ()

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЬреВрди 2017  ┬╖  75рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mrdoob/three.js

рд╡рд░реНрд╖реЛрдВ рд╕реЗ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИред рдЖрдЬ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЗрд╕реЗ Object3D рдХреЗ onBeforeRender() рд╕рдорд╛рди рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

https://github.com/mrdoob/three.js/commit/e55898c27a843f69a47e602761c60d9bbe91ee35

WebGLPrograms рдХрд╣рддреЗ рд╣реИрдВ onBeforeCompile.toString() рддреЛ рдпрд╣ рдЕрдиреНрдп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рджреГрд╢реНрдп рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

http://rawgit.com/mrdoob/three.js/dev/examples/webgl_materials_modified.html

material.onBeforeCompile = function ( shader ) {

    // console.log( shader )

    shader.uniforms.time = { value: 0 };

    shader.vertexShader = 'uniform float time;\n' + shader.vertexShader;
    shader.vertexShader = shader.vertexShader.replace(
        '#include <begin_vertex>',
        'vec3 transformed = vec3( position.x + sin( time + position.y ) / 2.0, position.y, position.z );'
    );

    materialShader = shader;

};

рд╣рдо рди рдХреЗрд╡рд▓ рд╢реЗрдбрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╣рдо рдХрд╕реНрдЯрдо рд╡рд░реНрджреА рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

if ( materialShader ) {

    materialShader.uniforms.time.value = performance.now() / 1000;

}

рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рд╣реИрдХреА рд╣реИ?

/cc @WestLangley @bhouston @tschw

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

@mrdoob рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .onBeforeCompile() рд╕рд╛рде рд╣реИрдХ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ (рдпрд╛ рдЕрд╕рдВрднрд╡) рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ ShaderMaterial рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡реЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ (рд░реЗрдВрдбрд░, рдХреЙрдкреА, рдХреНрд▓реЛрди, рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝, рдФрд░ рдЗрд╕реА рддрд░рд╣) рд╕рдВрд╢реЛрдзрд┐рдд рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА (рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд┐ onBeforeCompile() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ...

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

рдЬрдм WebGLProgram.js рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд╕реНрдЯрдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореИрдирд┐рдкреБрд▓реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬреЛ рдореМрдЬреВрджрд╛ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдирдП #includes рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЖрдЬ рд░рдирдЯрд╛рдЗрдо рдкрд░ THREE.ShaderLib рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрддрдирд╛ рд╣реА рдЧрдВрджрд╛ рд▓рдЧрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо ShaderLib рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ, рдЬреЛ рдореИрдиреНрдпреБрдЕрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореИрдирд┐рдкреБрд▓реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдХреНрд▓реЙрдмрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб/рдмрдврд╝рд╛рдПрдЧрд╛ред рдпрд╣ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП onBeforeCompile рд╣реБрдХ рдХреЛ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдХрдЪреНрдЪреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╢реЗрдбрд░ рд░рдЪрдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрд╣реБрдд рдирд╛рдЬреБрдХ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рднреА рдХрдВрдХрд╛рд▓ рдХреЛрдб (рдЬреИрд╕реЗ meshphong_vert.glsl ) рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

export class MyPhongMaterial extends ShaderMaterial {
  constructor({ color, radius, map, normalMap, emissiveMap }) {
    super();
    this.vertexShader = "...."
    this.fragmentShader = "....";
    this.uniforms = UniformsUtils.clone(ShaderLib.phong.uniforms);

    this.isMeshPhongMaterial = true;
    this.lights = true;

    this.uniforms.time = { value: 1 };
    //...
  }
}

рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╢реЗрдбрд░реНрд╕ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдЧрдарди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдПрдХ рд░рд┐рд▓реАрдЬ рд╕реЗ рдЕрдЧрд▓реЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рди рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдорд┐рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреЗрд╕ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдорд┐рд▓-рд╕реНрддрд░ рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗ рдмрдЬрд╛рдп рдлрд╝рдВрдХреНрд╢рди-рд╕реНрддрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЖрдЬ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛..

рдЕрдЪреНрдЫрд╛! рдореИрдВрдиреЗ рднреА резреж рдлрд░рд╡рд░реА рдХреЛ рдРрд╕рд╛ рд╣реА рд╕реЛрдЪрд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛:

https://github.com/mrdoob/three.js/pull/10791

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореИрдВрдиреЗ WebGLRenderer рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рддрд░реНрдХ рдореЗрдВ рдЯреИрдк рдХрд┐рдпрд╛ред

рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрдиjs рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рд╣реЛрдВрдЧреЗред

рдЖрдк рдореЗрд░реА рд╢рд╛рдЦрд╛ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдкрд┐рди рдХреЗ рд▓рд┐рдП рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рд╕реБрдкрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╕ рдкреНрд░рдХрд╛рд╢/рдЫрд╛рдпрд╛ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рд░реВрдкрдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рд╡рд░реНрджреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ)ред

http://dusanbosnjak.com/test/webGL/three-material-shader-override/webgl_materials_shader_override.html

рд╢рд╛рдпрдж рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо ShaderLib рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ, рдЬреЛ рдореИрдиреНрдпреБрдЕрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореИрдирд┐рдкреБрд▓реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдХреНрд▓реЙрдмрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб/рдмрдврд╝рд╛рдПрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: https://github.com/mrdoob/three.js/pull/10791 рдХрд╛рд╢ рдореИрдВ рдмреЗрд╣рддрд░ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦ рдкрд╛рддрд╛ :)


рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдиреЗ рддреАрди рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕реЗ рддрдм рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдпрд╣ рдереЛрдбрд╝рд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред

рдЬреНрдпрд╛рджрд╛рддрд░ рдирд┐рд░рд╛рд╢рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдкрдврд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдбреАрдЬрд╛ рд╡реБ рд╣реЛрддрд╛ рд╣реИ:

... Object3D рдХреЗ onBeforeRender() рдХреЗ рд╕рдорд╛рди рддрд░реАрдХрд╛ред

рдареАрдХ рдпрд╣реА рдмрд╛рдд onBeforeRender() https://github.com/mrdoob/three.js/pull/9738 рдХреЗ рд╕рд╛рде рднреА рд╣реБрдИ , рдЬрдм рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╡рд░реНрд╖ рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред

рдЬреАрдЬрд╝, рджреЛ рдмрд╛рд░, рдПрдХ рд╣реА рджреЗрд╡ рдХреЗ рд╕рд╛рде? рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛? рдкрд╣рд▓реА рдмрд╛рд░ рдмрд┐рд▓реНрдб рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд░рд╣реА рдереА, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╕ рднреВрд▓ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдЗрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдерд╛, рдЕрднреА рдПрдХ рд╕рдВрдШрд░реНрд╖ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдорд╣реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдерд╛ред

рдореБрдЭреЗ рдЧрд▓рдд рдордд рд╕рдордЭреЛ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рдХреЗ рдХрд╛рдореЛрдВ рдореЗрдВ рд╡реНрдпрд░реНрде рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред @unconed рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдиреНрдп рдкреАрдЖрд░ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛ?

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

рдХреНрдпрд╛ рдЙрджрд╛рд╣рд░рдг рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдерд╛? рд╕рд┐рд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдЕрдореВрд░реНрдд рд╕реНрдкрд╛рдЗрдХ рдмреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЫрд╛рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рдЬрдореАрди рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рднрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкрд╛рдк/рдХреНрдпреЛрдВрдХрд┐ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ... рднрд▓реЗ рд╣реА рджреГрд╢реНрдп рдХрд┐рдЯ рдмрд┐рд▓реНрдХреБрд▓ рднрдпрд╛рдирдХ рд╣реИ, рдпрд╣ рдПрдкреАрдЖрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ:

https://developer.apple.com/documentation/scenekit/scnshadable

рдпрджреНрдпрдкрд┐ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд, рдореБрдЭреЗ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдкрд╛рд╕ рд╢реЗрдбрд░ рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрдореВрд░реНрдд рд╣реБрдХ рд╣реИрдВред

рдЗрд╕ рд╕рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдРрд╕рд╛ рд╣реА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИ рдпрджрд┐ рдареАрдХ рд╡рд╣реА рдЪреАрдЬрд╝ рдирд╣реАрдВ рд╣реИ:

https://github.com/mrdoob/three.js/pull/10791

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореИрдВрдиреЗ WebGLRenderer рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рддрд░реНрдХ рдореЗрдВ рдЯреИрдк рдХрд┐рдпрд╛ред

рдЙрд╕ рдкреАрдЖрд░ рдХреА рдЕрднреА рддрдХ рджреЗрдЦрднрд╛рд▓ рдирд╣реАрдВ рдХрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ @pailheadред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 3 рдирдИ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрдм рдХреБрдЫ рд╕рдордп рдЖрдкрдХреЗ рдФрд░ @unconed рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рддреАрди рд▓рд╛рдЗрдиреЗрдВред рдореИрдВ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХрд╣рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЬрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рдерд╛ :)

рдЬреАрдЬрд╝, рджреЛ рдмрд╛рд░, рдПрдХ рд╣реА рджреЗрд╡ рдХреЗ рд╕рд╛рде? рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛?

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

рдпрд╣ рдХреЗрд╡рд▓ рдЖрдк рд╣реА рдирд╣реАрдВ @pailhead рд╣реИрдВред @bhouston рдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ PR рд╣реИрдВ , рдпрд╣рд╛рдБ рддрдХ рдХрд┐

рдлрд┐рд░, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкреАрдЖрд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдкреАрдЖрд░ рдХреЛ рдХреБрдЫ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЙрд╕ рд╕рдордп рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрдВрд╕реНрдЯреЗрдВрд╕рд┐рдВрдЧ рдкреАрдЖрд░ рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рд╕рд░рд▓реАрдХрд░рдг рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдЬрд▓реНрдж рд╣реА рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦ рдкрд╛рдКрдВрдЧрд╛ред

рдпрд╣ рд╕рдм рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреАрдЖрд░ рдХреЛ рд╡рд╣ рдзреНрдпрд╛рди рджреЗрдирд╛ рдХрдард┐рди рд╣реИ рдЬрд┐рд╕рдХреЗ рд╡реЗ рд╣рдХрджрд╛рд░ рд╣реИрдВред

рдХреНрдпрд╛ рдЙрджрд╛рд╣рд░рдг рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдерд╛? рд╕рд┐рд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдЕрдореВрд░реНрдд рд╕реНрдкрд╛рдЗрдХ рдмреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЫрд╛рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рдЬрдореАрди рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рднрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкрд╛рдк/рдХреНрдпреЛрдВрдХрд┐ред

рдЕрдм рдЖрдк рдЗрд╕рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░реЗрдВ... рд╣рд╛рдБ, рдЬрд╝реВрдо рдЗрди рдХрд░рдиреЗ рдкрд░ рдирдП MacBook Pro рдкрд░ 10fps рдкрд░ рдЪрд▓рддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЫрд╛рдпрд╛ рдФрд░ рд░реИрдВрдб, рдкрд╛рдк рдХреЙрд╕ рдФрд░ рд╕рд╛рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рдБ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣рд┐рдЯ рд▓реЗрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреИрд╕реЗ рд╕рд╛рдордЧреНрд░реА рдкрд░рдо рд╡рд░реНрджреА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╢рдмреНрджрдХреЛрд╢ рдХреА рддрд░рд╣ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ ShaderLib рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП #include <> рдЕрд▓рдЧ рдХреЛрдб рд▓рд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рд╢рд╛рдорд┐рд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рдЗрд╕реЗ glsl рд╕реЗ рдмрджрд▓ рджреЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╢реЗрдбрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реИрдкрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреЗрд╡рд▓ replace() рдмрдЬрд╛рдп рдЦрдВрдб рдирд╛рдо + glsl рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рджреВрд╕рд░реЗ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ .

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдореИрдВрдиреЗ рдЗрддрдиреЗ рд╕рд╛рд░реЗ 3 рдбреА рдЗрдВрдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХрддрд╛ рдФрд░ рджреГрд╢реНрдп рдХрд┐рдЯ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИред

@ рдЕрд╕рдВрдмрджреНрдз

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ onBeforeCompile() рд╕реЗ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рднреМрддрд┐рдХ рдЧреБрдг рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

export class MyMeshPhongMaterial extends MeshPhongMaterial {
  constructor( parameters ) {
    super( parameters );
    this.onBeforeCompile = function ( shader ) {
      shader.vertexShader = shader.vertexShader.replace(
        '#include <begin_vertex>',
        'vec3 transformed = vec3( position.x + sin( position.y ) / 2.0, position.y, position.z );'
      );
    };
  }
}

var material = new MyMeshPhongMaterial();
material.color.setRGB( 1, 0, 0 ); // this still works

ShaderLib рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реБрдХ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

    #include <begin_vertex>
    % vertex %
    #include <morphtarget_vertex>
    #include <skinning_vertex>
    % transformed_vertex %
    #include <project_vertex>
    % projected_vertex %

рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХреЛрдб рдпрд╣ рдмрди рдЬрд╛рдПрдЧрд╛:

this.onBeforeCompile = function ( shader ) {
  shader.vertexShader = shader.vertexShader.replace(
    '% vertex %',
    'transformed.x += sin( position.y ) / 2.0;'
  );
);

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

рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг ShaderChunks рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

//given some material
var material = new THREE.MeshNormalMaterial();

//and some shader snippet
var myShader = [
    'float theta = sin( time + position.y ) / 2.0;',
    'float c = cos( theta );',
    'float s = sin( theta );',
    'mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );',
    'vec3 transformed = vec3( position ) * m;', //and making assumptions about THREE's shader framework
    'vNormal = vNormal * m;'
].join( '\n' );

https://github.com/mrdoob/three.js/pull/10791 Material.defines рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдорд╛рди:

material.shaderIncludes = {

        begin_vertex: myShader,

    //uv_pars_vertex: [
    //  THREE.ShaderChunk['uv_pars_vertex'], //this doesn't have to be
    //  "uniform float time;",
    //].join('\n')
};

material.shaderUniforms = { time: { value: 0, type: 'f' || 'float' } }; //because this could just inject it in the right place (but needs type)

_рдпрд╣ рдХреЗрд╡рд▓ рдЦрдВрдб рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ, рдФрд░ рд╡рд░реНрджреА рд╡рд╕реНрддреБ рд╣реИред рдпрд╣рд╛рдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореИрдирд┐рдкреБрд▓реЗрд╢рди "рдореИрдВ рдЗрд╕ рдЦрдВрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рдХреЗ рдКрдкрд░ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ" рдХреА рддрд░реНрдЬ рдкрд░ рдЕрдзрд┐рдХ рд╣реИред

рдпрд╣ рдЬрдирд╕рдВрдкрд░реНрдХ:

material.onBeforeCompile = function ( shader ) {

    shader.uniforms.time = { value: 0 };

    shader.vertexShader = 'uniform float time;\n' + shader.vertexShader; //this feels hacky

    shader.vertexShader = shader.vertexShader.replace( //this is more verbose
        '#include <begin_vertex>',
        myShader
    );

};

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ onBeforeCompile() рд╕реЗ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рднреМрддрд┐рдХ рдЧреБрдг рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВред

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


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


рдпрджрд┐ uv_pars_vertex рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрди рд╣реИ:

"рдореИрдВ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛рдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реВрдВ, рдЬреИрд╕реЗ float rand( vec2) ?"

рддрдм рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ https://github.com/mrdoob/three.js/pull/11050


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

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдУрд░ рдЬрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, lightingPhase , objectTransformation , perspectiveTransformation рдЖрджрд┐ рд╣реБрдХ рд░рдЦреЗрдВред рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ guaranteedToBeAboveMainButBelowCommonsAndExtensionCalls рдбрдореА рдЪрдВрдХ рдЬреЛ рд╣рд░ рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП % vertex % рд╕рд╛рде рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реВрдБред

рдпрд╣ рдкреАрдЖрд░, рдЬреИрд╕рд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рдЯреИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕реЗ рдХрд╛рдо рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рдЬреЛ рд░реЗрдВрдбрд░рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рд╢реНрди рдкреВрдЫрддреЗ рд╣реИрдВ

рдореИрдВ рдЬрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЙрдордиреНрд╕ рдЪрдВрдХ рдореЗрдВ рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВ?

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд░реНрджреА рдХреЛ рдкреВрд░реЗ рд╢реЗрдбрд░ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЦреБрдж рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореИрдирд┐рдкреБрд▓реЗрд╢рди рдХрд░ рд╕рдХреЗрдВред

рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╢реЗрдбрд░реНрд╕ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ uv_pars_vertex рдореЗрд░реА рд╕рд╛рдордЧреНрд░реА рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЬрдЧрд╣ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдУрд╡рд░-рдЗрдВрдЬреАрдирд┐рдпрд░ рди рд╣реЛрдВред % vertex % рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣реБрдХ рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдХреЗ рдереЛрдбрд╝реА рдорджрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдХрдореЛрдмреЗрд╢ рдЖрдкрдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдХреМрди рд╕реЗ рдЪрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ .

рд╣рдо рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реИрдХрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреНрд╡рд╛рд░ рдЦреЛрд▓ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЙрдЪрд┐рдд "рд╕рд╣рд╛рдпрддрд╛" рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЪреАрдЬреЗрдВ рдЯреВрдЯ рд╕рдХрддреА рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдкреАрдЖрд░ рдореЗрдВ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдХрд╛рд░реНрдпреЛрдВ, рднрд┐рдиреНрдирддрд╛рдУрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╡рд░реНрджреА рдХреЗ рд▓рд┐рдП рдПрдХ рдбрдореА рд╣реБрдХ рдЬреЛрдбрд╝рд╛ред GLSL рддрд░реНрдХ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ, рд╕реАрдирдХрд┐рдЯ рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рд╡рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ)ред

рдЬреИрд╕реЗ рд╣реА рд╣рдо рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╢рд╛рдпрдж рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ:

#ifdef PHASE_FOO

#include <shader_foo> 
//someGlobalStruct.mvPosition = modelViewMatrix * myLogic( transformed );
//if there is glsl provided for phase "foo" document that it should operate on "transformed" 
//and that it should return "mvPosition" 
#end including <shader_foo>

#else 

  //default
  #ifdef USE_SKINNING

    vec4 mvPosition = modelViewMatrix * skinned;

  #else

    vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );

  #endif

#ifdef PHASE_BAR

#include <something_like_this>
//mvPosition = myPostDefaultTransformationLogic( mvPosition );

#endif

gl_Position = projectionMatrix * mvPosition;

#endif

рдмреЗрд╢рдХ ifdefs рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реАрдзреЗ рдЖрдЧреЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдо рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде #include <some_phase> рд╣рдореЗрд╢рд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред #ifdef s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк "vertex_transformation" рдЪрд░рдг рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реЗрдбрд░ рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирдХреНрд╢реЗ рдХреЛ рдЕрдм рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реИрдХрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреНрд╡рд╛рд░ рдЦреЛрд▓ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЙрдЪрд┐рдд "рд╕рд╣рд╛рдпрддрд╛" рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЪреАрдЬреЗрдВ рдЯреВрдЯ рд╕рдХрддреА рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рд╛рдордЧреНрд░реА рдЙрдкрд▓рдмреНрдз рд╣реИред https://github.com/mrdoob/three.js/issues/10764 рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ THREE.ShaderLib рдФрд░ рдлрд┐рд░ рдПрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд .defines рдПрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕рдВрдкрддреНрддрд┐ Material ред рджреА, рд╕рдВрдкрддреНрддрд┐ рддрдм рддрдХ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдереА рдЬрдм рддрдХ рдореИрдВрдиреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╣реАрдВ рд▓рд┐рдЦреА (рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдЗрд╕реЗ рдордВрдЬреВрд░реА рджреЗ рджреА :)), рдФрд░ рдЕрднреА рднреА

рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рд╕рд╛рдордЧреНрд░реА рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╣реИ - рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рд╕рд╛рдорд╛рди рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╢реЗрдбрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЗрдбрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ ред

рд╕реНрдорд╛рд░реНрдЯ-рдЧрдзрд╛ рдмрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ ShaderMaterial рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ WebGLRenderer рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ:

рдпрджрд┐ рдЖрдк Phong рдЬреИрд╕реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдореВрд░реНрдд рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрд╢рд┐рдпрд╛рд░, рд╕рддрд╣реА рд╣реИрдВ, рддреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рди рд░рдЦреЗрдВред рдХреНрдпреЛрдВрдХрд┐ рддреАрди рдХреЛ рдЗрд╕рдХреЗ рд╢реЗрдбрд░ рдЪрдВрдХреНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлреЛрдВрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдХреЛ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЕрдВрддрд┐рдо рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрд╕рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рддреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рд╣реЛрдЧреАред

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

рдЗрдВрд╕реНрдЯреЗрдВрд╕рд┐рдВрдЧ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдерд╛:

рдУрд╣, рдореИрдВ ANGLE_INSTANCED_ARRAYS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреАрди рдЗрд╕рдХреА рдЫрд╛рдпрд╛ рдпрд╛ рдкреАрдмреАрдЖрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдмрд╕ рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рджреЗрдВ, рдФрд░ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рджреЗрдВ"

рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЕрдВрддрддрдГ рддреАрди.js рдкрд░ рдЖ рд░рд╣реА рд╣реИрдВ :)ред рд╣рд╛рдВ рдореИрдВрдиреЗ рдПрдХ yet another material modifier PR рднреА рдмрдирд╛рдпрд╛ (https://github.com/mrdoob/three.js/pull/7581) рдпрд╣ рдЗрддрдирд╛ рдкреБрд░рд╛рдирд╛ рдерд╛ рдХрд┐ рдХреЛрдб рдЕрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ @mrdoob рдЬреИрд╕реЗ рд╣реБрдХ
рдореБрдЭреЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реБрдХ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдордЧреНрд░реА рдХреЛ "рдереЛрдбрд╝рд╛" рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЗрд╕ рдкреАрдЖрд░ рдХреА рд╕рд╛рджрдЧреА рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрд░рдЪрд┐рдд/рд╕реНрд╡рдЪреНрдЫ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реБрдХ рдХрд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдФрд░ рд╡рд░реНрджреА рдпрд╛ рдХрд╕реНрдЯрдо рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдмрд╕ рддрд╛рд░реЛрдВ рдХреА рдЬрдЧрд╣ред

@fernandojsg рдХрд┐рд╕реА рднреА рдореМрдХреЗ рдкрд░ рдЖрдк # 10791 рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлреАрдбрдмреИрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рд╕реБрдкрд░ рд▓рдЧрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдореИрдВрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реБрдХ рдХреЛ рдореБрдЦреНрдп рдХреЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рд╣реИ (рдЖрдкрдХреЗ "pre_vertex" рдЬреИрд╕рд╛ рдХреБрдЫ) рдФрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдкреНрд░рдмрдВрдзрди рд╣реИред

@fernandojsg рдореИрдВ рдЖрдкрдХреЗ рдкреАрдЖрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреАрдЖрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЕрд╡рдЪреЗрддрди?

рд╕реНрдорд╛рд░реНрдЯ-рдЧрдзрд╛ рдмрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ ShaderMaterial рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ WebGLRenderer рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реИрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рддрд░рд╣ рдирд╛рдЬреБрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

#7581 рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛... https://github.com/mrdoob/three.js/commit/e55898c27a843f69a47e602761c60d9bbe91ee35 рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣рдо % HOOKS % рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

THREE.ExtendedMaterial = function ( material, hooks ) {

    material.onBeforeCompile = function ( shader ) {
        var vertexShader = shader.vertexShader;
        var fragmentShader = parameters.fragmentShader;
        for ( var name in hooks ) {
           vertexShader = vertexShader.replace( '%' + name + '%', hooks[ name ] );
           fragmentShader = fragmentShader.replace( '%' + name + '%', hooks[ name ] );
        }
        shader.vertexShader = vertexShader;
        shader.fragmentShader = fragmentShader;
    };

    return material;

};

рддрдм рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

```рдЬреЗрдПрд╕
рд╡рд░ рд╕рд╛рдордЧреНрд░реА = рдирдпрд╛ рддреАрдиред рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рд╛рдордЧреНрд░реА (
рдирдпрд╛ рддреАрдиред рдореЗрд╢ рдмреЗрд╕рд┐рдХ рдордЯреЗрд░рд┐рдпрд▓ (),
{ рд╢реАрд░реНрд╖: 'рд░реВрдкрд╛рдВрддрд░рд┐рддред x + = рдкрд╛рдк (рд╕реНрдерд┐рддрд┐ред рд╡рд╛рдИ) / 2.0;' }
);

рддреЛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реБрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

VERTEX
TRANSFORMED_VERTEX
PROJECTED_VERTEX

NORMAL
TRANSFORMED_NORMAL

FRAGMENT_UNIFORMS
INPUT_FRAGMENT
OUTPUT_FRAGMENT

@mrdoob рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕ рд╕рд╛рд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрд╕реНрдЯреЗрдВрд╕рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ MeshBasicMaterial рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ рдмрд╛рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП :)

https://github.com/mrdoob/three.js/pull/10750

VERTEX_UNIFORMS рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░рдгреАрдп рд▓рдЧрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рднрд┐рдиреНрди рдХрд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП? PRE_VERTEX рдпрд╛ рдХреБрдЫ рдФрд░?

NORMAL_MAP рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ

vert:

PRE_VERTEX
VERTEX
TRANSFORMED_VERTEX
PROJECTED_VERTEX

NORMAL
TRANSFORMED_NORMAL

UV
fragment:

PRE_FRAGMENT
INPUT_FRAGMENT
LIGHT
NORMAL

OUTPUT_FRAGMENT

VERTEX_UNIFORMS рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░рдгреАрдп рд▓рдЧрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рднрд┐рдиреНрди рдХрд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП? PRE_VERTEX рдпрд╛ рдХреБрдЫ рдФрд░?

рд╣рдореНрдо, рд░рд╛рдп? рдРрд╕рд╛ рдХреИрд╕реЗ?

attribute vec4 aMyAttribute; рдПрдХ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ :)

float myRand( vec4 foo ) { /*logic*/ return vec4(bar,baz)} рд╡рд░реНрджреА рдирд╣реАрдВ рд╣реИ

varying vec3 vMyVarying; рднреА рд╡рд░реНрджреА рдирд╣реАрдВ рд╣реИ

рдпрд╛ рддреЛ рдмрд╣реБрд╡рдЪрди рдирд╣реАрдВ, рдпрд╛ рд╡рд░реНрджреА рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ

"рдЗрдВрдЬреЗрдХреНрд╢рди" рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ?
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп geometry.addAttribute( 'aMyAttribute', ... ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрднреА рднреА рднрд┐рдиреНрдирддрд╛ рдФрд░ рдХрд╛рд░реНрдп рдЫреЛрдбрд╝рддрд╛ рд╣реИ?

рдЕрднреА рднреА рднрд┐рдиреНрдирддрд╛ рдФрд░ рдХрд╛рд░реНрдп рдЫреЛрдбрд╝рддрд╛ рд╣реИ?

рдЕрдЪреНрдЫреА рдмрд╛рддред

рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рдЕрдм рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрджреА рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬреЗрдПрд╕ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

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

рдореБрдЭреЗ рдирд╡реАрдирддрдо рдкрд░рд┐рд╡рд░реНрддрди рдкрд╕рдВрдж рд╣реИрдВ, рдпрд╣ рдЕрднреА рднреА рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИред рдореИрдВ @pailhead рд╕реЗ рд╕рд╣рдордд https://github.com/mrdoob/three.js/pull/7581 рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ preMainVertex preMainFragment рдХреЛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ рддрд╛рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рд╕рдВрднрд╡рдд: globalVertex/Fragment рдпрд╛ рдЗрд╕рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рдирд╛рдо рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

GLOBAL_VERTEX рдФрд░ GLOBAL_FRAGMENT рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ

рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рджреВрд╕рд░реЗ рдкреАрдЖрд░ ЁЯШЖ рдореЗрдВ рдирд╛рдо рджрд┐рдпрд╛

@pailhead рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рд░рд╣рд╕реНрдп рдЬрд╛рдирддреЗ рд╣реИрдВ: рдмрд╕ рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓реЗрдВ, рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд╣реАрдВ рдЫреЛрдбрд╝ рджреЗрдВ, рдлрд┐рд░ @mrdoob рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдЙрд╕рдХреЗ рдкреАрдЖрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕рдЯреАрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреАрдЖрд░ рдкрд░ рдХрд┐рдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╡рд╣ рд╕реЛрдЪ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдЙрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рд╡рд╣ рдЗрд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдорд░реНрдЬ рдХрд░ рджреЗрдЧрд╛ ... рд▓рд╛рдн!

image

рдЕрдм рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдореБрдЭреЗ рд╡рд╣ рдирд╛рдо рднреА рдкрд╕рдВрдж рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдо рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдиреЗ рдкреАрдЖрд░ рд╕реЗ рдЗрд╕ рдирдП рдХреЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛;)

рдХреЛрдб рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рдареАрдХ рд╣реИ, рд╕рдордпрд░реЗрдЦрд╛ рдереЛрдбрд╝реЗ рдмрдВрдж рд╣реИред #7581 рд▓рдЧрднрдЧ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред https://github.com/mrdoob/three.js/issues/10789 рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рд░рдбрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯрдХреНрдХрд░ рдорд╛рд░ рджреА рд╣реЛрдЧреА рдпрд╛ рдЗрд╕реЗ рдлреЛрд░реНрдХ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрдм рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪреЗрд░реА рдЕрдкрдиреЗ рддреАрди рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рд▓реЛрдЧ рдЧреИрд░-рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдХреЛрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдХрд╣рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, "рдЕрд░реЗ, рдПрдХ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рд╣реИ рдЬреЛ рдлреВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ"ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреАрдЖрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рддреАрди рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓реЗ рдирд╣реАрдВ рд╣реИрдВред

рдлрд╛рдпрджрд╛!

рдХреНрдпрд╛ рд▓рд╛рдн? рдореИрдВ

рдХреЛрдб рдореЗрдВ рдЖрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рдареАрдХ рд╣реИ, рд╕рдордпрд░реЗрдЦрд╛ рдереЛрдбрд╝реЗ рдмрдВрдж рд╣реИред #7581 рд▓рдЧрднрдЧ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред https://github.com/mrdoob/three.js/issues/10789 рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рд░рдбрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯрдХреНрдХрд░ рдорд╛рд░ рджреА рд╣реЛрдЧреА рдпрд╛ рдЗрд╕реЗ рдлреЛрд░реНрдХ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛? рдЖрдкрдиреЗ рдирдпрд╛ рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдЦреБрд▓реЗ рдкреАрдЖрд░ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА? #рдЯреНрд░реЛрд▓реЛрд▓реЛрд▓

рд╕рдЪ :)

рдареАрдХ рд╣реИ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рдпрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: рдбреА

рдХреНрдпрд╛ рдпрд╣ рд╢реЗрдбрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рд╣реЛрдЧрд╛:

#include <shadowmap_pars_vertex>

void main() {

    #include <begin_vertex>
    #include <project_vertex>
    #include <worldpos_vertex>
    #include <shadowmap_vertex>

}

рдРрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ:

#include <shadowmap_pars_vertex>

void main() {

    % begin_vertex %
    % project_vertex %
    % worldpos_vertex %
    % shadowmap_vertex %

}

рдЙрдореНрдо рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрди рд╕рднреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдпрд╛ рдХреБрдЫ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдб рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ:

#include <shadowmap_pars_vertex>

%GLOBAL_VERTEX% 
void main() {
       %PRE_VERTEX% 
    #include <begin_vertex>
...
}

рдореЗрд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдХреА рдХреЛ рдЕрдЫреВрддрд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рддреЛ % hook % рд╕рд┐рд░реНрдл рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ <begin_vertex> рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛, рдпрд╛рдиреАред рдПрдХ begin_vertex рд╣реБрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рдореЗрд░реЗ рдкреАрдЖрд░ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЖрдорддреМрд░ рдкрд░ рдПрдлрдПрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рд░рдВрдЧ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рдерд╛ рдпрд╛ рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП @mrdoob рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрдиред
рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рдЕрдЧрд░ рд╣рдо рд╢рд╛рдорд┐рд▓ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рд╣реБрдХ рдХреЛ рдмрд╛рдВрдзрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рд╕реНрд╡рдпрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕реЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреАрдмреАрдПрди рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ 3ds рдЕрдзрд┐рдХрддрдо рдпрд╛ рдорд╛рдпрд╛ рдпрд╛ рдХрд╣реАрдВ рднреА рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MeshPhongMaterial рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд╡реЗ рджреЛ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рднреА рд╣реИрдВред

рддреЛ % hook % рд╕рд┐рд░реНрдл рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ <begin_vertex> рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛, рдпрд╛рдиреАред рдПрдХ begin_vertex рд╣реБрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рдЖрдк рджреЛрдиреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рджреЗрддрд╛ рд╣реИред %HOOK% рд╡рд╛рд▓реЗ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ #резрезрелремреи рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдмрджрд▓реА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрдбрд░ рд╡рд┐рдЦрдВрдбреВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

рдЙрджрд╛рд╣рд░рдг:

const material = new THREE.MeshPhongMaterial({
  color: 0xffffff,
  map: texture,

  parts: {
    frag: {
      map_pars_fragment: `
        uniform sampler2D map;
        uniform sampler2D map2;
     `,

      map_fragment: `
        vec4 texelColor = texture2D( map, vUv );
        vec4 texelColor2 = texture2D( map2, vUv );

    texelColor = mapTexelToLinear( 
          mix( texelColor, texelColor2, progress)
        );

    diffuseColor *= texelColor;
      `
    }
  }
});

material.uniforms.progress = {value: 1};
material.uniforms.map2 = {value: texture2};

1 рд╕рд╛рдордЧреНрд░реА рдкрд░ рдХрдИ рдмрдирд╛рд╡рдЯреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХрд╛ рдХреЛрдб рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ рд╕рд╛рд╢рд╛240100

https://github.com/mrdoob/three.js/pull/10791 рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп parts рдХреЛ shaderChunks рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ рддрд░реНрдХред
:roll_eyes:

рдЖрдкрдХреЛ frag{} рд╢рдмреНрджрдХреЛрд╢ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рднрд╛рдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдЙрди рд╕рднреА рдХреЗ рдкрд╛рд╕ _fragment рдФрд░ _vertex ред

рдпрд╣ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрджрд▓рдирд╛ рд╣реИред

@pailhead рд╣рд╛рдВ, рдЖрдЗрдП frag: {} рдбреНрд░реЙрдк рдХрд░реЗрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдордЧреНрд░реА рд╢реЗрдбрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рдж рдореМрдЬреВрджрд╛ рднрд╛рдЧреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВред рдЬреИрд╕реЗ color рдХрд░рддрд╛ рд╣реИ

рдпрд╣ рдЕрднреА рдХрд╣рд╛рдБ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг .replace() рдФрд░ рдореБрдЭреЗ рдХреЛрдИ рд╣реБрдХ/рдмрджрд▓реА рдЬрд╛рдиреЗ рдпреЛрдЧреНрдп рднрд╛рдЧ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ? @mrdoob

рдЗрд╕ рдкрд░ рдЕрднреА рддрдХ рд╡рд╛рдкрд╕реА рдирд╣реАрдВ рд╣реЛ рдкрд╛рдИ рд╣реИред

рдХреНрдпрд╛ рдЖрдк % hook % рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рдХреНрдпрд╛ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

THREE.ExtendedMaterial = function ( material, hooks ) {

    material.onBeforeCompile = function ( shader ) {
        var vertexShader = shader.vertexShader;
        var fragmentShader = parameters.fragmentShader;
        for ( var name in hooks ) {
           vertexShader = vertexShader.replace( '%' + name + '%', hooks[ name ] );
           fragmentShader = fragmentShader.replace( '%' + name + '%', hooks[ name ] );
        }
        shader.vertexShader = vertexShader;
        shader.fragmentShader = fragmentShader;
    };

    return material;

};

рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдЪреБрдирдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВ рд╢рд╛рдпрдж hooks рдХреЛ chunks рдФрд░ рдЕрднреА рдХреЗ рд▓рд┐рдП global_vert рдФрд░ global_frag рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╢рд╛рдорд┐рд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░реВрдВ? рдЕрдм рдХреМрди рд╕рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрддрд╛ рд╣реИ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рддреАрди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ рдпрд╣ рдареВрдВрда рд╣реИрдВ THREE.ExtendedMaterial рдХреЗ рд▓рд┐рдП % hook % рднрд╡рд┐рд╖реНрдп рдореЗрдВ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рдереНрд░реА.рдмреАрдПрдПрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

  var material = new BAS.PhongAnimationMaterial({
    flatShading: true,
    vertexColors: THREE.VertexColors,
    side: THREE.DoubleSide,
    uniforms: {
      uTime: {type: 'f', value: 0}
    },
    vertexFunctions: [
      // cubic_bezier defines the cubicBezier function used in the vertexPosition chunk
      BAS.ShaderChunk['cubic_bezier'],
      BAS.ShaderChunk['quaternion_rotation']
    ],
    vertexParameters: [
      'uniform float uTime;',
      'attribute vec2 aDelayDuration;',
      'attribute vec3 aStartPosition;',
      'attribute vec3 aEndPosition;',
      'attribute vec3 aControl0;',
      'attribute vec3 aControl1;',
      'attribute vec4 aAxisAngle;'
    ],
    vertexInit: [
      'float tProgress = mod((uTime + aDelayDuration.x), aDelayDuration.y) / aDelayDuration.y;',
      'vec4 tQuat = quatFromAxisAngle(aAxisAngle.xyz, aAxisAngle.w * tProgress);'
    ],
    vertexPosition: [
      'transformed = rotateVector(tQuat, transformed);',
      'transformed += cubicBezier(aStartPosition, aControl0, aControl1, aEndPosition, tProgress);'
    ]
  });

рдореБрдЭреЗ рдпрд╣ рддрдереНрдп рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд░рд▓ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: vertexInit рдФрд░ fragmentInit рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрдВрдЧреЗред рд╡рд░реНрджреА рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП vertexParameters рдФрд░ fragmentParameters рд╢реЗрдбрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИрдВред vertexFunctions рдФрд░ fragmentFunctions рдореБрдЦреНрдп() рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рд╣реИрдВред рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕рд╛рдорд╛рдиреНрдп, рд╕реНрдерд┐рддрд┐ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП...

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрдерд┐рддрд┐ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ transformed рдмрджрд▓рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп ( objectNormal ) рдпрд╛ рд░рдВрдЧреЛрдВ ( diffuseColor ) рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдмрд╛рддред

рдлреЛрдВрдЧ рд╕рд╛рдордЧреНрд░реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ, рдХреЗрд╡рд▓ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдЬреЛрдбрд╝рддреА рд╣реИ: https://github.com/zadvorsky/three.bas/blob/master/src/materials/PhongAnimationMaterial.js

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рдореИрдВ рдХреЙрдирд╡реЛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореИрдВ рд╣рд╛рд░ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдлреНрд░рдВрдЯ рдПрдВрдб рд╕реЗ рдЖрдпрд╛ рд╣реВрдВ рди рдХрд┐ рдЧреЗрдо рджреЗрд╡ рд╕реЗред

рдореИрдВ рдПрдХ рдПрдордЯреАрдПрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:

material.onBeforeCompile.toString() рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдореЗрд░реА рдПрдордЯреАрдПрд▓ рдлрд╝рд╛рдЗрд▓ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ .psd рдлрд╝рд╛рдЗрд▓ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣реА рдереА рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рдкреАрдПрдирдЬреА рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ (рд╕рд╛рдорд╛рдиреНрдп) рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреАрдПрд╕рдбреА рд▓реЛрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рдкреАрдПрд╕рдбреА рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред

# Blender MTL File: 'goblin.blend'
# Material Count: 1

newmtl Material
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.001617 0.005682 0.002517
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
map_Kd Normal.png

рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

THREE.WebGLRenderer 87
bundle.js:54570 OBJLoader: 29.447998046875ms
bundle.js:28429 Uncaught TypeError: Cannot read property 'toString' of undefined
    at WebGLPrograms.getProgramCode (bundle.js:28429)
    at initMaterial (bundle.js:32350)
    at setProgram (bundle.js:32542)
    at WebGLRenderer.renderBufferDirect (bundle.js:31605)
    at renderObject (bundle.js:32335)
    at renderObjects (bundle.js:32308)
    at WebGLRenderer.render (bundle.js:32072)
    at bundle.js:9658
    at bundle.js:53976
    at XMLHttpRequest.<anonymous> (bundle.js:40153)

рдФрд░ рдореИрдВ рдЬрд┐рд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣реИ:

OBJLoader(THREE);

const modelLoader = new THREE.OBJLoader();
const textureLoader = new MTLLoader();
textureLoader.setTexturePath( 'models/' );
    textureLoader.load('models/goblin.mtl', function( materials ) {

            materials.preload();

            modelLoader.setMaterials( materials );
            modelLoader.load('models/goblin.obj', function ( obj ) {
                 scene.add( obj );
                renderer.render( scene, camera );


            });

        }); 


    renderer.render( scene, camera );

}

рдХреНрдпрд╛ рдпрд╣ рдореЙрдбрд▓ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рддреАрди рдореЗрдВ? рдПрдордЯреАрдПрд▓ рд▓реЛрдбрд░ рдореЗрдВ? рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдХрд┐рд╕реА рднреА рд╕рд╣рд╛рдпрддрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рд╣рдореЗрдВ material.shader = shader рдореЗрдВ material.onBeforeCompile(shader=>...) рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рднрджреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рджреВрд╕рд░реЗ рд╕реБрдЭрд╛рд╡ рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :)

@jjalonso

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ:

https://stackoverflow.com/questions/46787166/react-and-three-js-mtlloader-material-onbeforecompile-is-undefined

рдпрд╣ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ Material рдореЗрдВ рдпрд╣ func рдирд╣реАрдВ рд╣реИ?
https://github.com/mrdoob/three.js/blob/35a26f178c523514673d992da1aece23c1cfca6e/src/renderers/webgl/WebGLPrograms.js#L244

@mrdoob

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╢реЗрдбреНрд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдореИрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдПрдХ рдореЗрдВ dithering_fragment рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдирд╣реАрдВред рдЬрдм рдореИрдВ рджреЛрдиреЛрдВ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ dithering_fragment рдЦрдВрдб рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдкрд╣реЗрд▓реА рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд░рд╣рд╛ рд╣реВрдБ
https://codepen.io/anon/pen/KQPBjd

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде

const dithering_fragment = 
`
gl_FragColor.xyz *= foobar
`
// in onBeforeCompile
console.log(shader.fragmentShader)



md5-0f1a3ac67268b230968df20abdbd03d1



/**
#if defined( DITHERING )
  gl_FragColor.rgb = dithering( gl_FragColor.rgb );
#endif

gl_FragColor.xyz *= foobar

}
*/

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЙрд╕ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдиреНрдп рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реИ:

https://github.com/mrdoob/three.js/blob/35a26f178c523514673d992da1aece23c1cfca6e/src/renderers/webgl/WebGLPrograms.js#L244

рдореЗрд░реЗ рдкрд╛рд╕ рджреЛрдиреЛрдВ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреБрдЫ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ, рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрд░реА рджреЛрдиреЛрдВ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╣реИрд╢ рдорд┐рд▓рддрд╛ рд╣реИ?

array.push( material.onBeforeCompile( obtainShaderSomehow ) )

https://github.com/mrdoob/three.js/pull/10791 рдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛:

https://github.com/pailhead/three.js/blob/879d52349bd5ef72c64fc962d8ca26bacaf489bf/src/renderers/webgl/WebGLPrograms.js#L242

рдпрджрд┐ рдореИрдВ global_vertex рдФрд░ global_fragment рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕/рд╣реБрдХ рдХреЛ рд╣рдЯрд╛ рджреВрдВ рддреЛ рдХреНрдпрд╛ рдЖрдк рдЕрдиреНрдп рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ? рдЙрдирдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреВрддрд╛ рд╣реИ, рдЙрдирдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдХрдо рдХреЛрдб рд╣реИред рддреАрди рд▓рд╛рдЗрдиреЗрдВ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣реИрд╢ :)

рдЗрд╕ рдлрд┐рдбреЗрд▓ рдореЗрдВ #41 рдХрдореЗрдВрдЯ рдХрд░реЗрдВ https://codepen.io/anon/pen/KQPBjd
рдФрд░ рджреГрд╢реНрдп рдореЗрдВ рдЕрдиреНрдп рдЬрд╛рд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓ рдЬрд╛рдПрдЧреАред

рдХреНрдпрд╛ рдЗрд╕реЗ рд╣рд╛рд▓ рдХреА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рдм рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИ?

@mrdoob рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .onBeforeCompile() рд╕рд╛рде рд╣реИрдХ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ (рдпрд╛ рдЕрд╕рдВрднрд╡) рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ ShaderMaterial рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡реЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ (рд░реЗрдВрдбрд░, рдХреЙрдкреА, рдХреНрд▓реЛрди, рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝, рдФрд░ рдЗрд╕реА рддрд░рд╣) рд╕рдВрд╢реЛрдзрд┐рдд рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

_рдХреГрдкрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ, рд░рдЪрдирд╛рддреНрдордХ, рдЧреИрд░-рдЯрдХрд░рд╛рд╡ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝реЗрдВ_ :)

@takahirox рдпрд╣ рджрд╛рд╡рд╛ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд░рд╣рддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реИрдХ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ (рдпрд╛ рдЕрд╕рдВрднрд╡) рд╣реИ

рдЬрдм рдЖрдк onBeforeCompile рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдХреЛ "рд╣реИрдХ" рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреЗрд╡рд▓ рд╡рд░реНрджреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИред рдЗрд╕рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реА рд╣реИред рдпрджрд┐ рдЖрдк material.color рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк material.userData.myColor рдХреНрд░рдордмрджреНрдз рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?

рдореИрдВ рд▓рдбрд╝рд╛рдИ, рдкрд╛рда рдХреА рджреАрд╡рд╛рд░реЗрдВ рдпрд╛ рдХреБрдЫ рднреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рд░рд▓рддрдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрднрд╡ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рдпрд╛ рдХрдард┐рди рдХреНрдпреЛрдВ рд╣реИ? рдореИрдВ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рд╣реВрдВ рддреЛ рдореИрдВ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ :)

рд▓реЗрдЦреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдирдореВрдиреЗ рд╕реЗ, рдЗрд╕ рдкреНрд░рдпреЛрдЧ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд▓реЛрдЧ ShaderMaterial рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдпрд╣ рдЕрднреА рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛? рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рдореМрдЬреВрдж рд╣реИ рдЬреЛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдард┐рди рдпрд╛ рдЕрд╕рдВрднрд╡ рд╣реИ? рдкрд╕рдВрдж:

runSerializationTest( someMaterialWithOnBeforeCompile ).expect( something )

рдЪреВрдВрдХрд┐ onBeforeCompile рд╡рд┐рдзрд┐ рдореЗрдВ рдмрд╣реБрдд рд╣реА рдордирдорд╛рдирд╛ рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд┐ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ XMLHttpRequest рдмрдирд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рд╕рдХрддреА рд╣реИред рдореИрдВ

рд╣рд╛рд▓рд╛рдВрдХрд┐ ... рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╢реЗрдбрд░реНрд╕ рдХреЛ рдкреИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрд╕рд╛рди рдПрдкреАрдЖрдИ (рдЬреИрд╕реЗ fn.toString() ) рд╣реИрдХреА рд╣реИрдВ, рдФрд░ рдордЬрдмреВрдд рдПрдкреАрдЖрдИ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред

рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣реА рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:

rN рд▓реЗрдВ MeshPhongMaterial рдерд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ MeshStandardMaterial ред

рдЖрдк MeshPhongMaterial рдпрд╛рдиреА рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдПрдХ JSON рд▓рд┐рдЦреЗрдВ:

{
  color: 'red',
  specular: 'very',
  glossy: 'not much'
}

rN+1 рд▓реЗрдВ

рдЖрдк рдЕрднреА рднреА рджреЛрдиреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

//phong
{
  color: 'red',
  specular: 'very',
  glossy: 'not much'
}

//standard
{
  color:'red',
  shininess: 'shiny',
  metalness: 'not much'
}

рдЖрдкрдиреЗ GLSL рдХреЛ MeshStandardMaterial рд╕реЗ рдХрд╣реАрдВ рднреА рдХреНрд░рдорд╛рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЙрд╕реА рддрд░рд╣, рдХрд┐рд╕реА рднреА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ред

//extended PhongMaterial
{
   color: 'red',
   specular: 'very',
   glossy: 'not much',
   hamburger: 'medium rare'
}

рдЕрдХреНрд░рдорд╛рдВрдХрди:

if ( data.userData.hamburger && HamburgerPhongMaterial )
   mat = new HamburgerPhongMaterial( data ) 
else{ 
   console.warn(`I'm terribly sorry, but you don't have the HamburgerPhongMaterial extension, using default fallback`)
   mat = new PhongMaterial( data ) 
}

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ?


onBeforeCompile рдХреЗ рд░реВрдк рдореЗрдВ ... рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВред

рдХреНрдпреЛрдВ, рдЖрдк рдЗрд╕реЗ рдХреНрдпреЛрдВ рдорд╛рдиреЗрдВрдЧреЗ :) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рднреНрд░рдо рдХреА рдЬрдбрд╝ рд╣реИ, рдЗрд╕ рд╣реБрдХ рдХреЛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рднреМрддрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛, рд╡рд┐рд╡рд░рдг, рдХреБрдЫ рднреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдЗрдВрдЬрди, рдкреНрд▓рдЧрдЗрдиреНрд╕, рдРрдкреНрд╕ рдЖрджрд┐ рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ, рдбреЗрдЯрд╛ рд╕реЗ рдирд╣реАрдВред

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдХреНрд░рдорд╛рдВрдХрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рд╣реИрдореНрдмрд░реНрдЧрд░рдлреЛрдВрдЧрдордЯреЗрд░рд┐рдпрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реЛ? рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдЖрдк #14099 рдХреЗ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкрдирд╛рддреЗ рд╣реИрдВ рдФрд░ JSON рдФрд░ fromJSON рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ API рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдпрд╣рд╛рдВ @takahirox рдХреЗ рдкреНрд░рд╢реНрди рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рд╣реЛ?

....onBeforeCompile() рдХреЗ рд╕рд╛рде рд╣реИрдХ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдХрдард┐рди (рдпрд╛ рдЕрд╕рдВрднрд╡) рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ ShaderMaterial рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡реЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ (рд░реЗрдВрдбрд░, рдХреЙрдкреА, рдХреНрд▓реЛрди, рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝, рдФрд░ рдЗрд╕реА рддрд░рд╣) рд╕рдВрд╢реЛрдзрд┐рдд рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:

  • рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╕рд╛рджреЗ MeshStandardMaterial рдкрд░ toJSON() рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ GLSL рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ onBeforeCompile рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, GLSL рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
  • рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде MeshStandardMaterial рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдЬреЛ GLSL рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХрд╕реНрдЯрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрди рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдареАрдХ рд╣реИред
  • рдХрдИ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк (ShaderMaterial, NodeMaterial, glTF's KHR_techniques_webgl , ...) рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрд╕реНрдЯрдо рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рдЬрд┐рд╕ рдорд╛рдорд▓реЗ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдпрд╣ рд▓рдЧрднрдЧ #резрекрежрепреп рд╣реИ, рддреЛ рдореИрдВ (рдЕрднреА рднреА) рдЗрд╕реЗ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

рд╣рдореНрдо, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рджреЛ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрджреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ gl_FragColor.xyz /= gl_FragColor.a; рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрд╣рд╛рдБ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ ( рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде? ) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рд░реЗрдВрдбрд░рд░ рдпрд╛ рдХреБрдЫ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧрд╛, рднреМрддрд┐рдХ рдбреЗрдЯрд╛ рдирд╣реАрдВред

materials = loadSerializedMaterials()

effect = new Effect()

effect.load( 'alphaDivide').then(()=>materials.forEach(mat.onBeforeCompile = effect.getOnBeforeCompile('alphaDivide')))

рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд╣ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдорди рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕реЗ рдерд╛ред рд╡рд┐рднрд┐рдиреНрди рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде, рдПрдХ рд╕рдВрдХреЗрдд рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ userData.extension === 'hamburger' ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЦрд░рд╛рдм рд▓рд┐рдЦрд╛ рд╣реИред рдореИрдВ рдЬреЛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рд╡рд╣ рд╣реИ

  • .onBeforeCompile() рд╕рд╛рде рд╣реИрдХ рдХреА рдЧрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдХреНрд▓реЛрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕реА рдПрдкреАрдЖрдИ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реЛрддреА рд╣реИ'ред рдЗрд╕реЗ рдЧреИрд░-рд╣реИрдХ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдХреНрд╖ рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХреЗ рддреАрди.рдЬреЗрдПрд╕ рдХреЛрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣реИрдХ рдХреА рдЧрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ ShaderMaterial ред

рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ .onBeforeCompile() рдХреА рдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИред рдореИрдВ рд╕реАрдорд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдиреЛрдЯ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЕрдЧрд░ рдореИрдВ рддреАрди.рдЬреЗрдПрд╕ рдФрд░ рдкреВрд░реА рдкреНрд░рддрд┐рдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдХреЛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмрд┐рдВрджреБ рджреЗрдЦрддрд╛ рд╣реВрдВред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЗрд╕рдореЗрдВ .clone() рддреЛ рдЖрдк рдХреНрд▓реЛрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рд░рдЦрддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рджреЛрдиреЛрдВ рд╕рдорд╛рдзрд╛рди рд╣реИ (рдЗрд╕реЗ рдХреНрд▓реЛрди рдирд╣реАрдВ рдХрд░реЗрдВ рдХреНрд▓реЛрди рдХрд░реЗрдВ) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡реИрдз рддрд░реНрдХ рд╣реИред рдЖрдк рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рдХреНрд▓реЛрди рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ рдРрд╕реА рднреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред

рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рд╕реЗ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдз рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ (рдЬреИрд╕реЗ рд▓рдХреНрд╖реНрдп рдХреЗ рдмреАрдЪ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рднреА ownThing || outsideThing рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ userData рдХреИрд╢ рдХрд░реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯред userData.hamburger: 'rare' рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ userData.effectOn: true". The рдЦреБрдж рдХрд╛ рдЗрдирдкреБрдЯ рдХрд░рддрд╛ рд╣реИ | рдЦреБрдж рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ | рдЦреБрдж рдЬреЛ рдХреБрдЫ рднреА' рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рднреА рдХрд░рддрд╛ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ onBeforeCompile рд╡рд┐рдзрд┐ рдореЗрдВ рдмрд╣реБрдд рдордирдорд╛рдирд╛ рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред

рдХрд╛рдлреА рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЛрдЧреЛрдВ рдиреЗ onBeforeCompile рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрдм рддрдХ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣рд╛рдВ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдордирдорд╛рдирд╛ рдХреЛрдб рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ shader рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореНрдпреВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореНрдпреВрдЯреЗрд╢рди рдЬреЛ ShaderMaterial рд╕рд╛рде рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рднреА рдПрдХ рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ред рдХреБрдЫ gl рд╕рд╛рдорд╛рди рдХреЛ рд╕реНрд╡рдпрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╢рд╛рдпрдж рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИред

рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ pre three parse рдХрджрдо рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп uniforms:{} рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рд╢реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ Material ( defines:{} Material рдкрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред defines:{} рджреВрд╕рд░реА рдУрд░ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреЛрдиреЛрдВ ShaderMaterial рдореЗрдВ рднрд╛рдИ-рдмрд╣рди рд╣реИрдВ)ред

рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдЬреЛ рднреА рдордирдорд╛рдирд╛ рдХреЛрдб рд╣реИ, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдпрд╣ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ shader:{} рдФрд░ рдлрд┐рд░ рд░реЗрдВрдбрд░рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЛ рдореИрдВ рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВ:

  1. рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ ownThing рдЬреЛрдбрд╝реЗрдВред THREE.WebGLRenderTarget рдореЗрдВ .ownStencilDepthBuffer ред рдпрд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ ownGLSL:{} ownInput | ownUniforms рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛ред рдЖрдк shader:{} рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреЗ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ:

рдЗрд╕ рддрд░рд╣ рд╕реЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЗрдирдкреБрдЯ рдЬреЛ WebGLRenderer (рд╕реБрдкрд░ рдкреНрд░рд╛рдЗрд╡реЗрдЯ) рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ:

const shader = {
  uniforms: buildFromMaterial(mat),
  vs: getVSTemplate(key),
  fs: getFSTemplate(key)
}

рдпрд╣ рдкрд░рдорд╛рдгреБ:

shader = onBeforeCompile( shader )

shader.vs //invalid GLSL
shader.uniforms //you got some extra ones that onBeforeCompile may have mutated, maybe removed some others

shader = ___parse(shader) //private step

shader.vs //valid glsl, (not a template)

compile(shader)

рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

function parseShader(shader){
   return {
     uniforms: shader.uniforms,
     vs: parseChunks(shader.vs)
     fs: parseChunks(shader.fs)
   }
}
//FIX FOR HASHING BUG
function parseChunk( material, chunkName ){
  return material.ownChunks[chunkName] || THREE.ShaderChunks[chunkName]
}

//do whatever you want with the templates, maybe remove an `#include <>`
shader = onBeforeParse(shader)

shader.vs //template || valid glsl

shader = parseShader(shader) //sample OWN || PRIVATE 

shader.vs //valid GLSL 

//if you want to apply a regex on the entire valid glsl, or compile node material or something else
shader = onBeforeCompile( shader )

compile(shader)
  1. WebGLRenderer ShaderMaterial рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рди рдЬрд╛рдиреЗрдВред

рдЖрдк рдЬрд╣рд╛рдВ рднреА рд╣реЛрдВрдЧреЗ

const mat = new THREE.MeshBasicMaterial()
const sm = new THREE.ShaderMaterial()

рдкрд╛рд╕ рд╣реЛрдирд╛

const mat = nodeMaterial.compile() //returns ShaderMaterial, with a friendly interface (same as StandardMaterial for example)

const mat = chunkMaterial.compile()

рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЯреАрдПрд▓: рдбреЙ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рд╕рдордп рд╡рд┐рд╢реЗрд╖ рдмрд┐рдВрджреБ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм "рд╕рдВрдХрд▓рди" (рдкрд╛рд░реНрд╕) рд╣реЛрддрд╛ рд╣реИ ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рд╣реЛрддрд╛ рд╣реИ рдЙрд╕реЗ рдПрдХ рдореБрдЯреНрдареА рднрд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рднреА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ in: shaderString, out: shaderString ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдмрд┐рдВрджреБ рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдЬрд╛рдВрдЪ рдФрд░ рд╕рдордЭрдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЪреАрдЬреЛрдВ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИред

@mrdoob рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .onBeforeCompile() рд╕рд╛рде рд╣реИрдХ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ (рдпрд╛ рдЕрд╕рдВрднрд╡) рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ ShaderMaterial рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡реЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ (рд░реЗрдВрдбрд░, рдХреЙрдкреА, рдХреНрд▓реЛрди, рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝, рдФрд░ рдЗрд╕реА рддрд░рд╣) рд╕рдВрд╢реЛрдзрд┐рдд рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА (рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд┐ onBeforeCompile() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ...

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА onBeforeCompile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╢реЗрдбрд░ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╢реЗрдбрд░реНрд╕ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП onBeforeCompile рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, WebGLProgram onBeforeCompile.toString() рдХреЛ рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореЗрд░рд╛ рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд╣реИ (рдпрд╣ рдЪрд░ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдЦрдВрдб рд╢реЗрдбрд░реНрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ) onBeforeCompile.toString() рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реЗрдбрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдореЗрд░реЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реЗрдб рдПрдХ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╢ рдХрд┐рдП рдЧрдП рдереЗред рдПрдХ eval рдХреЙрд▓ рдФрд░ рдПрдХ uuid рдФрд░ рдЕрдм рдореЗрд░реЗ рдХрд╛рд░реНрдп рд╕рднреА рдЕрд▓рдЧ рджрд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд▓рдЧ рдЧрдпрд╛ред

@donaldr https://github.com/mrdoob/three.js/issues/13192 рджреЗрдЦреЗрдВ

рдХреНрдпрд╛ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЧрдВрджрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рд╢рд░реАрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ const fdscxnmdrek435rkjl рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ eval рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдореЗрд░реЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реЗрдб рдПрдХ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╢ рдХрд┐рдП рдЧрдП рдереЗред рдПрдХ eval рдХреЙрд▓ рдФрд░ рдПрдХ uuid рдФрд░ рдЕрдм рдореЗрд░реЗ рдХрд╛рд░реНрдп рд╕рднреА рдЕрд▓рдЧ рджрд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд▓рдЧ рдЧрдпрд╛ред

рдпрд╣ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред ЁЯШЮ рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрдПрдВрдЧреЗ, рдХреГрдкрдпрд╛ рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХрд╛ рднреА рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВред

рдХреГрдкрдпрд╛ рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХрд╛ рднреА рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВред

рдХреНрдпрд╛ рдЖрдк рдореМрдЬреВрджрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ? #13192 рдРрд╕рд╛ рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ :crying_cat_face: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдХ рдХрд╛рд░реНрдп рдХреЛ рд╡рд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рдерд╛ред

рд╣рдореНрдо...

const _obc = shader => {...}
const obc = `
function (shader){
  const _${ hash() }
  ${ _obc.toString() }
  _obc(shader)
}
`
material.onBeforeCompile = eval(obc)

^рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рдореИрдВрдиреЗ рдХрднреА рднреА eval рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рд╕рд╛рдордЧреНрд░реА. customProgramCacheKey onBeforeCompile() рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╢реЗрдбрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рд╢рд░реНрдд рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдирдП рдереНрд░реЗрдбреНрд╕ (рдЬреИрд╕реЗ #13446) рдореЗрдВ onBeforeCompile() рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреНрдп рдореМрдЬреВрджрд╛ рдореБрджреНрджреЛрдВ рдпрд╛ рд╕рдВрд╡рд░реНрджреНрдзрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред

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

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

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

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

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

jack-jun picture jack-jun  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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