
WebGL рд▓рдЧрднрдЧ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╣реИ, рдХрдИ рд▓реЗрдЦ shaders рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдкрд╛рдареЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд▓реЗрдЖрдЙрдЯ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВред рдпрд╣ рдХрд╣рдирд╛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд╡реЗ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЧреЗрдо рдЗрдВрдЬрди рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд▓реЗрдЖрдЙрдЯ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреА рдмрдЬрд╛рдп рдЪрд╛рд╣рд┐рдПред рд╡реЗ рддреБрд░рдВрдд рдПрдХ рдЬрдЯрд┐рд▓ рджреГрд╢реНрдп, рдПрдХ рдХреИрдорд░рд╛, рд▓рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ... рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд╛рдЗрдЯ рдкрд░, рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЬреЛрдбрд╝реА рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдм рдЬреНрдЮрд╛рди рдмреЗрдорд╛рдиреА рд╣реИред рдирддреАрдЬрддрди, рд▓реЛрдЧ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╡рд╛рд╕реНрддреБ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ, рд▓рдВрдмреЗ рд╢реЗрдбреНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдЗрд╕ рд╕рдм рдиреЗ рдЙрди рд╢реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрди рдкрд╣рд▓реБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ рдЬреЛ рд╕рд╛рдЗрдЯ рдкрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди 2d рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдмреЗрд╢рдХ, рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕реНрд╡рдпрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдмрджрд▓рд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдПрд╕рд╡реАрдЬреА рдкрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ shaders рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА canvas
рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрдЬреАрдПрд▓ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдЧрдгрд┐рдд рдХрд╛ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рди рд╣реИред рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдХрд╛рджрдорд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ, рддрд╛рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдордЭ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛ рд╕рдХреЗ, рди рдХрд┐ рдЙрдирдХреЗ рдЖрдВрддрд░рд┐рдХ рд░рд╕реЛрдИ рдпрд╛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рд┐рджреНрдзрд╛рдВрддред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдХрд┐рддрд╛рдмреЗрдВ рд╣реИрдВред
рдпрд╣ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдбрдкреИрди рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдПрдХреАрдХреГрдд рд╕рдВрдкрд╛рджрдХреЛрдВ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рддреЛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдкрдХреА рдореИрдХрдмреБрдХ рдкрд░ рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЙрдирд╕реЗ рдирд╣реАрдВ рдЖрддреА рд╣реИред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░
рдПрдХ shader рдХреНрдпрд╛ рд╣реИ?
рдПрдХ рдЯреБрдХрдбрд╝рд╛ shader рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдпрд╣ anvas
рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдХрд╛рд░ 1000x500px canvas
рдПрдХ canvas
, рддреЛ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо 500,000 рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рдм рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЗ рдХреА рдПрдХ рдХрд┐рд╕реНрдо рдореЗрдВ GPU рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдХреЗрдВрджреНрд░реАрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░, рдРрд╕реА рдЧрдгрдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред
рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рднреА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ canvas
рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЛ рдЙрди рдЖрдХреГрддрд┐рдпреЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╕реЗ рддреАрди-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдХреЛрдиреЗ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ред рддрджрдиреБрд╕рд╛рд░, рдЗрдирдкреБрдЯ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдкрд┐рдХреНрд╕реЗрд▓ рдирд╣реАрдВред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:
- рд╣рдо рдЖрдпрдд рдХреЗ рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рддрд╕реНрд╡реАрд░ рдлрд┐рд░ "рдЦреАрдВрдЪреА" рдЬрд╛рдПрдЧреАред
- рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖ рд╢реЙрд▓реНрдбрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рдорд╛рдирддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреАрдЪреЗ рдЖрдПрдЧрд╛ - рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрдХ рд╡рд┐рдорд╛рдиред 3 рдбреА рдореЗрдВ рдлреЛрдЯреЛ рдХреА рд╣рдореЗрдВ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╕реНрдХреНрд░реАрди рд╡рд┐рдорд╛рди рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
- рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ, рдФрд░ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ рдЯреБрдХрдбрд╝рд╛ shader рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рддрд╕реНрд╡реАрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдХреБрдЫ рдЧрд┐рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рджреЗрддрд╛ рд╣реИред
- рдпрджрд┐ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рдерд╛, рддреЛ рдпрд╣ рд╕рдм рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░
canvas
рдХреЗ drawImage()
рдкрджреНрдзрддрд┐ рд╕реЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд░реНрдгрди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
рд╢реЗрдбреНрд╕ GLSL - OpenGL Shading Language рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдпрд╣ рднрд╛рд╖рд╛ C рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣рд╛рдБ рд╕рдВрдкреВрд░реНрдг рд╕рд┐рдВрдЯрд╛рд╕рд┐рд╕ рдФрд░ рдорд╛рдирдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдзреЛрдЦрд╛ рдкрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╢реЗрдбрд░ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред gl_
рдФрд░ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрд╕рд░реНрдЧ gl_
рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП gl_
ред рд╡реЗ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рдФрд░ рдЗрди рд╕рдорд╛рди рд╢реЗрдб рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рддреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ gl_Position
рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рд▓реЗрдЯ рдХреЗ рд▓рд┐рдП gl_Position
рдХрд░рддрд╛ рд╣реИ, рдлрд╝реНрд░реЗрдЧреНрдореЗрдВрдЯ (рдкрд┐рдХреНрд╕реЗрд▓) gl_FragCoord
, рдЖрджрд┐ рдореЗрдВ gl_FragCoord
рдЭреВрда рдХреЗ рд▓рд┐рдП рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдзреЛрдЦрд╛ рдкрддреНрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╡рд┐рд╢реЗрд╖ рдЪрд░ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдмрд▓реНрдХрд┐ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рд╣реИрдВ - void
, bool
, int
, float
... рдпрджрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рд╕реА-рд▓рд╛рдЗрдХ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВред рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╡реИрдХреНрдЯрд░ рдореЗрдВ - vec2
, vec3
, vec4
ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд░рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЬреЛ рдЪрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╣реИрдВ:
- рдпреВрдирд┐рдлреЙрд░реНрдо - рд╣рд░ рдорд╛рдпрдиреЗ рдореЗрдВ рдЧреНрд▓реЛрдмрд▓ рдбреЗрдЯрд╛ред рдмрд╛рд╣рд░ рд╕реЗ рдЙрддреНрддреАрд░реНрдг, рд╕рднреА рд╢реАрд░реНрд╖ рдФрд░ рдЯреБрдХрдбрд╝рд╛ shaders рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реАред
- рд╡рд┐рд╢реЗрд╖рддрд╛ - рдпрд╣ рдбреЗрдЯрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ shader рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рд╡реИрд░рд┐рдВрдЧ - рд╡рд░реНрдЯреАрдХрд▓ рд╢реЗрдбреНрд╕ рд╕реЗ рдлреНрд░реЗрдЧрдореЗрдВрдЯ рд╢реЗрдбреНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ред
рдЫрд╛рдпрд╛ рдореЗрдВ рд╕рднреА рдЪрд░реЛрдВ рдореЗрдВ u / a / v рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреНрдпрд╛ рдЖрдпрд╛ред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред
рдкрд╛рдХ рдХрд▓рд╛ рд╢реБрд░реВ рдЯреЗрдореНрдкрд▓реЗрдЯ
рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ canvas
рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рдВрджрд░реНрднред рдирдореВрдирд╛ рдХреЛрдб рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдмрдирд╛рдПрдВрдЧреЗ:
const CANVAS = document.getElementById(IDs.canvas); const GL = canvas.getContext('webgl');
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЛ рдЖрдХрд╛рд░ рджреЗрддреЗ рд╕рдордп canvas
рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдЙрд╕рдХреЗ рдкреБрдирд░реНрдЧрдгрдирд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рдХреНрд╖рдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдпрд╣ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдмрд╛рдХреА рд▓реЗрдЖрдЙрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╡реЗрдмрд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
function createProgram() { const shaders = getShaders(); PROGRAM = GL.createProgram(); GL.attachShader(PROGRAM, shaders.vertex); GL.attachShader(PROGRAM, shaders.fragment); GL.linkProgram(PROGRAM); GL.useProgram(PROGRAM); }
рдкрд╣рд▓реЗ, рд╣рдо рд╢реЗрдбреНрд╕ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдо рд╣реЛрдЧрд╛), рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВ, рд╣рдорд╛рд░реЗ рджреЛрдиреЛрдВ рд╢реЗрдбреНрд╕ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╢реЗрдбреНрд╕ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ рдЬреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╕реЗ рдлреНрд░реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ? - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдирдХреЗ рд╕реЗрдЯ рдпрд╣рд╛рдВ рдЪреЗрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдкрддрд╛ рди рдЪрд▓реЗ рдХрд┐ рдХреБрдЫ рдкреНрд░реЗрд╖рд┐рдд рдпрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред рдмреЗрд╢рдХ, рдпрд╣ рдЪреЗрдХ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрдлрд░ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реЗрдбрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ, рдПрдХ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд▓рд╛, рд╣рдо рдЗрди рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо a_position
рд╡рд┐рд╢реЗрд╖рддрд╛ a_position
рдорд╛рдзреНрдпрдо рд╕реЗ shader рдореЗрдВ рд╢реАрд░реНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реНрдерд╛рди рдорд┐рд▓рддрд╛ рд╣реИ (рдпрд╣ C рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдХреА рддрд░рд╣ рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЙрдЗрдВрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЗрдХрд╛рдИ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рднреАрддрд░ рд╣реА рдореМрдЬреВрдж рд╣реИ)ред
const vertexPositionAttribute = GL.getAttribLocation(PROGRAM, 'a_position');
рдЕрдЧрд▓рд╛, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдЗрд╕ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА (рдЫрд╛рдпрд╛ рдореЗрдВ рд╣реА, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ)ред рд╡реЗрдмрдЬреАрдПрд▓ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрдХреГрддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд┐рд╕ рд╢реИрдбрд░ рдХреЙрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдХреЗрд╡рд▓ рд╡реЗрдХреНрдЯрд░ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрдВрдЧреЗ: рдЖрдпрд╛рдо - 2 (рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x,y)
) рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд╣реАрдВ рд╣реИред рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
GL.enableVertexAttribArray(vertexPositionAttribute); GL.vertexAttribPointer(vertexPositionAttribute, 2, GL.FLOAT, false, 0, 0);
рдЕрдм рд╣рдорд╛рд░реЗ рд╡рд┐рдорд╛рди рдХреЗ рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдмрдлрд░ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕ рдкрд░ рдлрд┐рд░ рдлреЛрдЯреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред "2d" рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИред
function createPlane() { GL.bindBuffer(GL.ARRAY_BUFFER, GL.createBuffer()); GL.bufferData( GL.ARRAY_BUFFER, new Float32Array([ -1, -1, -1, 1, 1, -1, 1, 1 ]), GL.STATIC_DRAW ); }
рдпрд╣ рд╡рд░реНрдЧ рд╣рдорд╛рд░реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред STATIC_DRAW
рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрдлрд░ рдПрдХ рдмрд╛рд░ рд▓реЛрдб рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рд╕реНрд╡рдпрдВ рд╢реЗрдбреНрд╕ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдЙрдирдХреЗ рд╕рдВрдХрд▓рди:
function getShaders() { return { vertex: compileShader( GL.VERTEX_SHADER, document.getElementById(IDs.shaders.vertex).textContent ), fragment: compileShader( GL.FRAGMENT_SHADER, document.getElementById(IDs.shaders.fragment).textContent ) }; } function compileShader(type, source) { const shader = GL.createShader(type); GL.shaderSource(shader, source); GL.compileShader(shader); return shader; }
рд╣рдо рдкреГрд╖реНрда рдкрд░ рддрддреНрд╡реЛрдВ рд╕реЗ shader рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ shader рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк shader рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди CodePen рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрдИ рд╕рдмрдХ рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд╛рдЗрди рдкрд░ рд╕реАрдзреЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдЗрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓ рджреЗрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ ...
рдпрджрд┐ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреБрдЫ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рдЪрд▓рддреА рд░рд╣реЗрдЧреА рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд░реНрде рдирд╣реАрдВ рд░рдЦрддреА рд╣реИред рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рд▓реЙрдЧ рдХреЛ рджреЗрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╡рд╣рд╛рдБ рд╕рдВрдХрд▓рд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
console.log(GL.getShaderInfoLog(shader));
рд╡реЗрдмрд▓реЙрдЧ рд╢реЗрдбреНрд╕ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд╣рдо рд╡реИрд╕реЗ рднреА рдХреБрдЫ рднреА рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЕрдХреНрд╕рд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ "рдЧрд┐рд░ рдЧрдпрд╛ - рдлрд┐рд░ рдЧрд┐рд░ рдЧрдпрд╛" рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЪрд▓рд┐рдП рд╣рдо рдЦреБрдж рд╢рд╛рджрд┐рдпреЛрдВ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ
рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдорд╛рди рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧрд╛рдХрд╛рд░ рд╢реЗрдб рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдХрд░ рд▓реЗрдВрдЧреЗред рдореБрдЦреНрдп рдкреНрд░рдпрд╛рд╕ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдВрдЧреЗ рдФрд░ рдмрд╛рдж рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдВрдЧреЗред
рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕рд╛рд░реНрдердХ рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде shader рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЖрдкрдХреЛ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗрдВрдЧреЗ рдЬрд╣рд╛рдБ рдирд┐рд░рдВрддрд░ рдкрд╛рда рдХреА 200 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛрд░рджрд╛рд░ рдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдПрдХ-рдЕрдХреНрд╖рд░ рдЪрд░ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг "рдЬреАрдПрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛" рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкрд┐рдЫрд▓реА рд╢рддрд╛рдмреНрджреА рдХреЗ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рд▓рд┐рдкрд┐-рдкреЗрд╕реНрдЯ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдпреБрд╡рд╛рдУрдВ рдореЗрдВ рдЪрд░ рдирд╛рдореЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдерд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реАрд░реНрд╖ shaderред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x,y)
рд╕рд╛рде рдПрдХ 2d рд╡реЗрдХреНрдЯрд░ рдХреЛ a_position
рд╡рд┐рд╢реЗрд╖рддрд╛ рдЪрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХрд╣рд╛ред рд╢реЗрдбрд░ рдХреЛ рдЪрд╛рд░ рд╡реИрд▓реНрдпреВ (x,y,z,w)
рд╡реЗрдХреНрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХреБрдЫ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП z рдЕрдХреНрд╖ рдкрд░, рд╣рдо рдмрд╕ рд╕рдм рдХреБрдЫ рд╢реВрдиреНрдп рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ w рдХреЗ рдорд╛рди рдХреЛ рдорд╛рдирдХ рдЗрдХрд╛рдИ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рддреАрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмрдЬрд╛рдп рдЪрд╛рд░ рдХреНрдпреЛрдВ рд╣реИрдВ, рддреЛ рдЖрдк "рд╡рд░реНрджреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ" рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
<script id='vertex-shader' type='x-shader/x-vertex'> precision mediump float; attribute vec2 a_position; void main() { gl_Position = vec4(position, 0, 1); } </script>
рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░ gl_Position
рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╢рдмреНрдж рдХреЗ рдкреВрд░реНрдг рдЕрд░реНрде рдореЗрдВ рд╢реЗрдбреНрд╕ рдХрд╛ return
рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рдЪрд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдлреНрд▓реЛрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдХрд╛рд░реНрдп рдиреЛрдЯ рдХрд░реЗрдВред рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдЯреАрдХрддрд╛ рд╣рд╛рдИрдк рд╕реЗ рднреА рдмрджрддрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рджреЛрдиреЛрдВ рд╢реЗрдбреНрд╕ рдореЗрдВ рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрдВрджрд░рддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЛрди рдкрд░ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред
рдЯреБрдХрдбрд╝рд╛ shader рд╣рдореЗрд╢рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд░рдВрдЧ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рд╣рдорд╛рд░рд╛ рд╡рд░реНрдЧ рдкреВрд░реЗ canvas
рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
<script id='fragment-shader' type='x-shader/x-fragment'> precision mediump float; #define GOLD vec4(1.0, 0.86, 0.6, 1.0) void main() { gl_FragColor = GOLD; } </script>
рдЖрдк рд░рдВрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рднреА рдЖрд░рдЬреАрдмреАрдП рдЯрд╛рдЗрдкрд╕реЗрдЯрд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИред рдорд╛рди 0 рд╕реЗ 255 рддрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди 0 рд╕реЗ 1 рддрдХ рдЖрдВрд╢рд┐рдХ рд╣реИрдВред рдЖрджреЗрд╢ рд╕рдорд╛рди рд╣реИред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рднреА рдЬрд╛рджреВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ - рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИ (рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рд╕реА рдХреА рддрд░рд╣, рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ)ред
рдпрд╣ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдмрд╛рдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
рд╡рд┐рднрд┐рдиреНрди рдкрд╛рдареЛрдВ рдореЗрдВ рдирд┐рд░рдВрддрд░ рдЬрд╛рдВрдЪ #ifdef GL_ES рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрд░реНрде рд╕реЗ рд░рд╣рд┐рдд рд╣реИред рдЖрдЬ рд╣рдорд╛рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдХреЛрдИ рдЕрдиреНрдп GL рд╡рд┐рдХрд▓реНрдк рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:
рд╕реБрдирд╣рд░рд╛ рд╡рд░реНрдЧ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╢реЗрдб рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рдЙрдирдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдзреАрд░реЗ-рдзреАрд░реЗ рдФрд░ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╡реИрдХреНрдЯрд░
рдЖрдорддреМрд░ рдкрд░, рд╡реЗрдмрдЧреЗрд▓ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбреНрд░рд╛рдЗрдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдереЛрдбрд╝рд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрд░реНрде рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
void main() { gl_FragColor = vec4(gl_FragCoord.zxy / 500.0, 1.0); }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдиреЗрдЯ рдкрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред рджреЛрдиреЛрдВ рд╡реИрдХреНрдЯрд░ рд╣реИрдВред рддреЛ рдХреЛрдИ рднреА рдПрдХ рдвреЗрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬреАрд▓рд╡рд╛рджрд┐рдпреЛрдВ рдХреЗ рдпрд╣рд╛рдБ рд╣рдорд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдХреЗрд╡рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЧреБрдг .y
, .y
, .z
, .xy
, .zy
, .xyz
, .zyx
, .xyzw
, рдЖрджрд┐ред рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдореЗрдВ рдЖрдк рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рджреВрд╕рд░реЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдЪреНрдЪ рдЖрдпрд╛рдо рдХреЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЧрд╛рдпрдм рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХрдо рдЖрдпрд╛рдо рдХреЗ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХрд┐рдпрд╛ рдерд╛ред
рд╣рдореЗрд╢рд╛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдПрдВред рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг int -> рдлреНрд▓реЛрдЯ рдирд╣реАрдВ рд╣реИред
рд╡рд░реНрджреА рдФрд░ рд╕рдордп рдмреАрддрдиреЗ рдХреЗ рд╕рд╛рде
рдЕрдЧрд▓рд╛ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрджреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдпрд╣ рд╕рднреА shader рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рдбреЗрдЯрд╛ рд╣реИред рд╣рдо рдЙрдирдХрд╛ рд╕реНрдерд╛рди рдЙрд╕реА рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЪрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
GL.getUniformLocation(PROGRAM, 'u_time')
рдлрд┐рд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рдХрд┐ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде, рдпрд╣рд╛рдБ рдХрдИ рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬреЛ рд╢рдмреНрдж рдХреЗ рд╕рд╛рде рд╢реБрд░реВ uniform
, рддрдм рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЖрдпрд╛рдо (рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП 1, 2, 3 рдпрд╛ 4 рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП) рдФрд░ рдЯрд╛рдЗрдк (f - рдлреНрд▓реЛрдЯ, i - int, v - рд╡реЗрдХреНрдЯрд░) рд╣реЛрддрд╛ рд╣реИред ред
function draw(timeStamp) { GL.uniform1f(GL.getUniformLocation(PROGRAM, 'u_time'), timeStamp / 1000.0); GL.drawArrays(GL.TRIANGLE_STRIP, 0, 4); window.requestAnimationFrame(draw); }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╣рдореЗрд╢рд╛ 60fps рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордВрджреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИрдЕрдирд┐рдореЗрд╢рдирдлреНрд░реЗрдо рдФрд░ redrawing рдлреНрд░реЗрдо рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рднрд░рдг рд░рдВрдЧ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред acos
, рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдп рдЙрдкрд▓рдмреНрдз рд╣реИрдВ - sin
, cos
, tan
, asin
, acos
, acos
, pow
, exp
, log
, acos
, acos
рдФрд░ рдЕрдиреНрдпред рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
uniform float u_time; void main() { gl_FragColor = vec4( abs(sin(u_time)), abs(sin(u_time * 3.0)), abs(sin(u_time * 5.0)), 1.0); }
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдирд┐рдореЗрд╢рди рдореЗрдВ рд╕рдордп рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо requestAnimationFrame
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдирд╛ "рд╕рдордп" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдордп рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдордп рдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдореЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдзреАрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЧрддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рд░ рдЙрджрд╛рд╣рд░рдг, рдЪрд▓реЛ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдПрдХ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдПрдХ рдЪрд┐рддреНрд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рддрдм рд╣рдорд╛рд░реЗ рд╡рд┐рдорд╛рди рдкрд░ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреАред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐ рдХреЛ рд╕реНрд╡рдпрдВ рд▓реЛрдб рдХрд░реЗрдВ:
function createTexture() { const image = new Image(); image.crossOrigin = 'anonymous'; image.onload = () => {
рдЗрд╕рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдирдВрдмрд░ 0 рдкрд░ рдЬрд╛рдПрдЧрд╛ред рд╡реЗрдмрдЬреАрдПрд▓ рдореЗрдВ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдмрдирд╛рд╡рдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрд╛рдж рдХреЗ рдЖрджреЗрд╢ рдХрд┐рд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдмрдирд╛рд╡рдЯ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред
const texture = GL.createTexture(); GL.activeTexture(GL.TEXTURE0); GL.bindTexture(GL.TEXTURE_2D, texture);
рдпрд╣ рдПрдХ рддрд╕реНрд╡реАрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╣рдо рддреБрд░рдВрдд рдпрд╣ рднреА рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдИ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдлрд╝реНрд▓рд┐рдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ WebGL рдореЗрдВ, рдЕрдХреНрд╖ рдЙрд▓реНрдЯрд╛ рд╣реИ:
GL.pixelStorei(GL.UNPACK_FLIP_Y_WEBGL, true); GL.texImage2D(GL.TEXTURE_2D, 0, GL.RGB, GL.RGB, GL.UNSIGNED_BYTE, image);
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдмрдирд╛рд╡рдЯ рдЪреМрдХреЛрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЙрдирдХреЗ рдкрд╛рд╕ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рдЖрдХрд╛рд░ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - 32px, 64px, 128px, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рд╣рдо рд╕рднреА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдлрд╝реЛрдЯреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рд╡реЗ рд╣рд░ рдмрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рд╣реЛрдВрдЧреЗред рдпрджрд┐ canvas
рдЖрдХрд╛рд░ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рддреЛ рднреА рдпрд╣ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЫрд╡рд┐ рдХреЗ рдЪрд░рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рд╕реНрдерд╛рди рдХреЛ рд╡рд┐рдорд╛рди рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рднрд░рддреЗ рд╣реИрдВред рдпрд╣ рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдмреИрд╕рд╛рдЦреА рд▓рдЧрддрд╛ рд╣реИред
GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); GL.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR);
рдпрд╣ рдмрдирд╛рд╡рдЯ рдХреЛ рд░рдВрдЧреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо uniform
рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
GL.uniform1i(GL.getUniformLocation(PROGRAM, 'u_texture'), 0);
рдЕрдм рд╣рдо рдмрдирд╛рд╡рдЯ рд╕реЗ рд░рдВрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рддрд╕реНрд╡реАрд░ рдкреВрд░реЗ canvas
рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗред рдпрджрд┐ рдЫрд╡рд┐ рдФрд░ canvas
рдХрд╛ рд╕рдорд╛рди рдЕрдиреБрдкрд╛рдд рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рд░реНрдп рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо canvas
рдЖрдХрд╛рд░ рдХреЛ рд╢реЗрдбреНрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП):
GL.uniform1f(GL.getUniformLocation(PROGRAM, 'u_canvas_size'), Math.max(CANVAS.height, CANVAS.width));
рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЗрд╕рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ:
uniform sampler2D u_texture; uniform float u_canvas_size; void main() { gl_FragColor = texture2D(u_texture, gl_FragCoord.xy / u_canvas_size); }
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рдЪрд╛рдп рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреА рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдкреВрд░реА рддреИрдпрд╛рд░реА рдХреА рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред
рдкреНрд░рднрд╛рд╡
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ, рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдФрд░ рдкреНрд░рдпреЛрдЧ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдЕрдХреНрд╕рд░, рдЖрдк рдПрдХ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░ рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВред WebGL рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдордЭрджрд╛рд░ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд▓рд╛рднрджрд╛рдпрдХ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВ рдЬреЛ рдкреВрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдо рдХреЛрдб рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрдо рд╕рдорд╕реНрдпрд╛рдПрдВред рдФрд░ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдореЗрд╢рд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрдбреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрдзрд╛ рдХреЛрдб рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
рдЪрд▓реЛ рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рднрд╛рд╡ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдВрдЧреЗ рдХрд┐ рд╣рдо рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрдирд╛рд╡рдЯ рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд░рдВрдЧ рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдПрдХ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ - рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрднреА рднреА рдПрдирд┐рдореЗрдЯреЗрдб рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдПрдВрдЧреЗред рдЪрд▓реЛ рд╕рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
gl_FragColor = texture2D(u_texture, gl_FragCoord.xy / u_canvas_size + sin(u_time + gl_FragCoord.y))
рдкрд░рд┐рдгрд╛рдо рдЕрдЬреАрдм рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ:
gl_FragColor = texture2D(u_texture, gl_FragCoord.xy / u_canvas_size + sin(u_time + gl_FragCoord.y) / 250.0)
рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдереЛрдбрд╝реА рдЙрддреНрддреЗрдЬрдирд╛ рд╣реБрдИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд▓рд╣рд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд╛рдЗрди рддрд░реНрдХ - рд╕рдордиреНрд╡рдп рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:
gl_FragColor = texture2D(u_texture, gl_FragCoord.xy / u_canvas_size + sin(u_time + gl_FragCoord.y / 30.0) / 250.0)
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░рднрд╛рд╡ рдЕрдХреНрд╕рд░ рдЧреБрдгрд╛рдВрдХ рдХреЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдВрдЦ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рддреЛ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЦреНрдп рдмрд╛рдд рдХрдо рд╕реЗ рдХрдо рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдпрд╣ рд╕рдордЭрдирд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рд╕реВрддреНрд░ рдореЗрдВ рдпрд╣ рдпрд╛ рд╡рд╣ рдЧреБрдгрд╛рдВрдХ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЧреБрдгрд╛рдВрдХ рдЪрдпрдирд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдерд╛) рдФрд░ рд╕рд╛рд░реНрдердХ рдирд╛рдо рджреЗрдВред
рдХреБрдЯрд┐рд▓ рджрд░реНрдкрдг, рд╕рд╛рдЗрдХрд┐рд▓ рдФрд░ рдкреНрд░рдпреЛрдЧ
рд╕реЛрдЪ рдЕрдЪреНрдЫреА рд╣реИред рд╣рд╛рдВ, рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмрд╕ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред , .
, " ", . рдХреНрдпрд╛ рдХрд░реЗрдВ?
, , ? . , rand() - . , , , , . . . , . . . -, . . , , , . , "":
float rand(vec2 seed) { return fract(sin(dot(seed, vec2(12.9898,78.233))) * 43758.5453123); }
, , , NVIDIA ATI . , .
, , :
gl_FragColor = texture2D(u_texture, gl_FragCoord.xy / u_canvas_size + rand(gl_FragCoord.xy) / 100.0)
:
gl_FragColor = texture2D(u_texture, gl_FragCoord.xy / u_canvas_size + rand(gl_FragCoord.xy + vec2(sin(u_time))) / 250.0)
, , :
, . , , . тАФ . рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? . .
0 1, - . 5 тАФ . , .
vec2 texture_coord = gl_FragCoord.xy / u_canvas_size; gl_FragColor = texture2D(u_texture, texture_coord + rand(floor(texture_coord * 5.0) + vec2(sin(u_time))) / 100.0);
, - . - . , , . ?
, , , - . , . , .. -. , . . , , . .
sin
cos
, . . .
gl_FragColor = texture2D(u_texture, texture_coord + vec2( noise(texture_coord * 10.0 + sin(u_time + texture_coord.x * 5.0)) / 10.0, noise(texture_coord * 10.0 + cos(u_time + texture_coord.y * 5.0)) / 10.0));
. fract
. 1 1 тАФ :
float noise(vec2 position) { vec2 block_position = floor(position); float top_left_value = rand(block_position); float top_right_value = rand(block_position + vec2(1.0, 0.0)); float bottom_left_value = rand(block_position + vec2(0.0, 1.0)); float bottom_right_value = rand(block_position + vec2(1.0, 1.0)); vec2 computed_value = fract(position);
. WebGL smoothstep
, :
vec2 computed_value = smoothstep(0.0, 1.0, fract(position))
, . , X :
return computed_value.x;
тАж , , ...
- , , ... .
y тАФ , . ?
return length(computed_value);
.
. 0.5 тАФ .
return mix(top_left_value, top_right_value, computed_value.x) + (bottom_left_value - top_left_value) * computed_value.y * (1.0 - computed_value.x) + (bottom_right_value - top_right_value) * computed_value.x * computed_value.y - 0.5;
:
, , , .
, , . - .
uniform-, . 0 1, 0 тАФ , 1 тАФ .
uniform float u_intensity;
:
gl_FragColor = texture2D(u_texture, texture_coord + vec2(noise(texture_coord * 10.0 + sin(u_time + texture_coord.x * 5.0)) / 10.0, noise(texture_coord * 10.0 + cos(u_time + texture_coord.y * 5.0)) / 10.0) * u_intensity);
, .
( 0 1), .
, , , . тАФ requestAnimationFrame. , FPS.
, . uniform-.
document.addEventListener('mousemove', (e) => { let rect = CANVAS.getBoundingClientRect(); MOUSE_POSITION = [ e.clientX - rect.left, rect.height - (e.clientY - rect.top) ]; GL.uniform2fv(GL.getUniformLocation(PROGRAM, 'u_mouse_position'), MOUSE_POSITION); });
, . тАФ , .
void main() { vec2 texture_coord = gl_FragCoord.xy / u_canvas_size; vec2 direction = u_mouse_position / u_canvas_size - texture_coord; float dist = distance(gl_FragCoord.xy, u_mouse_position) / u_canvas_size; if (dist < 0.4) { gl_FragColor = texture2D(u_texture, texture_coord + u_intensity * direction * dist * 1.2 ); } else { gl_FragColor = texture2D(u_texture, texture_coord); } }
- . .
. , .
. Glitch- , SVG. . тАФ . ? тАФ , , , .
float random_value = rand(vec2(texture_coord.y, u_time)); if (random_value < 0.05) { gl_FragColor = texture2D(u_texture, vec2(texture_coord.x + random_value / 5.0, texture_coord.y)); } else { gl_FragColor = texture2D(u_texture, texture_coord); }
" ?" тАФ , . .
. тАФ , .
float random_value = rand(vec2(floor(texture_coord.y * 20.0), u_time));
. , :
gl_FragColor = texture2D(u_texture, vec2(texture_coord.x + random_value / 4.0, texture_coord.y)) + vec4(vec3(random_value), 1.0)
. тАФ . , тАФ .r
, .g
, .b
, .rg
, .rb
, .rgb
, .bgr
, ... .
:
float random_value = u_intensity * rand(vec2(floor(texture_coord.y * 20.0), u_time));
рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?
, , . , , тАФ .