WebGLU: WebGL рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ 3 рдбреА рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реБрдЖ рдХрд░рддреА рдереАред рдЙрдиреНрд╣реЛрдВрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рддреНрд░рд┐-рдЖрдпрд╛рдореА рдЧрддрд┐рд╢реАрд▓ рддреАрди-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛: SVG рдореЗрдВ рдЫрджреНрдо-3D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛, рдлреНрд▓реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ... рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреНрд░рдЧрддрд┐ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ OpenGL (OpenGL ES) рдХреЗ рд╣рд▓реНрдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд▓рдЧреЗ 2.0) - рд╡реЗрдмрдЬреАрдПрд▓ред рдпрд╣ рдПрдХ рдпреБрд╡рд╛ рддрдХрдиреАрдХ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЧреЗрдо рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЗрд╕рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рддреБрд▓рдирд╛рддреНрдордХ рдпреБрд╡рд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдореИрдиреБрдЕрд▓ рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ( рдпрд╣рд╛рдВ - рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж)ред рдпрд╣рд╛рдВ рдЖрдк рд╡реЗрдмрдЬреАрдПрд▓ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдУрдкрдирдЬреАрдПрд▓ рдФрд░ рд╡реЗрдмрдЬреАрдПрд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрдиреБрд╕реНрдорд╛рд░рдХред рдЪреВрдВрдХрд┐ WebGL GLES рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрдХрдиреАрдХ OpenGL рд╕реЗ рдХрд╛рдлреА рдиреАрдЪ рд╣реИ: рдЗрд╕рдореЗрдВ рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (ARB, рдЖрджрд┐) рдирд╣реАрдВ рд╣реИрдВ, рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд╢ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ GL_QUADS рднреА рдЗрд╕рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ ... рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рддрдХрдиреАрдХ рдирд╣реАрдВ, рдРрд╕рд╛ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдкреНрд▓рдЧ рдЗрди рдХреЗ рдмрд┐рдирд╛ рд╡реЗрдм рдкрд░ 3 рдбреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

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

рдЗрд╕рд▓рд┐рдП, WebGLU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ webglu.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

<script type="text/javascript" src="./src/webglu.js"></script> тАж $W.initialize(); 

$ W WebGLU рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИред рд╣рдо рдЙрд╕рдХреЗ рд╕рд╛рде рдЬреНрдпрд╛рджрд╛рддрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡рд╕реНрддреБ $ G (GameGLU рдирд╛рдо рд╕реНрдерд╛рди) рд╣реИ, рдЬреЛ рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред WebGLU рдореЗрдВ рдХреБрдЫ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рднреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CrazyGLU - рдкрд╕рдВрдж рдФрд░ рдХреБрдЫ рднреМрддрд┐рдХреА рдХреЗ рдЫрджреНрдо рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдЬрдм рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЗрдВ WebGLU рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, useControlProfiles(); рдлрд╝рдВрдХреНрд╢рди useControlProfiles(); ControlProfiles.js рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╡реЗрдмрдЧреНрд▓реВ .js рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

WebGLU рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреГрд╢реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, WebGLU рдЗрдВрдЯрд░рдлрд╝реЗрд╕ $W.Object(type, flags) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ (OpenGL рдХреЗ рд░реВрдк рдореЗрдВ) рд╣реИ:


рдЭрдВрдбреЗ - рд╡реИрдХрд▓реНрдкрд┐рдХ рдЭрдВрдбреЗ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡реЗ $W.RENDERABLE | $W.PICKABLE $W.RENDERABLE | $W.PICKABLE , рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рд╣рдо рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдПрдХ рдмрдЪреНрдЪрд╛ рд╣реИ, рддреЛ $W.PICKABLE рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ $W.PICKABLE рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╢реЗрдбрд░ (рдЬреЛ рд╣рдо рдЖрдЧреЗ рдХрд░реЗрдВрдЧреЗ) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдВрдЧ рд╕рдордиреНрд╡рдп рдЕрдХреНрд╖ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗ:

 var originLines = new $W.Object($W.GL.LINES); originLines.vertexCount = 6; originLines.fillArray("vertex", [[0,0,0], [3,0,0], [0,0,0], [0,3,0], [0,0,0], [0,0,3]]); with ($W.constants.colors){ originLines.fillArray("color", [ RED, RED, GREEN, GREEN, BLUE, BLUE]); } 

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

рдЕрдиреБрд░реВрдк (рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░), рд╢реЗрдбреНрд╕ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░ рдирд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВ (рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╛рд▓реЗ рдЪрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ attribute )ред

WebGL рд╕реЗ рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ Material рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реНрдХ JSON shader рд╡рд┐рд╡рд░рдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рддрд╛рд░ рдЗрд╕ рддрд░рд╣ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ:

 var lights = new $W.Material({path:$W.paths.materials + "light.json"}); 

Light.json рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

 { name: "light", program: { name: "light", shaders: [ {name:"light_vs", path:$W.paths.shaders+"light.vert"}, {name:"light_fs", path:$W.paths.shaders+"light.frag"} ] } } 

рдпрд╣рд╛рдБ рдирд╛рдо "рд╕рд╛рдордЧреНрд░реА" рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рд╣реИ; рдХрд╛рд░реНрдпрдХреНрд░рдо тЖТ рдирд╛рдо - рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд╛рдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ (рд╢рд╛рдпрдж WebGL рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рдХрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ); shaders - рдЙрдирдХреЗ рд▓рд┐рдП рдкрде рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде shaders рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЪрд░ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП uniform ( uniform рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде setUniformAction(n, f) , setUniformAction(n, f) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ setUniformAction(n, f) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд░реНрде рд╣реИрдВ: n - рдЫрд╛рдпрд╛ рдореЗрдВ рдЪрд░ рдХрд╛ рдирд╛рдо (рдпрд╣ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ); f рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ function(u, o, m) , рдЬрд╣рд╛рдБ u рдПрдХрд░реВрдк () рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, o рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реА рд╣реИ, m is the рдордЯреАрд░рд┐рдпрд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБ рдХреЗ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП "рд░рдВрдЧ" рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдмрдВрдзрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 lights.setUniformAction('color', function(uniform, object, material){ $W.GL.uniform4fv(uniform.location, object.color); }); 


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

WebGLU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдЗрдП рдЗрд╕ рджреГрд╢реНрдп рдХреЛ рдмрдирд╛рдПрдВ:



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

рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рд╕рднреА рд▓рдВрдмреЛрдВ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ "рдЗрд▓реНрдпреВрдорд┐рдиреЗрдЯрд░" рд╢реЗрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рдо genSphere(n1,n2,rad) рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ genSphere(n1,n2,rad) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреЛрд▓реЗ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕рд┐рд▓реЗрдВрдбрд░ рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕рд┐рд▓реЗрдВрдбрд░ рдХреА рд╕рд╛рдЗрдб рд╕рддрд╣ рдХреЛ рдЬреБрдбрд╝реЗ рд╣реБрдП рддреНрд░рд┐рдХреЛрдгреЛрдВ рд╕реЗ рднрд░рдирд╛ рд╣реИ:

 function drawCylinder(R, H, n, flags){ var v = [], norm = []; var C = new $W.Object($W.GL.TRIANGLE_STRIP, flags); C.vertexCount = n * 2+2; for(var i = -1; i < n; i++){ var a = _2PI/n*i; var cc = Math.cos(a), ss = Math.sin(a); v = v.concat([R*cc, R*ss,0.]); v = v.concat([R*cc, R*ss,H]); norm = norm.concat([-cc, -ss, 0.]); norm = norm.concat([-cc, -ss, 0.]); } C.fillArray("vertex", v); C.fillArray("normal", norm); return C; } 

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

рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордВрдбрд▓рд┐рдпрд╛рдВ рдмрдирд╛рдПрдВрдЧреЗ

 function drawCircle(R, n, w, flags){ var v = []; var C = new $W.Object($W.GL.LINE_LOOP, flags); C.vertexCount = n; for(var i = 0; i < n; i++){ var a = _2PI/n*i; v = v.concat([R*Math.cos(a), R*Math.sin(a),0.]); } C.fillArray("vertex", v); if(typeof(w) != "undefined") C.WD = w; else C.WD = 1.; C.draw = function(){ //       var oldw = $W.GL.getParameter($W.GL.LINE_WIDTH); $W.GL.lineWidth(this.WD); this.drawAt( this.animatedPosition().elements, this.animatedRotation().matrix(), this.animatedScale().elements ); $W.GL.lineWidth(oldw); }; return C; } 

рд▓рд╛рдЗрдиреЛрдВ рдХреА рдореЛрдЯрд╛рдИ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рд▓рдХреЛрдВ рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ draw() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди $W.GL.lineWidth(w) рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЗрди рдХреА рдореЛрдЯрд╛рдИ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ - рдЬрдм рддрдХ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЕрдЧрд▓реА рдХреЙрд▓ рдирд╣реАрдВ рд╣реЛрддреА)ред рдпрджрд┐ рдЖрдк $W.GL.LINE_LOOP рдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП $W.GL.POINTS , рддреЛ рдордВрдбрд▓рд┐рдпреЛрдВ рдХреЛ рдбреЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдВрдХ рдХрд╛ рдЖрдХрд╛рд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА WD рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП "рд╕рд╛рдордЧреНрд░реА" рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
  gl_PointSize = WD; 
рдпрд╣рд╛рдВ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреБрдХрдбрд╝рд╛ shader рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ - рд╢реАрд░реНрд╖ shaderред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдб рдмрдирд╛рдиреЗ рдХреА рдмрд╛рд░реА рдереАред рдХрдИ рд╕реНрд░реЛрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрд┐рд╕реА рд╢реАрд░реНрд╖ рдХреЗ рдЕрдВрддрд┐рдо рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА OpenGL рд╣реИрдВрдбрдмреБрдХ рдореЗрдВ, рдЖрдк рдирд┐рдореНрди рд╕реВрддреНрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  result_Color = mat_emission + lmodel_ambient * mat_ambient Sum_i(D * S * [l_ambient * mat_ambient + max{dot(L,n),0}*l_diffuse*mat_diffuse + max{dot(s,n),0}^mat_shininess * l_specular * mat_specular ) 

рдпрд╣рд╛рдВ

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

рдЕрдм рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ "рдЯреЙрд░реНрдЪ" рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

  light = { position: [0.,2.,1.5], target: [0.,0.,-2.], color: [1.,.5,0.,1.], fieldAngle: 60., exponent: 5., distanceFalloffRatio: .02 }; 

setUniformAction(тАж) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ setUniformAction(тАж) "рд▓рд╛рд▓рдЯреЗрди" рдЧреБрдгреЛрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХреЛ shader рдЪрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдХрд░реЗрдВ рдФрд░ рдЗрд╕ "рд╕рд╛рдордЧреНрд░реА" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдг рд╕реЗрдЯ рдХрд░реЗрдВред

рд╣рдо рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, $W.start(T); рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рдХреЛ рдЪреЗрддрди рдХрд░рддреЗ рд╣реИрдВ $W.start(T); рдЬрд╣рд╛рдВ T рджреГрд╢реНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдиреНрдпреВрдирддрдо рдЕрдВрддрд░рд╛рд▓ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рд╣рдореЗрдВ $W.util.defaultUpdate(); рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ $W.util.defaultUpdate(); рдФрд░ $W.util.defaultDraw(); ред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд╢реЗрдбреНрд╕ рдХреЗ рд╕рдВрдХрд▓рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдЦреБрдж рд╣реА рд╢реЗрдбреНрд╕ рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реБрдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп рдХреЗрд╡рд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рдордп (рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди) "рдлреНрд░реАрдЬ" рдХрд░реЗрдЧрд╛, рдФрд░ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рднреА рд╣реЛрдЧрд╛ред

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



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





UPD: рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ getObjectIDAt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдкрд╛рдЧрд▓реЛрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ рдкреНрд░рдпрд╛рд╕ рдЕрд╕рдлрд▓ рд░рд╣реЗ: рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

рддреЛ, рдЪрдпрди рдмрдлрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо $W.start(p) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЪрдпрди рдмрдлрд░ рдкрд░ рд▓рд┐рдЦрддреЗ рд╕рдордп рдПрдХ рдЯрд╛рдЗрдорд░ рдЫрд╡рд┐ рдЕрдкрдбреЗрдЯ рдХреЗ "рд░рдирд┐рдВрдЧ рдЗрди" рдХрд╛ рдЬреЛрдЦрд┐рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдЗрд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рджреГрд╢реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреВрд╕рд░реЗ, рд╣рдореЗрдВ рдЪрдпрди рдмрдлрд░ рдХреЗ рд▓рд┐рдП "рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА" ( MatPick ) рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдмрдлрд░ рдХреЛ рднреА рдЖрд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  //  ""    MatPick = new $W.Material({path:$W.paths.materials + "pick.json"}); MatPick.setUniformAction('pickColor', function(uniform, object, material){ var colr = [0.,0.,0.,0.]; var id = object.id; for(var i = 0; i < 4; i++){ colr[i] = (id & 0xff)/256.; id >>= 8; } $W.GL.uniform4fv(uniform.location, colr); } ); //    try{ $W.pickBuffer = new $W.Framebuffer(); $W.pickBuffer.attachTexture($W.GL.RGBA, $W.canvas.width, $W.canvas.height, $W.GL.COLOR_ATTACHMENT0); $W.pickBuffer.attachRenderbuffer($W.GL.DEPTH_COMPONENT16, $W.canvas.width, $W.canvas.height, $W.GL.DEPTH_ATTACHMENT); }catch (e) { console.error(e); } 


рд╣рдо рдорд╛рдирдХ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рддреЗ рд╣реИрдВ: рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ (рдПрдХ 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ, рдЕрдзрд┐рдорд╛рдирддрдГ рд╕рдХрд╛рд░рд╛рддреНрдордХ, рдирдХрд╛рд░рд╛рддреНрдордХ, рд▓реЗрдХрд┐рди -1 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ) рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ - рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд░рдВрдЧ рдШрдЯрдХред рдлреНрд▓реЛрдЯ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд░рд╛рдЙрдВрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдЬрдм рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ ┬▒ 1 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЪрдпрди рдмрдлрд╝рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрд╕ рдЗрддрдиреЗ рд╕рд░рд▓ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рднреА рдирд╣реАрдВ рджрд┐рдпрд╛ред

рддреАрд╕рд░рд╛, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдХреЛрдб (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рд╕рд╛рде рд╣реА Util.js (рд╕реНрдХреНрд░реАрди рдкрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбреНрд░рд╛рдЗрдВрдЧ рдмрдлрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛) рдХреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЪрдпрди рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЪрдпрди рдмрдлрд░ рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рд░рдВрдЧ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдирдХреА "рд╕рд╛рдордЧреНрд░реА" рдХреЛ oldmat рд╕рд░рдгреА рдореЗрдВ oldmat , рдФрд░ рдЬрдм рдЪрдпрди рдмрдлрд░ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рднреА "рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ" рдХреЛ рд╣рдорд╛рд░реЗ MatPick рдмрджрд▓ MatPick , рдмрдлрд░ рднрд░реЗрдВ рдФрд░ рд╕рд╣реА рдмрд┐рдВрджреБ рдкрд░ рд░рдВрдЧ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рдВрдЧ рдореВрд▓реНрдп рд╕реЗ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐, рдЕрдЧрд░ рдЖрдИрдбреА == - 1) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 function pick(X,Y){ //  var ccolr = $W.GL.getParameter($W.GL.COLOR_CLEAR_VALUE); var blend = $W.GL.getParameter($W.GL.BLEND); if(blend) $W.GL.disable($W.GL.BLEND); $W.GL.clearColor(1., 1., 1., 1.); //    "-1" $W.pickBuffer.bind(); //  ""  $W.util.defaultUpdate(); $W.util.clear(); $W.util.setupMatrices(); for (var i = 0; i < $W.objects.length; i++) { $W.objects[i].material = MatPick; //  "" } $W.util.defaultDraw(); //   for (var i = 0; i < $W.objects.length; i++) { $W.objects[i].material = oldmat[i]; //  "" } var pix = new Uint8Array(4); $W.GL.readPixels(X,$W.canvas.height-Y,1,1,$W.GL.RGBA, $W.GL.UNSIGNED_BYTE, pix); $W.pickBuffer.unbind(); //   if(blend) $W.GL.enable($W.GL.BLEND); $W.GL.clearColor(ccolr[0],ccolr[1],ccolr[2],ccolr[3]); var id = pix[0]+(pix[1]<<8)+(pix[2]<<16)+(pix[3]<<24); delete pix; var str = "X=" + X + ", Y=" + Y+ ", ID="+id; alert(str); } </code> <br><br>   :           . <br><br> :  google-chrome     (     ). 

Source: https://habr.com/ru/post/In143680/


All Articles