рдореЗрд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓
"рдХреНрд░рд┐рдПрдЯрд┐рдВрдЧ рд╢реЗрдбрд░реНрд╕" рдореЗрдВ, рдореИрдВрдиреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЯреБрдХрдбрд╝реЗ рд╡рд╛рд▓реЗ
рд╢реЗрдбреНрд╕ рдХреЛ рджреЗрдЦрд╛, рдЬреЛ рдХрд┐
рд╢реИрдбрд░реЙрдп рдкрд░ рдХрд┐рд╕реА рднреА 2 рдбреА рдкреНрд░рднрд╛рд╡ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реЗрдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдореИрдВ рдПрдХ рд╕реНрдЯрд╛рдЗрд▓рд┐рдЬреНрдб рдХрд╛рд░реНрдЯреВрди рд╡реЙрдЯрд░ рд╢реИрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбреНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдКрдБрдЧрд╛ред рдореИрдВ рдЧрд╣рд░рд╛рдИ рдХреЗ рдмрдлрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреГрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдореБрджреНрд░реА рдлреЛрдо рдХреА рд▓рд╛рдЗрдиреЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рддреИрдпрд╛рд░ рдкреНрд░рднрд╛рд╡ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред рдПрдХ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдбреЗрдореЛ
рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ:
- рдкрд╛рдиреА рдХреЗ рдкрд╛рд░рднрд╛рд╕реА рдЬрд╛рд▓ рдХреЗ рд╕рд╛рде рдЙрдкрд╡рд┐рднрд╛рдЬрд┐рдд рдмрд╣реБрднреБрдЬ рдФрд░ рд▓рд╣рд░реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╡рдд рдСрдлрд╕реЗрдЯред
- рд╕рддрд╣ рдкрд░ рд╕реНрдерд┐рд░ рдЬрд▓ рд░реЗрдЦрд╛рдПрдБред
- рдирдХрд▓реА рдирд╛рд╡ рдЙрдЫрд╛рд▓ред
- рдкрд╛рдиреА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдлреЛрдо рдХреА рдЧрддрд┐рд╢реАрд▓ рд▓рд╛рдЗрдиреЗрдВред
- рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рд╕рдм рдХреБрдЫ рдХреА рд╡рд┐рдХреГрддрд┐ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧред
рдЗрд╕ рдЖрд╢рдп рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЫреВрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдРрд╕реА рддрдХрдиреАрдХреЛрдВ рдХреЛ рднреА рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдирдП рдкреНрд░рднрд╛рд╡реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдореИрдВ
PlayCanvas рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░реВрдБрдЧрд╛ , рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореБрдлреНрдд рд╡реЗрдм-рдЖрдИрдбреАрдИ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА WebGL рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдереНрд░реА.рдЬреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдФрд░ PlayCanvas рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдХрд┐рдл рд╣реИрдВред рдЖрдк
рдпрд╣рд╛рдБ shaders рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░ рд╕рдХрддреЗ
рд╣реИрдВ , рдФрд░
рдпрд╣рд╛рдБ PlayCanvas рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛
рдЗрд╕ рдЦрдВрдб рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣рдорд╛рд░реЗ рдкреНрд▓реЗрдХреИрдирд╡рд╛рд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдкрд╛рдиреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ PlayCanvas рдЦрд╛рддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ
рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛
рд░рд┐рдХреНрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рджреГрд╢реНрдп рдореЗрдВ рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯ, рдПрдХ рдХреИрдорд░рд╛ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореЙрдбрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ
рд╡реЗрдм рдХреЗ рд▓рд┐рдП 3 рдбреА рдореЙрдбрд▓ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рд╕рдВрд╕рд╛рдзрди Google
рдкреЙрд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рд╕реЗ
рдирд╛рд╡ рдХрд╛ рдореЙрдбрд▓ рд▓рд┐рдпрд╛ред рдЖрд░реНрдХрд╛рдЗрд╡ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ
.obj
рдФрд░
.png
рдлрд╛рдЗрд▓реЗрдВ
.obj
ред
- PlayCanvas рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдПрд╕реЗрдЯреНрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЛрдиреЛрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪреЗрдВред
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░
.png
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕рдХреЗ рдкреНрд░рд╕рд╛рд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдиреЗрдВред
рдЕрдм рдЖрдк
Tugboat.json рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреЙрдХреНрд╕ рдФрд░ рдкреНрд▓реЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╛рд╡ рдмрд╣реБрдд рдЫреЛрдЯреА рд▓рдЧрддреА рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдкреИрдорд╛рдирд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдорд╛рди рдХреЛ 50 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдореЙрдбрд▓ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдХреНрд░рдорд╛ рдХреИрдорд░рд╛
рдХрдХреНрд╖рд╛ рдореЗрдВ рдЙрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреИрдорд░реЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдЗрд╕ PlayCanvas рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдирдХрд▓ рдХрд░реЗрдВрдЧреЗред рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕рдВрдкрд╛рджрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
- рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ
mouse-input.js
рдФрд░ orbit-camera.js
рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдорд╛рди рдирд╛рдореЛрдВ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред - рдХреИрдорд░реЗ рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВред
- рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред
рд╕рдВрдХреЗрдд: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрд╕реЗрдЯреНрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрди рджреЛ рдХреИрдорд░рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд┐рдкрд┐рдпреЛрдВ / рдХреИрдорд░рд╛ / рдлрд╝реЛрд▓реНрдбрд░, рдореЙрдбрд▓ рдореЗрдВ рдореЗрд░рд╛ рдореЙрдбрд▓ / рдФрд░ рд╕рд╛рдордЧреНрд░реА / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓ рджрд┐рдпрд╛ред
рдЕрдм рдЬрдм рдЖрдк рдЧреЗрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рджреГрд╢реНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдКрдкрд░реА рджрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд▓реЙрдиреНрдЪ рдмрдЯрди) рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирд╛рд╡ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЖрдк рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ рдХреИрдорд░реЗ рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдмрд╣реБрднреБрдЬ рдбрд┐рд╡реАрдЬрди
рдЗрд╕ рдЦрдВрдб рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдЙрдк-рд╡рд┐рднрд╛рдЬрд┐рдд рдЬрд╛рд▓ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рд░рд╛рд╣рдд рдкреАрдврд╝реА рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдирдИ
Water.js
рд╕реНрдХреНрд░рд┐рдкреНрдЯ
Water.js
рдмрдирд╛рдПрдБред рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛
GeneratePlaneMesh
рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
Water.prototype.GeneratePlaneMesh = function(options){
рдЕрдм рд╣рдо рдЗрд╕реЗ
initialize
рдлрдВрдХреНрд╢рди рдореЗрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:
Water.prototype.initialize = function() { this.GeneratePlaneMesh({subdivisions:100, width:10, height:10}); };
рдЕрдм рдЬрдм рдЖрдк рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдкрд╛рдЯ рд╕рддрд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдкрд╛рдЯ рд╕рддрд╣ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рдЬрд╛рд░реЛрдВ рдЪреЛрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдиреА рдЬрд╛рд▓реА рд╣реИред рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдпрд╣ рд╕рд┐рд░реНрдл рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ)ред
рд╕рдорд╕реНрдпрд╛ 1: рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗ Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡рд┐рдорд╛рди рдиреАрдЪреЗ рдХреА рдЖрдХреГрддрд┐ рдЬреИрд╕рд╛ рджрд┐рдЦреЗред
рд▓рд╣рд░реЗрдВ
рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдХреЛ рдирд╛рдорд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб рддрд░рдВрдЧреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ 3D рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╢реЗрдбреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрддрд╛ рд╣реИред PlayCanvas рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдЗрд╕рдХреА рдПрдХ
рдЕрдЪреНрдЫреА рд▓рд┐рдВрдХ рдпрд╣рд╛рдБ рджреА рдЧрдИ рд╣реИред
рд╢реЗрдбрд░ рдЕрдЯреИрдЪрдореЗрдВрдЯ
рдЖрдЗрдП рдПрдХ рдирдпрд╛
CreateWaterMaterial
рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ
CreateWaterMaterial
рдирдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдмрджрд▓реЗ рд╣реБрдП рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде
CreateWaterMaterial
рдФрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ:
Water.prototype.CreateWaterMaterial = function(){
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдЯреБрдХрдбрд╝рд╛ shader рдХреЛрдб рд▓реЗрддрд╛ рд╣реИред рддреЛ рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ (
pc.createScript
рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж):
Water.attributes.add('vs', { type: 'asset', assetType: 'shader', title: 'Vertex Shader' }); Water.attributes.add('fs', { type: 'asset', assetType: 'shader', title: 'Fragment Shader' });
рдЕрдм рд╣рдо рдЗрди shader рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдкрд╛рджрдХ рдкрд░ рд▓реМрдЯреЗрдВ рдФрд░ рджреЛ shader рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:
Water.frag рдФрд░
Water.vert ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдЗрди рд╢реЗрдбреНрд╕ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред
рдпрджрд┐ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдкрд╛рд░реНрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
рдЕрдм рдЗрд╕ рдореВрд▓ shader рдХреЛ
Water.frag рдореЗрдВ
рдЪрд┐рдкрдХрд╛рдПрдБ :
void main(void) { vec4 color = vec4(0.0,0.0,1.0,0.5); gl_FragColor = color; }
рдФрд░ рдпрд╣ рдПрдХ
Water.vert рдореЗрдВ рд╣реИ :
attribute vec3 aPosition; uniform mat4 matrix_model; uniform mat4 matrix_viewProjection; void main(void) { gl_Position = matrix_viewProjection * matrix_model * vec4(aPosition, 1.0); }
рдЕрдВрдд рдореЗрдВ, рдорд╛рдирдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реА рдирдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
Water.js рдкрд░ рд▓реМрдЯреЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рд╣реИ:
var material = new pc.StandardMaterial();
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ:
var material = this.CreateWaterMaterial();
рдЕрдм, рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд┐рдорд╛рди рдиреАрд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЧрд░реНрдо рд░рд┐рдмреВрдЯ
рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдирдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл shader blanks рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реВрдВ, рдореИрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Water.js рдореЗрдВ) рдореЗрдВ
swap
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВрдЧреЗред рдмрд╛рдж рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рднреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╢реЗрдбреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред WebGL рдореЗрдВ рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╢реЗрдбреНрд╕ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдо рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ shader рдХреЛрдб рдХреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓ рдЧрдИ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢реЗрдбрд░реНрд╕ рдХреЛ
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ:
рдФрд░ рдпрджрд┐ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдЖ рд╣реИ рддреЛ рд╣рдо
рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
рдЕрдм, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкрд╛рдиреА рдореЗрдВ рд╡рд┐рдорд╛рди рдХрд╛ рд░рдВрдЧ рдмрджрд▓реЗрдВред рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВред рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд░рд┐рдмреВрдЯ рдФрд░ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! рдпрд╣рд╛рдБ рд░рдВрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЪреБрдирд╛ рд╣реИ:
vec4 color = vec4(0.0,0.7,1.0,0.5);
рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбреНрд╕
рддрд░рдВрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЬрд╛рд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рдХреНрд░рд┐рдпрд╛ рд╢реАрд░реНрд╖рд╛рд╕рди рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЯреБрдХрдбрд╝рд╛ shader рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рдВрдЧ рджреЗрддрд╛ рд╣реИ, рддреЛ рдПрдХ
рд╢реАрд░реНрд╖ shader рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИ, рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░
рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╢реАрд░реНрд╖ shader рдореЙрдбрд▓ рдХреА
рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ
рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░
рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрдкрдиреА
рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ 3D рджреГрд╢реНрдп x, y рдФрд░ z рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЙрдирд┐рдЯрд░ рдПрдХ рд╕рдкрд╛рдЯ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рд╡рд┐рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо 3D рд╕реНрдХреНрд░реАрди рдХреЛ 2D рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рдХрд╛рд░, рдкреНрд░рдХреНрд╖реЗрдкрдг рдФрд░ рдореЙрдбрд▓ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ
рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рд╣реИ ред
рдЕрд░реНрдерд╛рддреН, рдпрд╣ рд░реЗрдЦрд╛:
gl_Position = matrix_viewProjection * matrix_model * vec4(aPosition, 1.0);
рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╢реАрд░реНрд╖ рдХреЗ 3D рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ
aPosition
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
gl_Position
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд 2D рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдореЗрдВред рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ "рдЙрдк" рдПрдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рди рдПрдХ
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЪрд░
рд╡рд░реНрджреА рдПрдХ рдореВрд▓реНрдп рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реАрдкреАрдпреВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ shader рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ / рдХреЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдореВрд▓реНрдп рд░рдЦрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реАрдкреАрдпреВ
рд╕рд░рдгреА рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖ shader рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЙрд╕ рд╢реЗрдбрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ Water.js рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ:
var shaderDefinition = { attributes: { aPosition: pc.gfx.SEMANTIC_POSITION, aUv0: pc.SEMANTIC_TEXCOORD0, }, vshader: vertexShader, fshader: fragmentShader };
рдкреНрд▓реЗрдХреИрдирд╡рд╛рд╕ рдЗрд╕ рдЧрдгрдирд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп
aPosition
рд▓рд┐рдП рд╢реАрд░реНрд╖ рдкрджреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХреЛ рд╡рд░реНрдЯреЗрдХрд░ shader рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд░реНрдЯреЗрдХреНрд╕ рдЖрдВрджреЛрд▓рди
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╕рднреА
x
рдорд╛рдиреЛрдВ рдХреЛ 0.5 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдкреВрд░реЗ рд╡рд┐рдорд╛рди рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдореЗрдВ
aPosition
рдпрд╛
gl_Position
рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдкрд╣рд▓реЗ
aPosition
ред рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реАрдзреЗ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
attribute vec3 aPosition; uniform mat4 matrix_model; uniform mat4 matrix_viewProjection; void main(void) { vec3 pos = aPosition; pos.x *= 0.5; gl_Position = matrix_viewProjection * matrix_model * vec4(pos, 1.0); }
рдЕрдм рд╡рд┐рдорд╛рди рдХреЛ рдПрдХ рдЖрдпрдд рдХреА рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо
gl_Position
рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
attribute vec3 aPosition; uniform mat4 matrix_model; uniform mat4 matrix_viewProjection; void main(void) { vec3 pos = aPosition;
рдЬрдм рддрдХ рдЖрдк рдХреИрдорд░рд╛ рд╣рд┐рд▓рд╛рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рддрдм рддрдХ рдпрд╣ рд╕рдорд╛рди рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдЪрд┐рддреНрд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛
рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ ред
рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рджреБрдирд┐рдпрд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдореЗрдВ рдХрд╛рдо рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЯрд╛рд╕реНрдХ 2: рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╢реЗрдк рдХреЛ рд╡рд┐рдХреГрдд рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд▓реЗрди рдХреА рдкреВрд░реА рд╕рддрд╣ рдХреЛ рдХрдИ рдпреВрдирд┐рдЯ рдКрдкрд░ (Y рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде) рд╡рд░реНрдЯрд┐рдХрд▓ рд╢реИрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдХрд╛рд░реНрдп 3: рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ gl_Position рджреНрд╡рд┐-рдЖрдпрд╛рдореА рд╣реИ, рд▓реЗрдХрд┐рди gl_Position.z рднреА рдореМрдЬреВрдж рд╣реИред рдХреНрдпрд╛ рдЖрдк рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдореВрд▓реНрдп рдХреБрдЫ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рд╕рдордп рдЬреЛрдбрд╝рдирд╛
рдЪрд▓рддреА рд▓рд╣рд░реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЬреЛ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдПрдХ рд╕рдорд╛рди рдЪрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╢рд┐рдЦрд░ рдХреА рдЫрд╛рдпрд╛ рдореЗрдВ рд╕рдорд╛рди рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
uniform float uTime;
рдЕрдм, рдЗрд╕реЗ shader рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдЪрд▓рд┐рдП Water.js рдкрд░ рд╡рд╛рдкрд╕
рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рд╕рдордп рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
Water.prototype.initialize = function() { this.time = 0;
рдЕрдм, рдЪрд░ рдХреЛ рдЫрд╛рдпрд╛рджрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
material.setParameter
рдЙрдкрдпреЛрдЧ
material.setParameter
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо
CreateWaterMaterial
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
рдЕрдм,
update
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд╕рдордп рдХреА рд╡реГрджреНрдзрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
this.time += 0.1; this.material.setParameter('uTime',this.time);
рдЕрдВрдд рдореЗрдВ, рд╕реНрд╡реИрдк рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕рдордп рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдпрд╣ 0 рдкрд░ рд░реАрд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдмрдврд╝рддрд╛ рд░рд╣реЗред
Water.prototype.swap = function(old) { this.time = old.time; };
рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдо рдЪрд▓рд╛рдПрдБред рдЕрдм
Water.vert
рдореЗрдВ рд╕рдордп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рдорд╛рди рдХреЛ рдЖрдЧреЗ
Water.vert
:
pos.y += cos(uTime)
рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рдорд╛рди рдХреЛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдЪрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдЪреВрдБрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрд╡реИрдк рдлрдВрдХреНрд╢рди рд╣реИ, рд╣рдо рдкреБрдирдГ рдЖрд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рднреА Water.js рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рдордп рд╡реГрджреНрдзрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЯрд╛рд╕реНрдХ 4: рдХреНрдпрд╛ рдЖрдк рд╢реАрд░реНрд╖ рд░реЗрдЦрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдиреАрдЪреЗ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рд▓рд╣рд░реЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдВ?
рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВ рдХрд┐ рдореИрдВрдиреЗ
рдпрд╣рд╛рдВ рддрд░рдВрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХреАред рд▓реЗрдЦ 2 рдбреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕рдорд╛рдзрд╛рди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ
рдпрд╣рд╛рдБ рд╕рд╛рд░ рд╣реИ ред
рдкрд╛рд░рднрд╛рд╕рдХрддрд╛
рдЗрд╕ рдЦрдВрдб рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкрд╛рд░рднрд╛рд╕реА рдЬрд▓ рдХреА рд╕рддрд╣ рдмрдирд╛рдирд╛ рд╣реИред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рдЯрд░.рдлреНрд░реИрдЧ рдореЗрдВ рд▓реМрдЯрд╛ рд╣реБрдЖ рд░рдВрдЧ 0.5 рдХрд╛ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рддрд╣ рдЕрднреА рднреА рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдЕрднреА рднреА рдПрдХ рдЕрдирд╕реБрд▓рдЭрд╛ рдореБрджреНрджрд╛ рд╣реИред рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд▓рд╛рдЧрдд рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдЖрдорддреМрд░ рдкрд░, рдкрд┐рдХреНрд╕реЗрд▓ рдЦреАрдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣
рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдореЗрдВ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЧрд╣рд░рд╛рдИ рдореВрд▓реНрдп (рдЬреЗрдб рдЕрдХреНрд╖ рдкрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐) рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдордиреЗ рдХреА рдУрд░ рдЫрд╛рдБрдЯрдиреЗ рдХреЗ рдмрд┐рдирд╛ рджреГрд╢реНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдорд┐рд╢реНрд░рдг рдХрд░рддреЗ рд╕рдордп, рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдпрд╛ рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрд┐рдХреНрд╕реЗрд▓ (рд▓рдХреНрд╖реНрдп) рдХреЗ рд░рдВрдЧ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо (рд╕реНрд░реЛрдд) рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред WebGL рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдорд┐рдХреНрд╕рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдПрдХ рд╕реВрдЪреА
рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА
рд╣реИ ред
рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╕рдВрдпреБрдХреНрдд рд░рдВрдЧ рдПрдХ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдФрд░ рдПрдХ рд▓рдХреНрд╖реНрдп рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдПрдХ рд╢реВрдиреНрдп рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдПрдХ рд╕реНрд░реЛрдд рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдЕрд▓реНрдлрд╛ = 0.4, рддреЛ рдЕрдВрддрд┐рдо рд░рдВрдЧ рдХрд╛ рдПрдХ рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
finalColor = source * 0.4 + destination * 0.6;
PlayCanvas рдореЗрдВ, рдпрд╣ рдСрдкрд░реЗрд╢рди
pc.BLEND_NORMAL рд╣реИ ред
рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
CreateWaterMaterial
рдЕрдВрджрд░ рднреМрддрд┐рдХ рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░реЗрдВ:
material.blendType = pc.BLEND_NORMAL;
рдпрджрд┐ рдЖрдк рдЕрдм рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд╛рдиреА рдкрд╛рд░рднрд╛рд╕реА рд╣реЛ рдЬрд╛рдПрдЧрд╛! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рднреА рдЕрдкреВрд░реНрдг рд╣реИред рд╕рдорд╕реНрдпрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдкрд╛рд░рднрд╛рд╕реА рд╕рддрд╣ рд╕реНрд╡рдпрдВ рдкрд░ рд╕реБрдкрд░рд┐рдореНрдкреЛрдЬ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдо рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рдмрдЬрд╛рдп
рдЕрд▓реНрдлрд╝рд╛ рдЯреВ рдХрд╡рд░реЗрдЬ , рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд▓реНрдЯреАрд╕рдорд╛рдкрд▓рд┐рдВрдЧ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ WebGL 2 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдмрд╛рдХреА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛
рд╣рдордиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдФрд░ рдкрд╛рдиреА рдХреА рдПрдХ рдкрд╛рд░рднрд╛рд╕реА рд╕рддрд╣ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛, рдЬреЛ рд╡рд░реНрдЯреЗрдХрд░ рд╢реЗрдбрд░ рд╕реЗ рдПрдирд┐рдореЗрдЯреЗрдб рддрд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЙрдЫрд╛рд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдкрд╛рдиреА рдХреА рд╕рддрд╣ рдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рд╕рддрд╣ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдлреЛрдо рд▓рд╛рдЗрдиреЗрдВ рдмрдирд╛рдПрдВрдЧреЗред
рддреАрд╕рд░реЗ (рдЕрдВрддрд┐рдо) рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкрд╛рдиреА рдХреЗ рдиреАрдЪреЗ рдХреА рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рднрд╛рд╡ рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдЧреЗ рдХреЗ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╕реНрд░реЛрдд рдХреЛрдб
рд╕рдорд╛рдкреНрдд PlayCanvas рдкрд░рд┐рдпреЛрдЬрдирд╛
рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА
рд╣реИ ред рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ
рддреАрди .
js рдХреЗ рддрд╣рдд рдПрдХ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЛрд░реНрдЯ рднреА рд╣реИред