DirectX 9 рднрд╛рдЧ II рдкрд░ рдХрдг рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╛рд╕

рдпрд╣ рдкреЛрд╕реНрдЯ DirectX 9 рдкрд░ рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рдФрд░ рдЕрдВрддрд┐рдо рднрд╛рдЧ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ ред

рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА: рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕, рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбреНрд╕, рдЗрдлреЗрдХреНрдЯреНрд╕, рдкреЛрд╕реНрдЯ-рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдмрд╛рдж рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП - рдмрдирд╛рд╡рдЯ рдореЗрдВ рд░реЗрдВрдбрд░ рдХреА рд╕реНрд╡реАрдХреГрддрд┐ред


0. рдореВрд▓ рдЬрд╛рдирдХрд╛рд░реА



рд╕реНрдкреНрд░рд╛рдЗрдЯ

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

рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдмрдЬрд╛рдп рдмрдирд╛рд╡рдЯ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдореЗрдВ рдЯреЗрдХреНрд╕рд▓реНрд╕ рд╣реИрдВред Direct3D рдХреНрд╖реИрддрд┐рдЬ U рдЕрдХреНрд╖ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ V рдЕрдХреНрд╖ рджреНрд╡рд╛рд░рд╛ рдЧрдард┐рдд рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбреНрд╕

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

рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбреНрд╕

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

рдкреНрд░рднрд╛рд╡ рдФрд░ рдкреЛрд╕реНрдЯ рдкреНрд░рднрд╛рд╡

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

1. рдХрдгреЛрдВ рдХрд╛ рдмрдирд╛рд╡рдЯ


рдХрдгреЛрдВ рдореЗрдВ рдмрдирд╛рд╡рдЯ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдмрдлрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛:
struct VertexData { float x,y,z; float u,v; //    }; 

рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рдорд╛рдиреЛрдВ рдХреЛ рдпреВ рдФрд░ рд╡реА рдХреЛ рд╢реВрдиреНрдп рдкрд░ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрдлрд░ рдмрдирд╛рддреЗ рд╕рдордп рдЭрдВрдбреЗ рдХреЛ рдмрджрд▓рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдмрдлрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг:
 device->CreateVertexBuffer(count*sizeof(VertexData), D3DUSAGE_WRITEONLY, D3DFVF_XYZ | D3DFVF_TEX0, D3DPOOL_DEFAULT, &pVertexObject, NULL); // ... D3DVERTEXELEMENT9 decl[] = { { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; 

рдзреНрд╡рдЬ рдХреЛ рдЬреЛрдбрд╝реЗрдВ D3DFVF_TEX0, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╢реАрд░реНрд╖ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдФрд░ рдЕрдм рдпрд╣ рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рд░реЗрдВрдбрд░ рд╕реНрдЯреЗрдЯреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:
 float pointSize = 5; //       device->SetRenderState(D3DRS_POINTSIZE_MAX, *((DWORD*)&pointSize)); device->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&pointSize)); device->SetRenderState(D3DRS_LIGHTING,FALSE); device->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE ); //     device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); device->SetRenderState(D3DRS_ZENABLE, FALSE); 


рдореИрдВ рд╕рднреА рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА MSDN рдкрд░ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

 IDirect3DTexture9 *particleTexture = NULL, D3DXCreateTextureFromFile(device, L"particle.png", &particleTexture); //  device->SetTexture(0, particleTexture); //  

рд╣рдо рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред

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

рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░рд┐рдгрд╛рдо:


2. рдкреНрд░рднрд╛рд╡



рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдлрдПрдХреНрд╕ рд╕рдВрдЧреАрддрдХрд╛рд░ рдирд╛рдордХ рдПрдирд╡реАрдЖрдИрдбреАрдЖрдИрдП рд╕реЗ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рд╢реЗрдбреНрд╕ рдХреЗ рд╕рдорд░реНрдерд┐рдд рдбрд┐рдмрдЧрд┐рдВрдЧ, 4 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╢реЗрдбреНрд╕, DIrect3D (9, 10) рдФрд░ рдУрдкрдирдЬреАрдПрд▓ред рдореИрдВ рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 float4x4 WorldViewProj; //  .  4x4 //   texture Base < string UIName = "Base Texture"; string ResourceType = "2D"; >; //,     sampler2D BaseTexture = sampler_state { Texture = <Base>; AddressU = Wrap; AddressV = Wrap; }; //,       struct VS_INPUT { float4 Position : POSITION0; float2 Tex : TEXCOORD0; }; //    struct VS_OUTPUT { float4 Position : POSITION0; float2 Tex : TEXCOORD0; }; //   VS_OUTPUT mainVS(VS_INPUT Input) { VS_OUTPUT Output; Output.Position = mul( Input.Position, WorldViewProj ); Output.Tex = Input.Tex; return( Output ); } //   float4 mainPS(float2 tex: TEXCOORD0) : COLOR { return tex2D(BaseTexture, tex); } //  "" technique technique0 { //   pass p0 { CullMode = None; //    //  VertexShader = compile vs_2_0 mainVS(); //   PixelShader = compile ps_2_0 mainPS(); //   } } 



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╢реЗрдбрд░ рдПрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рд╢реАрд░реНрд╖ shader рдХреЛ рд╢реАрд░реНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдИ рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рддрдХрдиреАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рднрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рднрд╛рд╡ рднреАред
рдкреНрд░рддреНрдпреЗрдХ рддрдХрдиреАрдХ рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдЖрдкрдХреЗ рд╕рд░рд▓ рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдХрдгреЛрдВ рдХреЛ рд░рдВрдЧ рджреЗрдЧрд╛:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 float4x4 WorldViewProj; //  .  4x4 //   () texture Base < string UIName = "Base Texture"; string ResourceType = "2D"; >; //,     sampler2D BaseTexture = sampler_state { Texture = <Base>; AddressU = Wrap; AddressV = Wrap; }; //,       struct VS_INPUT { float4 Position : POSITION0; float2 Tex : TEXCOORD0; }; //    struct VS_OUTPUT { float4 Position : POSITION0; float2 Tex : TEXCOORD0; }; //   VS_OUTPUT mainVS(VS_INPUT Input) { VS_OUTPUT Output; Output.Position = mul( Input.Position, WorldViewProj ); //       Output.Tex = Input.Tex; //       return( Output ); } //   float4 mainPS(float2 tex: TEXCOORD0) : COLOR { return tex2D(BaseTexture, tex) * float4(1.0, 0, 0, 1.0); //      } //  "" technique technique0 { //   pass p0 { CullMode = None; //    //  VertexShader = compile vs_2_0 mainVS(); //   PixelShader = compile ps_2_0 mainPS(); //   } } 



рдЗрд╕ рдЖрд╢рдп рдХрд╛ рдХреЛрдб рдЙрд╕ рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪрд╛ рдерд╛ред рд╣рдордиреЗ рдХреЗрд╡рд▓ рдорд▓реНрдЯреАрдкреНрд▓реА рдмреНрд▓реЗрдВрдб рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдореНрдорд┐рд╢реНрд░рдг рдЬреЛрдбрд╝рд╛ред рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:


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

рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдкреНрд░рднрд╛рд╡ рдХреЛрдб рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 float4x4 WorldViewProj; texture Base < string UIName = "Base Texture"; string ResourceType = "2D"; >; sampler2D BaseTexture = sampler_state { Texture = <Base>; AddressU = Wrap; AddressV = Wrap; }; texture Overlay < string UIName = "Overlay Texture"; string ResourceType = "2D"; >; sampler2D OverlayTexture = sampler_state { Texture = <Overlay>; AddressU = Wrap; AddressV = Wrap; }; // ,      texture PreRender : RENDERCOLORTARGET < string Format = "X8R8G8B8" ; >; //     sampler2D PreRenderSampler = sampler_state { Texture = <PreRender>; }; struct VS_INPUT { float4 Position : POSITION0; float2 Tex : TEXCOORD0; }; struct VS_OUTPUT { float4 Position : POSITION0; float2 Tex : TEXCOORD0; }; VS_OUTPUT cap_mainVS(VS_INPUT Input) { VS_OUTPUT Output; Output.Position = mul( Input.Position, WorldViewProj ); Output.Tex = Input.Tex; return( Output ); } float4 cap_mainPS(float2 tex: TEXCOORD0) : COLOR { return tex2D(BaseTexture, tex); } /////////////////////////////////////////////////////// struct Overlay_VS_INPUT { float4 Position : POSITION0; float2 Texture1 : TEXCOORD0; }; struct Overlay_VS_OUTPUT { float4 Position : POSITION0; float2 Texture1 : TEXCOORD0; float2 Texture2 : TEXCOORD1; }; vector blend(vector bottom, vector top) { //Linear light float r = (top.r < 0.5)? (bottom.r + 2*top.r - 1) : (bottom.r + top.r); float g = (top.g < 0.5)? (bottom.g + 2*top.g - 1) : (bottom.g + top.g); float b = (top.b < 0.5)? (bottom.b + 2*top.b - 1) : (bottom.b + top.b); return vector(r,g,b,bottom.a); } Overlay_VS_OUTPUT over_mainVS(Overlay_VS_INPUT Input) { Overlay_VS_OUTPUT Output; Output.Position = mul( Input.Position, WorldViewProj ); Output.Texture1 = Input.Texture1; Output.Texture2 = Output.Position.xy*float2(0.5,0.5) + float2(0.5,0.5); //   ,    return( Output ); } float4 over_mainPS(float2 tex :TEXCOORD0, float2 pos :TEXCOORD1) : COLOR { return blend(tex2D(OverlayTexture, pos), tex2D(PreRenderSampler, tex)); } technique technique0 { pass p0 { CullMode = None; VertexShader = compile vs_2_0 cap_mainVS(); PixelShader = compile ps_2_0 cap_mainPS(); } pass p1 { CullMode = None; VertexShader = compile vs_2_0 over_mainVS(); PixelShader = compile ps_2_0 over_mainPS(); } } 


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

рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рд╣рдордиреЗ рдЗрдлреЗрдХреНрдЯреНрд╕ рдмрдирд╛рдП, рдпрд╣ рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд╣рдореЗрдВ рдПрдХ рдкреНрд░рднрд╛рд╡ рдХреЛрдб рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдирд╛рд╡рдЯ рд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ рдПрдХ рдмрдирд╛рд╡рдЯ рднреА рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 ID3DXBuffer* errorBuffer = 0; D3DXCreateEffectFromFile( //     device, L"effect.fx", NULL, NULL, D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, //   DirectX 9 NULL, &effect, &errorBuffer ); if( errorBuffer ) // ,    { MessageBoxA(hMainWnd, (char*)errorBuffer->GetBufferPointer(), 0, 0); errorBuffer->Release(); terminate(); } //  ,     WorldViewProj //       D3DXMATRIX W, V, P, Result; D3DXMatrixIdentity(&Result); device->GetTransform(D3DTS_WORLD, &W); device->GetTransform(D3DTS_VIEW, &V); device->GetTransform(D3DTS_PROJECTION, &P); D3DXMatrixMultiply(&Result, &W, &V); D3DXMatrixMultiply(&Result, &Result, &P); effect->SetMatrix(effect->GetParameterByName(0, "WorldViewProj"), &Result); //     effect->SetTechnique( effect->GetTechnique(0) ); IDirect3DTexture9 *renderTexture = NULL, *overlayTexture = NULL; //        IDirect3DSurface9* orig =NULL , *renderTarget = NULL; D3DXCreateTextureFromFile(device, L"overlay.png", &overlayTexture); //  ,      D3DXCreateTexture(device, Width, Height, 0, D3DUSAGE_RENDERTARGET, D3DFMT_X8B8G8R8, D3DPOOL_DEFAULT, &renderTexture); //  ,     renderTexture->GetSurfaceLevel(0, &renderTarget); //    device->GetRenderTarget(0, &orig); //    auto hr = effect->SetTexture( effect->GetParameterByName(NULL, "Overlay"), overlayTexture); hr |= effect->SetTexture( effect->GetParameterByName(NULL, "Base"), particleTexture); hr |= effect->SetTexture( effect->GetParameterByName(NULL, "PreRender"), renderTexture); if(hr != 0) { MessageBox(hMainWnd, L"Unable to set effect textures.", L"", MB_ICONHAND); } 



рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрдХрдиреАрдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдмрдирд╛рд╡рдЯ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдмрдирд╛рд╡рдЯ, рдореВрд▓ рджреГрд╢реНрдп рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рддрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рд╡рдЯ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 UINT passes = 0; //       effect->Begin(&passes, 0); for(UINT i=0; i<passes; ++i) { effect->BeginPass(i); if(i == 0) { //    device->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); //  ,    ,     device->SetRenderTarget(0, renderTarget); //  ,      device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); //   DrawParticles(); } else if(i == 1) { //    device->SetRenderTarget(0, orig); //  ,      (RenderTexture) DrawRect(); } effect->EndPass(); } effect->End(); //     device->Present(NULL, NULL, NULL, NULL); 



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

рдкреНрд░рднрд╛рд╡ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╣рдо рд╢реБрд░реБрдЖрдд () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдкрд╛рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд╕ рд╕реЗ рдкрд╣рд▓реЗ, BeginPass (i) , рдФрд░ EndPass () рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдВрдб () рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рдЖрдк рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдзреНрдпрд╛рди рджреЗрдВ, рд╕рдВрдХрд▓рд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ VisualC ++ Redistributable 2012 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рдпреБрдкреАрдбреА
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдбреА 3 рдбреА 9 рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдпрд╛ рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдЧрдгрдирд╛ рдЬреАрдкреАрдпреВ рдкрд░ рдХреА рдЬрд╛рдП - рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдХреЗрд╡рд▓ рдбреА 3 рдбреА 10 рдкрд░ред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, GitHub рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдбреЗрдореЛ рдЙрдкрд▓рдмреНрдз рд╣реИ ред GPU рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рд╕рдВрд▓рдЧреНрди рд╣реИрдВ :)

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


All Articles