
рдСрдирд▓рд╛рдЗрди рдереНрд░реА.рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдореВрд▓ рдореЗрдВ рдХрд╛рдлреА рдХреБрдЫ рдкрд░рд┐рдЪрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХрдИ рдЙрдиреНрдирдд рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХреА рдХрдореА рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╖рдп рддреАрди рдЖрдпрд╛рдореА рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╢реЗрдбреНрд╕ рдФрд░ рджреГрд╢реНрдпреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИред рдХрдИ рдиреМрд╕рд┐рдЦрд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдирдЬрд░ рдореЗрдВ, рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреБрдирд┐рдпрд╛ рд╕реЗ рдЕрд╕рдВрдЧрдд рдЪреАрдЬреЗрдВ рд╣реИрдВред рдЖрдЬ, рдПрдХ "рдкреНрд▓рд╛рдЬреНрдорд╛ рдХреНрд╖реЗрддреНрд░" рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ ShaderMaterial рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЧрд╛рдпрд╛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рддреЗрдЬрд╝ рд╣реИред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдереНрд░реА.рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ рдФрд░ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рд╢реЗрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ:
рд▓реЗрдХрд┐рди рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ...
ShaderMaterial - рдпрд╣ рдХреНрдпрд╛ рд╣реИ?
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдкрд╛рдЯ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рддреАрди-рдЖрдпрд╛рдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдмрдирд╛рд╡рдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрд╕реНрд╡реАрд░ рдереАред рдЬрдм рд╣рдордиреЗ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓реЗрдЦрди рдХреА рдЬрд╛рдВрдЪ рдХреА, рддреЛ рд╡рд╣рд╛рдВ рднреА рд╕рдм рдХреБрдЫ рд╕рдкрд╛рдЯ рдерд╛ред рддреЛ: рдпрджрд┐ рд╣рдо рдПрдХ рдлреНрд▓реИрдЯ рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ shader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ?
рдпрд╣ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ shader рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред рддреАрди-рдЖрдпрд╛рдореА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рдмрдЬрд╛рдп рд╢реЗрдб рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
const shaderMaterial = new THREE.ShaderMaterial({ uniforms: {
рд╕рд╛рдордЧреНрд░реА рдХреА рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреВрдЫреЗрдВрдЧреЗ рдХрд┐ рд╢реАрд░реНрд╖ рдХрддрд░рди рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рд╡рд╣ рдлрд┐рд░ рд╕реЗ рд╕рдордиреНрд╡рдп рдХрд╛ рдПрдХ рднреЛрдЬ рдХрд░реЗрдВрдЧреЗ? рд╣рд╛рдВ, рд╣рдо рдЗрд╕ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рддреАрди рдЖрдпрд╛рдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдлрд╕реЗрдЯ рдпрд╛ рдЕрдиреНрдп рдЬреЛрдбрд╝рддреЛрдбрд╝ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрдм рд╡рд┐рдорд╛рди рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ рдФрд░ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рдЧреЛрд▓рд╛ рдмрдирд╛рдПрдВред

рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо ShaderMaterial рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
const geometry = new THREE.SphereBufferGeometry(30, 64, 64); const shaderMaterial = new THREE.ShaderMaterial({ uniforms: {
рд╢реАрд░реНрд╖ shader рддрдЯрд╕реНрде рд╣реЛ рдЬрд╛рдПрдЧрд╛:
void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддреАрди.js рдЕрдкрдиреЗ рд╕рдорд╛рди рдЪрд░ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреБрдЫ рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдирд┐рд╣рд┐рдд рд╣реИрдВред рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдЯреНрд░реАрдЬрд╝ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЗрдПрд╕ рд╕реЗ рдкрд╣реБрдВрдЪ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рднреА рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ shaders рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЦреБрдж рдХреБрдЫ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд╡рд░реНрдЯрд┐рд╢рд░ рд╢реЗрдбрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
attribute vec3 position; attribute vec3 normal; attribute vec2 uv;
рдирд╛рдореЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ - рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдмрдирд╛рд╡рдЯ рдкрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИ рдЬреЛ рд╢рд┐рдЦрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ (x, y, z) рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрдирд╛рд╡рдЯ рд╡рд┐рдорд╛рди рдкрд░ (u, v) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЪрд░ рдХрд╛ рдирд╛рдоред рдЖрдк рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдирд╕реЗ рдорд┐рд▓реЗрдВрдЧреЗред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХреЛрдВ рдХреЛ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдХрд░ рд▓реЗрдВрдЧреЗред
varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }
рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЯреБрдХрдбрд╝рд╛ shader рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
#define EPSILON 0.02 varying vec2 vUv; void main() { if ((fract(vUv.x * 10.0) < EPSILON) || (fract(vUv.y * 10.0) < EPSILON)) { gl_FragColor = vec4(vec3(0.0), 1.0); } else { gl_FragColor = vec4(1.0); } }
рдмрд╕ рдПрдХ рдЬрд╛рд▓ рдмрдирд╛рдУред рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдкрд░ рдпрд╣ рд╕рд┐рд░реНрдл рдЪреМрд░рд╛рд╣реЛрдВ рдХрд╛ рдПрдХ рдЧреНрд░рд┐рдб рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЧреЛрд▓реЗ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд┐рдХреГрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдЧреНрд▓реЛрдм рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдПрдХ рдЕрдЪреНрдЫреА рддрд╕реНрд╡реАрд░ рд╣реИ рдЬреЛ рдмрддрд╛ рд░рд╣реА рд╣реИ рдХрд┐:

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╢реЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордп рдЬреЛрдбрд╝реЗрдВред рдмрд┐рдирд╛ рд╕рдордп рдХреЗ рдХрд╣реАрдВ рдирд╣реАрдВред рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдереНрд░реА.рдЬреЗрдПрд╕ рдореЗрдВ рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИред рд╢реЗрдбрд░реНрд╕ рдореЗрдВ рд╕рдордп рдХреЛ uTime рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ TIME рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
function updateUniforms() { SCENE.traverse((child) => { if (child instanceof THREE.Mesh && child.material.type === 'ShaderMaterial') { child.material.uniforms.uTime.value = TIME; child.material.needsUpdate = true; } }); }
рд╣рдо рд╣рд░ рдХреЙрд▓ рдХреЛ рдЪреЗрддрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
function animate() { requestAnimationFrame(animate); TIME += 0.005; updateUniforms(); render(); }
рдЖрдЧ
рдЖрдЧ рдкреИрджрд╛ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рд░рдВрдЧред рдпрд╛ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред
рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдФрд░ рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рд╢реЛрд░ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реЛрд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрддрд┐ рд╕реЗ рдЪрд▓рдирд╛ рд╣реИред рдЖрдкрдХреЛ рдХреБрдЫ рдорд┐рд▓реЗрдЧрд╛ рдЬреИрд╕реЗ рдЖрдЧ рдХреА рд▓рдкрдЯреЗрдВ, рдмрдбрд╝реЗ рд╡рд╛рд▓реЗ рдзреАрд░реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рдЫреЛрдЯреЗ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ:
uniform float uTime; varying vec2 vUv; float rand(vec2); float noise(vec2); void main() { vec2 position1 = vec2(vUv.x * 4.0, vUv.y - uTime); vec2 position2 = vec2(vUv.x * 4.0, vUv.y - uTime * 2.0); vec2 position3 = vec2(vUv.x * 4.0, vUv.y - uTime * 3.0); float color = ( noise(position1 * 5.0) + noise(position2 * 10.0) + noise(position3 * 15.0)) / 3.0; gl_FragColor = vec4(0.0, 0.0, 0.0, color - smoothstep(0.1, 1.3, vUv.y)); } float rand(vec2 seed) { return fract(sin(dot(seed, vec2(12.9898,78.233))) * 43758.5453123); } float noise(vec2 position) { vec2 blockPosition = floor(position); float topLeftValue = rand(blockPosition); float topRightValue = rand(blockPosition + vec2(1.0, 0.0)); float bottomLeftValue = rand(blockPosition + vec2(0.0, 1.0)); float bottomRightValue = rand(blockPosition + vec2(1.0, 1.0)); vec2 computedValue = smoothstep(0.0, 1.0, fract(position)); return mix(topLeftValue, topRightValue, computedValue.x) + (bottomLeftValue - topLeftValue) * computedValue.y * (1.0 - computedValue.x) + (bottomRightValue - topRightValue) * computedValue.x * computedValue.y; }
рддрд╛рдХрд┐ рд▓реМ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХрд╡рд░ рди рдХрд░реЗ, рд╣рдо рдЪреМрдереЗ рд░рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ - рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ - рдФрд░ рдЗрд╕реЗ y рд╕рдордиреНрд╡рдп рдореЗрдВ рдмрд╛рдБрдзрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдврд╛рд▓ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдХрдИ рдмрд╛рд░ рдЗрдирдХреА рддрд░рд╣, рдпрд╣ рд╕реНрдореВрдерд╕реНрдЯреЗрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╢реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЧ рдкреИрджрд╛ рдХрд░рдиреЗ рдХрд╛ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╣реИред рдЖрдк рдЕрдХреНрд╕рд░ рдЙрдирд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдорд┐рд▓реЗрдВрдЧреЗред рдЬрд╛рджреВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ - рд╡реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд▓рд╛рдЬреНрдорд╛ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдпрд╣ рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЖрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд░реЛрдЪрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЫрд╛рдпрд╛рдХрд╛рд░ ...
рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд▓реМ рдХреЛ рдереЛрдбрд╝рд╛ "рдкреАрд╕рд╛" рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП? рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рд╢реНрди рдЗрд╕рдХреА рд╕рд░рд▓рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдмрдбрд╝реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рд╣рдореЗрдВ "рдЗрд╕рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ" рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдХреЛрдиреЗ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред To рдФрд░ fro, to рдФрд░ froред рддреАрди.js рдкрд╣рд▓реЗ рд╣реА рд╣рдореЗрдВ рд╢реАрд░реНрд╖ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЧреБрдЬрд╛рд░ рдЪреБрдХреЗ рд╣реИрдВ - рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред "рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ" рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реАрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдЗрдиред рдЖрдк рдмреЗрд╢рдХ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдкрддрд╛ рдирд╣реАрдВ рдХреНрдпрд╛-рдХреНрдпрд╛ рд▓реЗрдирд╛ - рджреЗрдирд╛ рд╣реИред рдмреЗрд╣рддрд░ рдЕрднреА рддрдХ, рд╡рд┐рднрд┐рдиреНрди рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдХрд╛ рдпреЛрдЧред
рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рди рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред
uniform float uTime; varying vec2 vUv; void main() { vUv = uv; vec3 delta = normal * sin(position.x * position.y * uTime / 10.0); vec3 newPosition = position + delta; gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0); }
рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рдЕрдм рдХрд╛рдлреА рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ ... рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдирд╛рдо рд╣реИ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди, рдлрд┐рд░ рд╕реЗ, рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ - рд╡реЗ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░рддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ "рдЧрдгрд┐рддреАрдп рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди" рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ - рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрд┐рд╕ рдЪрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рдЕрдирд╛рдбрд╝реА рдЫрд╡рд┐ рд╣реИред рддреЛ рдкрд╣рд▓реЗ, рд╣рдо рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рдкреЛрд╕реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдереНрд░реА.рдЬреЗрдПрд╕ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИ, рдЬрдмрдХрд┐ рдХрдИ рдкрд╛рдареЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд░реВрдк рд╕реЗ рднреБрд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд░реЗрдВрдбрд░ рдиреЗ рд╣рдореЗрдВ рдЬреЛ рдЫрд╡рд┐ рджреА рд╣реИ, рд╡рд╣ рдЗрдлрд╝реЗрдХреНрдЯ рдХреЙрдордкреЛрдЬрд╝рд░ (рдЬрдм рддрдХ рдпрд╣ рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рд╣реИ) рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреБрдЫ рдХреЛ рд╢рд░реНрдорд╕рд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдХреЛ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣реА рд╣реИ, рд░реЗрдВрдбрд░рд░ рдХреЗ рдмрд╛рдж, рдПрдХ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдРрд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрд░реНрде рдореЗрдВ, рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреБрдЫ рдЧреБрд▓ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдРрд╕рд╛ рдХрд╣рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреЛ рдХреБрдЫ рд╣рдо рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рддреАрди.js рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЦреБрдж рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
<script src='https://unpkg.com/three@0.99.0/examples/js/postprocessing/EffectComposer.js'></script> <script src='https://unpkg.com/three@0.99.0/examples/js/postprocessing/RenderPass.js'></script> <script src='https://unpkg.com/three@0.99.0/examples/js/postprocessing/ShaderPass.js'></script> <script src='https://unpkg.com/three@0.99.0/examples/js/shaders/CopyShader.js'></script> <script src='https://unpkg.com/three@0.99.0/examples/js/shaders/LuminosityHighPassShader.js'></script> <script src='https://unpkg.com/three@0.99.0/examples/js/postprocessing/UnrealBloomPass.js'></script>
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреАрди рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЖрдк рдпрд╣ рд╕рдм рдПрдХ рдмрдВрдбрд▓ рдореЗрдВ рд╡реЗрдмрдкреИрдХ рдпрд╛ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ, рд╕рдВрдЧреАрддрдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
COMPOSER = new THREE.EffectComposer(RENDERER); COMPOSER.setSize(window.innerWidth, window.innerHeight); const renderPass = new THREE.RenderPass(SCENE, CAMERA); renderPass.renderToScreen = true; COMPOSER.addPass(renderPass);
рд░реЗрдВрдбрд░рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рдпрдорд┐рдд рд░реЗрдВрдбрд░рд░ рд╕реЗ рдЬреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рдереЗ, рдЙрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк RenderPass рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╣рд╛рдВ рдорд╛рдирдХ рд░реЗрдВрдбрд░рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдЕрдм рдкреНрд░рддрд┐рдкрд╛рджрди рд╡рд╣рд╛рдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рдореЗрдВ рд░реЗрдВрдбрд░рд░ рдХреЛ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрдВрдкреЛрдЬрд░ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
function render() {
рдкрд╣рд▓реА рдкрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ RenderPass рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдпрд╣ рддрд░реАрдХрд╛ рдЗрдореНрдкреИрдХреНрдЯ рдХреЙрдордкреЛрдЬрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рджреГрд╢реНрдп рдХреА рдПрдХ рдкреНрд░рджрддреНрдд рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдлрд┐рд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреАред
рддреАрди.js рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдк UnrealBloomPass рдирд╛рдордХ рдПрдХ рдЪреАрдЬрд╝ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдВрдЬрди рд╕реЗ рдПрдХ рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдЪрдордХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдпрд╣ рдЫрд╡рд┐ рд╕реБрдзрд╛рд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реЛрдЧрд╛ред
const bloomPass = new THREE.UnrealBloomPass( new THREE.Vector2(window.innerWidth, window.innerHeight), 1.5, 1, 0.1); bloomPass.renderToScreen = true; COMPOSER.addPass(bloomPass);
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рд░реЗрдВрдбрд░рдЯреВрдЯрд╕реНрдХреНрд░реАрди рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЛ рджрд┐рдпрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдЖрдЗрдП рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдмреНрд▓реЛрдордкреИрд╕ рдиреЗ рд╣рдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдЪрдордХ рдкреНрд░рджрд╛рди рдХреА рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:
рд╕рд╣рдордд рд╣реВрдБ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рддреАрди.js рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд╛рда рдореЗрдВ рджрд┐рдЦрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рд╣рдо рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ ...
рдЕрдзрд┐рдХ рдЫрд╛рдпрд╛рджрд╛рд░ рднрдЧрд╡рд╛рди рдХреЗ рд▓рд┐рдП!

рдпрд╣ рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдореЗрдВ, рдЖрдк рд░реЗрдВрдбрд░рдЯрд╛рд░реНрдЧ 1, рд░реЗрдВрдбрд░рдЯрд╛рд░реНрдЧреЗрдЯ 2, рдЖрджрд┐ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рддрддреНрд╡ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ EffectComposer рдХреЛ рдХреНрдпреЛрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрд╕рд╡реАрдЬреА рдореЗрдВ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, рдХреНрдпрд╛ рдЖрдк рджреВрд╕рд░реЛрдВ рдореЗрдВ рдХреБрдЫ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ - рдЖрдк рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рддреАрди.js рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдХрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдмреЗрд╣рддрд░ рдХреНрдпрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдмрд╛рд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдПрдХ рдФрд░ рдкрд╛рд╕ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдмрд╛рд░ рдпрд╣ ShaderPass рд╣реЛрдЧрд╛ред
const shader = { uniforms: { uRender: { value: COMPOSER.renderTarget2 }, uTime: { value: TIME } }, vertexShader: document.getElementById('postprocessing-vertex-shader').textContent, fragmentShader: document.getElementById('postprocessing-fragment-shader').textContent }; const shaderPass = new THREE.ShaderPass(shader); shaderPass.renderToScreen = true; COMPOSER.addPass(shaderPass);
RenderTarget2 рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдкрд╛рд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ - рдмреНрд▓реВрдореЛрдордкрд╛рд╕ (рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рджреВрд╕рд░рд╛ рдерд╛), рд╣рдо рдЗрд╕реЗ рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдлреНрд▓реИрдЯ рд░реЗрдВрдбрд░ рдХреА рдЧрдИ рдЫрд╡рд┐ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдирдП рд╢реИрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрднрд╡рддрдГ рдпрд╣ рд╕рднреА рдЬрд╛рджреВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдФрд░ рд╕рд╛рдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ ...
рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рд╕рд┐рдВрдкрд▓ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдмрдирд╛рдПрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдореЗрдВ рд▓рдВрдмреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдпреВ, рд╡реА) рдХреЛ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }
рдФрд░ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдордЬрд╝реЗрджрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╣рд▓реНрдХрд╛ рдЧрдбрд╝рдмрдбрд╝ рдкреНрд░рднрд╛рд╡ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рд▓рд╛ рдФрд░ рд╕рдлреЗрдж рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрдордХ / рд╡рд┐рдкрд░реАрдд рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
uniform sampler2D uRender; uniform float uTime; varying vec2 vUv; float rand(vec2); void main() { float randomValue = rand(vec2(floor(vUv.y * 7.0), uTime / 1.0)); vec4 color; if (randomValue < 0.02) { color = texture2D(uRender, vec2(vUv.x + randomValue - 0.01, vUv.y)); } else { color = texture2D(uRender, vUv); } float lightness = (color.r + color.g + color.b) / 3.0; color.rgb = vec3(smoothstep(0.02, 0.7, lightness)); gl_FragColor = color; } float rand(vec2 seed) { return fract(sin(dot(seed, vec2(12.9898,78.233))) * 43758.5453123); }
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдкрд░рд┐рдгрд╛рдо:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЧреЛрд▓реЗ рдкрд░ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЕрднреА рднреА рддреАрди рдЖрдпрд╛рдореА рд╣реИ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдЯреВрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдЫрд╡рд┐ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдереНрд░реАрдЬреЗрдЬ рдореЗрдВ рд╢рдбрд░ рд╕рд╛рдордЧреНрд░реА рдФрд░ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рджреЛ рдЫреЛрдЯреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВред рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рд╕рдм рдХреБрдЫ рдЖрдкрдХреА рдХрд▓реНрдкрдирд╛ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдирдХреА рдорджрдж рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рджреГрд╢реНрдпреЛрдВ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рд╕реЗ рдкрд░реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред