рдУрдкрди рдЗрдВрдЯрд░реЛрдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд

рд╕рднреА рдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рдкрд╛рдардХ рдореЗрдВ рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдореЗрд░реА рддрд╕реНрд╡реАрд░ рдЖрдкрдХреЛ рдбрд░рд╛ рдирд╣реАрдВ рдкрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдЖрдЬ, рдореИрдВ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдкрд╛рд▓рддреВ-рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд╕рд╛рде рд╕реАрдпреВрдбреАрдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдирд╛рдо CUDA рдФрд░ OpenGL рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рддрд╣рдд рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдпрд╣рд╛рдБ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

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

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

рдЬрдм рдЖрдк рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
  1. рдмрдлрд░ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреАрдПрд▓рдИрдбрдмреНрд▓реНрдпреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдлрд┐рд░ рдЗрд╕рдХреЗ рд╣реЗрдбрд░ рдХреЛ рдлреНрд░реАрдЧреНрд▓реВрдЯ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ рдХреЗ рдКрдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
    #include <GL/glew.h> #include <GL/freeglut.h> ... #include <cuda_gl_interop.h> 
    рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЧрд╛ред
  2. рдЬрдм рд╕рдВрд╕рд╛рдзрди рдФрд░ CUDA рд╡реАрдбрд┐рдпреЛ рдмрдлрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдЧрд▓рддреА рдХреЛрдб рдХреЗ рдмреАрдЪ рдореЗрдВ рдХрд╣реАрдВ рдЙрдиреНрд╣реЗрдВ рдЫреАрд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕реЛрдЪ рдХрд░ рдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╣реИрд░рд╛рди рдерд╛, рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдорд┐рд▓рддреА рд╣реИ:
     GLuint vbo; struct cudaGraphicsResource *cuda_vbo_resource; 
  3. рдЕрдм рд╣рдо CUDA рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдо рдмрдлрд░ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЗрди рдЪрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
     void createVBO(GLuint *vbo, struct cudaGraphicsResource **vbo_res, unsigned int vbo_res_flags) { unsigned int size = width * height * sizeof(uchar4); glGenBuffers(1, vbo); glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, *vbo); glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW); HANDLE_ERROR( cudaGraphicsGLRegisterBuffer(vbo_res, *vbo, vbo_res_flags) ); } void deleteVBO(GLuint *vbo, struct cudaGraphicsResource *vbo_res) { HANDLE_ERROR( cudaGraphicsUnregisterResource(cuda_vbo_resource) ); glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, *vbo); glDeleteBuffers(1, vbo); *vbo = 0; } 
    рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдж рдореЗрдВ, рдХреЛрдб рдореЗрдВ, рдЖрдк рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдмрдлрд░ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ OpenGL рдореЗрдВ рдмрд╣реБрдд рдкрд╛рд░рдВрдЧрдд рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рд╕рдордЭ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдХреНрд╕рд░ рд╕реНрдерд╛рдкрдирд╛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ glBindBuffer рдХреЛ рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ 1 рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рд╛рдл рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
  4. рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ CUDA рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдФрд░ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдмрдлрд░ рд▓рд┐рдВрдХ рдХрд░реЗрдВ):
     HANDLE_ERROR( cudaGLSetGLDevice(deviceId) ); ... createVBO(&vbo, &cuda_vbo_resource, cudaGraphicsMapFlagsWriteDiscard); ... deleteVBO(&vbo, cuda_vbo_resource); 
рд╕рдм рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИ! рдЕрдм рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдлреНрд░реЗрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛрдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдмрд╕ рдЗрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╣реИред рдпрд╣ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдмрдлрд░ рдореЗрдВ рддреБрд░рдВрдд рдлреНрд░реЗрдо рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред
 void idle(void) { uchar4* dev_screen; size_t size; HANDLE_ERROR( cudaGraphicsMapResources(1, &cuda_vbo_resource, 0) ); HANDLE_ERROR( cudaGraphicsResourceGetMappedPointer((void**) &dev_screen, &size, cuda_vbo_resource) ); // Render Image renderFrame<<<blocks, threads>>>(dev_screen); HANDLE_ERROR( cudaDeviceSynchronize() ); HANDLE_ERROR( cudaGraphicsUnmapResources(1, &cuda_vbo_resource, 0) ); glutPostRedisplay(); } 
ps рдХреЛрдб рд╕реЗ, рдореИрдВрдиреЗ рдлреНрд░реЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЗрдбрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рднрд╛рдЧ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ред
рдбреНрд░реЙ рдлрд╝рдВрдХреНрд╢рди рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рдлреНрд░реАрдЧреНрд▓рдЯ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╛ glutPostRedisplay рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 void draw(void) { glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0); glutSwapBuffers(); } 
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЫрд╡рд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдПрдХ рд╕рд░рдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░реЗрдо рдмрдлрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдУрдкрдирдЬреАрдПрд▓ рдХреЛ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

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

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


All Articles