{"id":286268,"date":"2017-05-13T02:05:03","date_gmt":"2017-05-12T22:05:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286268"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2017-05-12T22:05:03","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286268","title":{"rendered":"\u041e\u0431\u0437\u043e\u0440 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake 2"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/shadow_issue_zoom.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041e\u043a\u043e\u043b\u043e \u043c\u0435\u0441\u044f\u0446\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f \u0443\u0434\u0435\u043b\u0438\u043b \u0447\u0442\u0435\u043d\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake II. \u042d\u0442\u043e \u0431\u044b\u043b \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0434\u0432\u0438\u0436\u043e\u043a idTech3 \u0432\u043d\u0435\u0441\u0435\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435: Quake 1, Quake World \u0438 QuakeGL \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u0434\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0431\u044b\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f C \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430.<\/p>\n<p>  Quake II \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u0435\u0441\u0442\u044f\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 (\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439) \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u0440\u0435\u043c\u0451\u043d. \u041d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0431\u043e\u043b\u0435\u0435 30 \u0438\u0433\u0440. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u043d \u043e\u0437\u043d\u0430\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439\/8-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0446\u0432\u0435\u0442\u043e\u0432 \u043a \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439\/24-\u0431\u0438\u0442\u043d\u043e\u0439. \u042d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 1997 \u0433\u043e\u0434\u0443.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043b\u044e\u0431\u0438\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0432\u0438\u0436\u043e\u043a. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u044f \u0432\u0451\u043b \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043c\u0435\u0442\u043e\u043a, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u0441\u0442\u0438\u043b \u0438\u0445 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.<\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u00ab\u043f\u043e\u0434\u0447\u0438\u0441\u0442\u043a\u0438\u00bb \u043c\u0435\u043d\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u043b\u0451\u043a: \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u0435\u0435 40 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0432\u0438\u0434\u0435\u043e, \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0438 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043d\u0435 \u0437\u043d\u0430\u044e, \u0441\u0442\u043e\u0438\u043b\u0438 \u043b\u0438 \u043c\u043e\u0438 \u0442\u0440\u0443\u0434\u044b \u0442\u043e\u0433\u043e, \u0438 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 ASCII, \u0432\u044b\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u0451 \u043c\u043d\u0435\u043d\u0438\u0435.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f<\/h3>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"ftp:\/\/ftp.idsoftware.com\/idstuff\/source\/quake2.zip\">ftp-\u0441\u0430\u0439\u0442\u0435<\/a> id Software. \u041f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 Visual Studio Express 2008, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 Microsoft.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fb2\/601\/da4\/fb2601da4cd59d0598e116907210191d.png\"\/><\/p>\n<p>  \u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0432 Visual Studio 6 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0435 \u043e\u0434\u0438\u043d, \u0430 \u043f\u044f\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e Quake2 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u043c (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435). \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:  <\/p>\n<table>\n<tbody>\n<tr>\n<td align=\"center\"><b>\u041f\u0440\u043e\u0435\u043a\u0442\u044b<\/b><\/td>\n<td align=\"center\"><b>\u0421\u0431\u043e\u0440\u043a\u0438<\/b><\/td>\n<\/tr>\n<tr>\n<td align=\"center\">ctf<\/td>\n<td align=\"center\">gamex86.dll<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">game<\/td>\n<td align=\"center\">gamex86.dll<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">quake2<\/td>\n<td align=\"center\">quake.exe<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">ref_soft<\/td>\n<td align=\"center\">ref_soft.dll<\/td>\n<\/tr>\n<tr>\n<td align=\"center\">ref_gl<\/td>\n<td align=\"center\">ref_gl.dll<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u00abctf\u00bb \u0438 \u00abgame\u00bb \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 2:<\/b><\/u> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 DirectX:<\/p>\n<pre><code class=\"cpp\">fatal error C1083: Cannot open include file: 'dsound.h': No such file or directory<\/code><\/pre>\n<p>  \u042f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b Direct3D SDK \u0438 Microsoft SDK (\u0434\u043b\u044f MFC), \u0438 \u0432\u0441\u0451 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>  <u><b>\u042d\u0440\u043e\u0437\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f:<\/b><\/u> \u043f\u043e\u0445\u043e\u0436\u0435, \u0442\u043e, \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u043a\u043e\u0434\u0430 Quake, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u0441 Quake 2: \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0432 Visual Studio 2010. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c VS 2008.<\/p>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430<\/p>\n<p>  <code>&quot;Couldn't fall back to software refresh!&quot;<\/code>,<\/p>\n<p>  \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c DLL \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430. \u041d\u043e \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c:<\/p>\n<p>  \u044f\u0434\u0440\u043e Quake2 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0434\u0432\u0435 \u0441\u0432\u043e\u0438\u0445 DLL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e win32 API: LoadLibrary. \u0415\u0441\u043b\u0438 DLL \u043d\u0435 \u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0438\u043b\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 DLL, \u0442\u043e \u0441\u0431\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437 \u043f\u043e\u043a\u0430\u0437\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<ul>\n<li>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0432\u0441\u0435 \u043f\u044f\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u2014 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 -&gt; properties -&gt; C\/C++: \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u00abruntime library\u00bb = Multi-threaded Debug DLL (\u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u00abDebug\u00bb, \u0438\u043d\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 release).<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044e quake2, \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e id Software, \u0442\u043e \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043c\u043e\u044e \u0432\u0435\u0440\u0441\u0438\u044e: \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0434\u0432\u0438\u0436\u043e\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0432 PNG, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c libpng \u0438 libz (\u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435). \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Debug DLL. \u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c DLL libpng \u0438 zlib \u0432 \u043e\u0434\u043d\u0443 \u043f\u0430\u043f\u043a\u0443 \u0441 quake2.exe.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Quake2<\/h3>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f \u0447\u0438\u0442\u0430\u043b \u043a\u043e\u0434 Quake 1, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b <a href=\"http:\/\/fabiensanglard.net\/quakeSource\/index.php\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> (\u0435\u0451 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/habrahabr.ru\/post\/324804\/\">\u0437\u0434\u0435\u0441\u044c<\/a>) \u043d\u0430 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438: \u00ab\u0421\u0435\u0442\u044c\u00bb, \u00ab\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00bb \u0438 \u00ab\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u044b\u043b \u0431\u044b \u0443\u043c\u0435\u0441\u0442\u0435\u043d \u0438 \u0434\u043b\u044f Quake 2, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u043e\u0435\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0449\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:  <\/p>\n<table>\n<tr>\n<td><b>\u0422\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/b><\/td>\n<td><b>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/b><\/td>\n<\/tr>\n<tr>\n<td>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a (.exe)<\/td>\n<td>\u042f\u0434\u0440\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0435 \u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u043e\u0431\u043c\u0435\u043d \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 <code>quake2<\/code>.<\/td>\n<\/tr>\n<tr>\n<td>\u041c\u043e\u0434\u0443\u043b\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 (.dll)<\/td>\n<td>\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 (<code>ref_soft<\/code>) \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 OpenGL (<code>ref_gl<\/code>).<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c (.dll)<\/td>\n<td>\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (\u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0433\u0440\u044b, \u043e\u0440\u0443\u0436\u0438\u0435, \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432&#8230;). \u0412 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c (<code>game<\/code>) \u0438 \u043c\u043e\u0434\u0443\u043b\u044c Capture The Flag (<code>ctf<\/code>).<\/td>\n<\/tr>\n<\/table>\n<p>Quake2 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <code>win32\/sys_win.c<\/code>. \u041c\u0435\u0442\u043e\u0434 <code>WinMain<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<pre><code class=\"cpp\">  game_export_t   *ge;\t\/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 dll \u0438\u0433\u0440\u044b   refexport_t      re;  \/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 dll \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430    WinMain()\t\/\/\u0418\u0437 quake2.exe   { \t           Qcommon_Init (argc, argv); \t         while(1)         {             Qcommon_Frame             {                 SV_Frame()  \/\/ \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434                 {                     \/\/\u0412 \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430                     if (!svs.initialized)                         return;                                             \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 game.dll \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438                     ge-&gt;RunFrame();                 }             \t                 CL_Frame()  \/\/ \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043e\u0434                 {                     \/\/ \u0415\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442                     if (dedicated-&gt;value)                         return;                                                 \/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a renderer.dll \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438                     re.BeginFrame();                     \/\/[...]                     re.EndFrame();                 }\t             \t             }         }   }<\/code><\/pre>\n<p>  \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043c\u043e\u0438\u0445 <a href=\"http:\/\/fabiensanglard.net\/quake2\/notes.html\">\u0437\u0430\u043c\u0435\u0442\u043a\u0430\u0445.<\/a><\/p>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u00ab\u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435?\u00bb. \u0414\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Quake \u0441 1996 \u043f\u043e 1997 \u0433\u043e\u0434:<\/p>\n<ul>\n<li>Quake.<\/li>\n<li>WinQuake.<\/li>\n<li>GLQuake.<\/li>\n<li>VQuake. (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0421\u0442\u0435\u0444\u0430\u043d\u0430 \u041f\u043e\u0434\u0435\u043b\u043b\u0430 (Stefan Podell) \u043e <a href=\"http:\/\/groups.google.com\/group\/comp.sys.ibm.pc.hardware.video\/msg\/4d9ce71f1e1f6484\">\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 V2200 \u0432 Z-\u0431\u0443\u0444\u0435\u0440\u0438\u043d\u0433\u0435<\/a> (<a href=\"http:\/\/fabiensanglard.net\/quake2\/quake-v2x00_discussion.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>)).<\/li>\n<li>Quake World Server.<\/li>\n<li>Quake World Client.<\/li>\n<\/ul>\n<p>  \u0411\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0444\u043e\u0440\u043a\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 <code>#ifdef<\/code>. \u042d\u0442\u043e \u0431\u044b\u043b \u043f\u043e\u043b\u043d\u044b\u0439 \u0445\u0430\u043e\u0441, \u0438 \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e:<\/p>\n<ul>\n<li>\u0423\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\/\u0441\u0435\u0440\u0432\u0435\u0440.<\/li>\n<li>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u044f\u0434\u0440\u043e, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438.<\/li>\n<\/ul>\n<p>  \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/57c\/55a\/008\/57c55a0085d2977ff4ad0efacac2966b.jpg\"\/><\/p>\n<p>  \u0414\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li><b>\u041a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f:<\/b> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e exe \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u043e\u0433 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u043b\u0438 \u0442\u043e \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0414\u0430\u0436\u0435 \u0432 \u043e\u0434\u043d\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u044b\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435 (\u0445\u043e\u0442\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 TCP IP\/IPX).<\/li>\n<li><b>\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/b> \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0441\u0442\u0430\u043b\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439. \u041a\u043e\u0434 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0438 \u0438\u0433\u0440\u044b \u0441\u0442\u0430\u043b \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 Quake2. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c.<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438 \u0434\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u0430\u0437\u0443 \u043a\u043e\u0434\u0430 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0447\u0435\u043c \u0443 Quake 1, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0440\u0430\u0434\u0430\u043b \u043e\u0442 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b DLL \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 <code>GetRefAPI<\/code> \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u0432 \u0438 <code>GetGameAPI<\/code> \u0434\u043b\u044f \u0438\u0433\u0440\u044b (\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b .def \u0432 \u043f\u0430\u043f\u043a\u0435 \u00abResource Files\u00bb):<\/p>\n<p>  <code>reg_gl\/Resource Files\/reg_soft.def<\/code><\/p>\n<pre><code class=\"cpp\">    EXPORTS         GetGameAPI<\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f\u0434\u0440\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c, \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 DLL \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 <code>GetRefAPI<\/code> \u0441 <code>GetProcAddress<\/code>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451.<\/p>\n<p>  <u><b>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/b><\/u> \u043f\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043a\u0435\u0442\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u00ab\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439\u00bb (loopback) \u0431\u0443\u0444\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>NET_SendLoopPacket<\/code> \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430. \u0421\u0435\u0440\u0432\u0435\u0440 \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>NET_GetLoopPacket<\/code>.<\/p>\n<p>  <u><b>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/b><\/u> \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u044d\u0442\u0443 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0437\u0430 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 1996 \u0433\u043e\u0434\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9cb\/9df\/046\/9cb9df0460e01b75292d8a849fbee326.jpg\"\/><\/p>\n<p>  \u042d\u0442\u043e \u0431\u044b\u043b 28-\u0434\u044e\u0439\u043c\u043e\u0432\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 InterView 28hd96, \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Intergraph. \u042d\u0442\u0430 \u0437\u0432\u0435\u0440\u044e\u0433\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e 1920&#215;1080, \u0447\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0435 \u0434\u043b\u044f 1995 \u0433\u043e\u0434\u0430 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/www.ceu-inc.com\/intergr_6d.html\">\u0437\u0434\u0435\u0441\u044c<\/a> (<a href=\"http:\/\/fabiensanglard.net\/quake2\/monitor.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>)).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/495\/74a\/6b5\/49574a6b5a8575373f28812720a3307f.jpg\"\/><\/p>\n<p>  \u041d\u043e\u0441\u0442\u0430\u043b\u044c\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0438\u0434\u0435\u043e \u0441 Youtube: <a href=\"http:\/\/www.youtube.com\/watch?v=RUghjj0cxgU\">\u0420\u0430\u0431\u043e\u0447\u0438\u0435 \u0441\u0442\u0430\u043d\u0446\u0438\u0438 Intergraph Computer Systems<\/a>.<\/p>\n<p>  <u>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/u> \u043f\u043e\u0445\u043e\u0436\u0435, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0430 \u043a\u043e\u0433\u043e-\u0442\u043e \u043d\u0430 geek.com, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"http:\/\/www.geek.com\/articles\/games\/john-carmack-coded-quake-on-a-28-inch-169-1080p-monitor-in-1995-20110920\/\">\u00ab\u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b Quake \u0432 1995 \u0433\u043e\u0434\u0443 \u043d\u0430 28-\u0434\u044e\u0439\u043c\u043e\u0432\u043e\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 16:9 1080p\u00bb<\/a> (<a href=\"http:\/\/fabiensanglard.net\/quake2\/geek.com.jpg\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>).<\/p>\n<p>  <u>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/u> \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a \u0432\u0441\u0451 \u0435\u0449\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Doom 3.<\/p>\n<h3>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u041c\u043e\u0434\u0443\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 (<code>ref_soft<\/code>) \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c (<code>ref_gl<\/code>) \u0431\u044b\u043b\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438, \u0447\u0442\u043e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b.<\/p>\n<p>  \u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u043b\u043e, \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d: \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u044b\u043b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d: \u0438 \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u044d\u0442\u043e\u0442 C++?<\/p>\n<p>  <u><b>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/b><\/u> id Software \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438\u0437 \u0438\u0433\u0440\u044b Wolfenstein 3D 1992 \u0433\u043e\u0434\u0430 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u0432 Doom3). \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430:<\/p>\n<p>  <u>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 id:<\/u>  <\/p>\n<ul>\n<li>\u041e\u0441\u044c X = \u043b\u0435\u0432\u043e\/\u043f\u0440\u0430\u0432\u043e<\/li>\n<li>\u041e\u0441\u044c Y = \u043f\u0435\u0440\u0435\u0434\/\u0437\u0430\u0434<\/li>\n<li>\u041e\u0441\u044c Z = \u0432\u0435\u0440\u0445\/\u043d\u0438\u0437<\/li>\n<\/ul>\n<p>  <u>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 OpenGL:<\/u>  <\/p>\n<ul>\n<li>\u041e\u0441\u044c X = \u043b\u0435\u0432\u043e\/\u043f\u0440\u0430\u0432\u043e<\/li>\n<li>\u041e\u0441\u044c Y = \u0432\u0435\u0440\u0445\/\u043d\u0438\u0437<\/li>\n<li>\u041e\u0441\u044c Z = \u043f\u0435\u0440\u0435\u0434\/\u0437\u0430\u0434<\/li>\n<\/ul>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0435 OpenGL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 <code>GL_MODELVIEW<\/code> \u0434\u043b\u044f \u00ab\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>R_SetupGL<\/code> (<code>glLoadIdentity<\/code> + <code>glRotatef<\/code>).<\/p>\n<h3>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445 \u044f\u0434\u0440\u0430\/\u043c\u043e\u0434\u0443\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0435: \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438.<\/p>\n<h3>\u041c\u043e\u0434\u0434\u0438\u043d\u0433: gamex86.dll<\/h3>\n<p>  \u0427\u0442\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c, \u043d\u043e \u043e\u0442\u043a\u0430\u0437 \u043e\u0442 Quake-C \u0434\u043b\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u0438\u0432\u0451\u043b \u043a \u0434\u0432\u0443\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0438 \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044e.<\/p>\n<p>  <u>\u041f\u043b\u043e\u0445\u043e\u0435:<\/u><\/p>\n<ul>\n<li>\u0412 \u0436\u0435\u0440\u0442\u0432\u0443 \u043f\u0440\u0438\u043d\u0435\u0441\u0435\u043d\u0430 \u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c, \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u0430.<\/li>\n<\/ul>\n<p>  <u>\u0425\u043e\u0440\u043e\u0448\u0435\u0435:<\/u><\/p>\n<ul>\n<li>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c: \u044f\u0437\u044b\u043a Quake-C \u0438\u0433\u0440\u044b Quake1 \u0431\u044b\u043b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043d\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Quake2 <code>gamex86.dll<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c.<\/li>\n<li>\u0421\u0432\u043e\u0431\u043e\u0434\u0430: \u043c\u043e\u0434\u0434\u0435\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0412\u0421\u0415\u041c\u0423, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Quake-C.<\/li>\n<\/ul>\n<p>  <u>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/u> \u0438\u0440\u043e\u043d\u0438\u0447\u043d\u043e, \u0447\u0442\u043e id Software \u043f\u0435\u0440\u0435\u0448\u043b\u0430 \u0432 Quake3 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b (QVM) \u0434\u043b\u044f \u0438\u0433\u0440\u044b, \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 \u0438 \u043c\u043e\u0434\u0434\u0438\u043d\u0433\u0430.<\/p>\n<h3>\u041c\u043e\u0439 quake2<\/h3>\n<p>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0445\u0430\u043a\u0438\u043d\u0433\u0430 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Quake2. \u041a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c DOS, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u044b\u0435 <code>printf<\/code> \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0430 \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438 Quake:<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432 \u0441\u0442\u0438\u043b\u0435 DOS \u0432 \u043e\u043a\u043d\u043e Win32 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">    \/\/ sys_win.c      int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)     { \t     \t   AllocConsole(); \t   freopen(&quot;conin$&quot;,&quot;r&quot;,stdin); \t   freopen(&quot;conout$&quot;,&quot;w&quot;,stdout); \t   freopen(&quot;conout$&quot;,&quot;w&quot;,stderr); \t   consoleHandle = GetConsoleWindow(); \t   MoveWindow(consoleHandle,1,1,680,480,1); \t   printf(&quot;[sys_win.c] Console initialized.\\n&quot;); \t           \t   ...    \t        }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b Windows \u043d\u0430 Mac \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Parallels, \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u00abprintscreen\u00bb \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u044f \u0437\u0430\u0434\u0430\u043b \u043a\u043b\u0430\u0432\u0438\u0448\u0443 &quot;*&quot; \u0441 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">    \/\/ keys.c          if (key == '*')     {         if (down)  \/\/\u0418\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0430!             Cmd_ExecuteString(&quot;screenshot&quot;);     }<\/code><\/pre>\n<p>  \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0438 \u0441\u0445\u0435\u043c. \u0412\u043e\u0442 \u00ab\u043c\u043e\u0439\u00bb \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434:<br \/>  <a href=\"http:\/\/fabiensanglard.net\/quake2\/quake2-3.21.zip\">\u0430\u0440\u0445\u0438\u0432<\/a>.<\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e<\/h3>\n<p>  \u0423 Doom \u0438 Quake1 \u0431\u044b\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abZone Memory Allocation\u00bb: \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c <code>malloc<\/code> \u0438 \u0431\u043b\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0417\u043e\u043d\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 (Memory Zone) \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. Zone Memory Allocator (<code>common.c: Z_Malloc, Z_Free, Z_TagMalloc , Z_FreeTags<\/code>) \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432 Quake2, \u043d\u043e \u043e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d:<\/p>\n<ul>\n<li>\u041f\u043e\u043c\u0435\u0442\u043a\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\/\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 <code>malloc<\/code> \u0438 <code>free<\/code> (\u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432 id Software \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 C Standard Library).<\/li>\n<li>\u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>Z_MAGIC<\/code>) \u0442\u043e\u0436\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f<\/li>\n<\/ul>\n<p>  \u041f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443 <code>size<\/code> \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">    #define    Z_MAGIC    0x1d1d       typedef struct zhead_s     { \t         struct   zhead_s    *prev, *next;     short    magic;     short    tag;\t\t\t\/\/ \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438     int      size;          } zhead_t;<\/code><\/pre>\n<p>  \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0431\u044a\u0451\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0434\u043d\u0430\u043a\u043e, \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u043c\u0443\u0441\u043e\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">      \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f malloc \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439:       ==============================                size = SURFCACHE_SIZE_AT_320X240;  \/\/1024*768          pix = vid.width*vid.height;\t         \t         if (pix &gt; 64000)\t\t\t\t            size += (pix-64000)*3;<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/66e\/fdb\/50e\/66efdb50e13617648cff2f3203423bc6.jpg\"\/><\/p>\n<p>  \u00abHunk allocator\u00bb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0437\u0432\u0443\u043a\u043e\u0432 \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440). \u041e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448, \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>virtualAlloc<\/code> \u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (8 \u041a\u0411, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 Win98 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f 4 \u041a\u0411?! \u0427\u0442\u043e \u0437\u0430 \u0434\u0435\u043b\u0430?!).<\/p>\n<p>  \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043a\u043e\u0432 FIFO <b>(\u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432)<\/b>, \u0438 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e: \u0442\u0440\u044e\u043a \u0441 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435\u043c<\/h3>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Quake2 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u0440\u044e\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432 32 \u0431\u0438\u0442\u0430\u0445 (\u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 8 \u041a\u0411 \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 PAGE_FAULT\u2026 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e Windows 98 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e 4 \u041a\u0411).<\/p>\n<p>  <u>\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u0432 8 \u041a\u0411):<\/u><\/p>\n<pre><code class=\"cpp\">     int roundUpToPageSize(int size)      {           size = (size + 8191) & ~8191;            return size;            }<\/code><\/pre>\n<p>  <u>\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0432 4 \u0411):<\/u><\/p>\n<pre><code class=\"cpp\">     memLoc = (memLoc + 3) & ~3;                         \/\/ \u0420\u0430\u0441\u043f\u043e\u043b\u0436\u043e\u0435\u043d\u0438\u0435 \u0432 4-\u0431\u0430\u0439\u0442\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u0435.<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043d\u0441\u043e\u043b\u0438<\/h3>\n<p>  \u042f\u0434\u0440\u043e Quake2 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043e\u0449\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e \u0441\u043f\u0438\u0441\u043a\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a.<\/p>\n<p>  \u0412 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\u041a\u043e\u043c\u0430\u043d\u0434\u044b: \u0434\u0430\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/li>\n<li>Cvar: \u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0441\u0442\u0440\u043e\u043a\u0438.<\/li>\n<li>\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c: \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0443 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439:<\/p>\n<pre><code class=\"cpp\">    cmd_function_t    *cmd_functions     \/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438: void (*)() . \t       \t           cvar_t            *cvar_vars         \/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \t       \t           cmdalias_t        *cmd_alias         \/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438.<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u043d\u0430 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 cvar), \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445: <code>cmd_argc<\/code> \u0438 <code>cmd_argv<\/code>:<\/p>\n<pre><code class=\"cpp\">    static   int       cmd_argc;                          static   char     *cmd_argv[MAX_STRING_TOKENS];<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d10\/fbc\/685\/d10fbc685f8ab55bc22eae34a5df82e0.jpg\"\/><\/p>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0442\u043e\u043a\u0435\u043d \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f <code>memcpy<\/code> \u0432 \u043c\u0435\u0441\u0442\u043e, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 <code>malloc<\/code> \u0437\u0430\u043f\u0438\u0441\u044c\u044e <code>cmd_argv<\/code>. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0443\u0434\u0435\u043b\u0438\u043b\u0438 \u043c\u0430\u043b\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0418 \u044d\u0442\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u043e: \u043e\u043d\u0430 \u0440\u0435\u0434\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u043c\u0430\u043b\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0438\u0433\u0440\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u043b\u0430 \u0443\u0441\u0438\u043b\u0438\u0439. \u041b\u0443\u0447\u0448\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0431\u044b\u043b \u0431\u044b \u043f\u0430\u0442\u0447\u0438\u043d\u0433 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6b3\/972\/2ac\/6b39722ac60a911bba1cb2a62f2d9591.jpg\"\/><\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u043e <code>cmd_argv[0]<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c \u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u043e\u043a\u0435\u043d \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u0442\u043e Quake2 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043a\u0430\u043a \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 (\u0438\u043b\u0438 \u043a\u0430\u043a \u0435\u0451 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439).<\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439: \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u044d\u0448\u0435\u0439. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0431\u044b \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 O(n) \u0432\u043c\u0435\u0441\u0442\u043e O(n\u00b2).<\/p>\n<p>  <u><b>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442 \u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 1<\/b>:<\/u> \u0442\u0430\u0431\u043b\u0438\u0446\u0430 ASCII \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0443\u043c\u043d\u043e: \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u043e\u0431\u0435\u043b\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f, \u043c\u0435\u043d\u044c\u0448\u0435 \u043b\u0438 \u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b i \u0441\u0438\u043c\u0432\u043e\u043b\u0430 &#8216; &#8216; (\u043f\u0440\u043e\u0431\u0435\u043b\u0430).<\/p>\n<pre><code class=\"cpp\">    char* returnNextToken(char* string)     {         while (string && *string &lt; ' ')             string++; \t\t\t\t\t\t             return string;     }<\/code><\/pre>\n<p>  <u><b>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442 \u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 2<\/b>:<\/u> \u0442\u0430\u0431\u043b\u0438\u0446\u0430 ASCII \u0431\u044b\u043b\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0443\u043c\u043d\u043e: \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b c \u0432 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  int value = c \u2014 &#8216;0&#8217;;<\/p>\n<pre><code class=\"cpp\">    int charToInt(char v)     {         return  v  - '0' ;     }<\/code><\/pre>\n<p>  <u>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f cvar:<\/u><\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0438\u0441\u043a \u043c\u0435\u0441\u0442\u0430 cvar \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (<code>Cvar_Get<\/code>) \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n\u00b2) (\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a + <code>strcmp<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438), \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u044b \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442 \u043c\u0435\u0441\u0442\u043e cvar \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">    \/\/\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     cvar_t\t\t*crosshair; \t         \/\/ \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0432\u0438\u0436\u043a\u0430, \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f      \/\/ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e Cvar \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.          crosshair = Cvar_Get (&quot;crosshair&quot;, &quot;0&quot;, CVAR_ARCHIVE);    \/\/\u042d\u0422\u041e \u041c\u0415\u0415\u0415\u0414\u041b\u0415\u041d\u041d\u041e                \/\/\u0412 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0435, \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.     void SCR_DrawCrosshair (void)     {                           \t               if (!crosshair-&gt;value)                                 \/\/\u042d\u0422\u041e \u0411\u042b\u0421\u0422\u0420\u041e                return;     }<\/code><\/pre>\n<p>  \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0437\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430 O(1).<\/p>\n<h3>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0437\u043b\u043e\u0434\u0435\u0435\u0432<\/h3>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u0447\u0438\u0442\u0435\u0440\u0441\u0442\u0432\u0430 \u0431\u044b\u043b\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432:  <\/p>\n<ul>\n<li>\u0414\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0443 UDP \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f CRC, \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f Quake CRC (<code>COM_BlockSequenceCRCByte<\/code>).<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0434\u0435\u0442\u043c\u0430\u0442\u0447\u0430 \u0443\u0440\u043e\u0432\u043d\u0438 \u0445\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MD4. \u042d\u0442\u043e\u0442 \u0445\u044d\u0448 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0443\u0431\u0435\u0434\u0438\u043b\u0441\u044f, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u044b (<code>Com_BlockChecksumM<\/code>).<\/li>\n<li>\u0415\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 (<code>SV_ClientThink<\/code>), \u043d\u043e \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u0442\u043e\u0447\u043d\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/h3>\n<p>  \u041a\u0430\u043a \u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Quake, \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u044b\u043b\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 (\u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0449\u0451 \u043d\u0435\u0442 \u0441\u043b\u0435\u0434\u043e\u0432 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u043e\u0433\u043e \u00ab\u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043d\u044f\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 Quake3).<\/p>\n<p>  <u>\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439<\/u> (\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438):<\/p>\n<pre><code class=\"cpp\">    float Q_fabs (float f)     {         int tmp = * ( int * ) &f;         tmp &= 0x7FFFFFFF;         return * ( float * ) &tmp;     }<\/code><\/pre>\n<p>  <u>\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Float \u0432 Integer<\/u><\/p>\n<pre><code class=\"cpp\">    __declspec( naked ) long Q_ftol( float f )     {         static int tmp;         __asm fld dword ptr [esp+4]         __asm fistp tmp         __asm mov eax, tmp         __asm ret     }<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0432 Cloc \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 138 240 \u0441\u0442\u0440\u043e\u043a. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u041d\u0415 \u0434\u0430\u0451\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u044f\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442 \u043c\u043d\u043e\u0433\u043e\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0432\u0435\u0440\u0441\u0438\u0439 \u0434\u0432\u0438\u0436\u043a\u0430, \u043d\u043e, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u043a\u0430.<\/p>\n<pre><code class=\"cpp\">    $ cloc quake2-3.21\/          338 text files.          319 unique files.           34 files ignored.                 http:\/\/cloc.sourceforge.net v 1.53  T=3.0 s (96.0 files\/s, 64515.7 lines\/s)          -------------------------------------------------------------------------------     Language                     files          blank        comment           code     -------------------------------------------------------------------------------     C                              181          24072          19652         107757     C\/C++ Header                    72           2493           2521          14825     Assembly                        22           2235           2170           8331     Objective C                      6           1029            606           4290     make                             2            436             67           1739     HTML                             1              3              0           1240     Bourne Shell                     2             17              6             54     Teamcenter def                   2              0              0              4     -------------------------------------------------------------------------------     SUM:                           288          30285          25022         138240     -------------------------------------------------------------------------------<\/code><\/pre>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u0432\u0435\u0441\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430.<\/p>\n<h3>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0445\u0430\u043a\u0438\u043d\u0433\u043e\u043c Quake2<\/h3>\n<p>  <\/p>\n<ul>\n<li>Visual Studio Express 2008.<\/li>\n<li>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0434\u0435\u043c\u043e Quake2 \u0441 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 id.<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439 <a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/MyPakExplorer.zip\">Pak explorer<\/a>.<\/li>\n<li><a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/wally1.55b.zip\">Wally<\/a>: \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 WAL.<\/li>\n<li>\u0417\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f pak (<a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/pakexplr.zip\">PakExpl<\/a>)<\/li>\n<li><a href=\"http:\/\/www.flipcode.com\/archives\/Quake_2_BSP_File_Format.shtml\">\u0421\u0442\u0430\u0442\u044c\u044f \u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435 BSP<\/a> (<a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/quake2_bsp_format.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>) \u0441 \u0441\u0430\u0439\u0442\u0430 FlipCode.<\/li>\n<li>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b C: VTune(intel), CodeAnalysis(AMD), Visual Studio Team Profiler (\u043b\u0443\u0447\u0448\u0438\u0439, \u043f\u043e-\u043c\u043e\u0435\u043c\u0443).<\/li>\n<li>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 24\/30-\u0434\u044e\u0439\u043c\u043e\u0432\u044b\u0439 \u044d\u043a\u0440\u0430\u043d.<\/li>\n<li>\u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 IBM Model M.<\/li>\n<\/ul>\n<p>  Quake2 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u0438 \u0434\u0432\u0443\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: Game \u0438 Renderer. \u041e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u043a \u044f\u0434\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0439 <a href=\"http:\/\/www.ualberta.ca\/CNS\/RESEARCH\/LinuxClusters\/mem.html\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a> (<a href=\"http:\/\/fd.fabiensanglard.net.quake2\/UndestandingMemory.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>).<\/p>\n<h3>\u041f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0432 C \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c<\/h3>\n<p>  \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0451\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432:<\/p>\n<ul>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440:<br \/> \n<ul>\n<li>\u0427\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434 \u044f\u0434\u0440\u0430 Quake2, \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u043a\u043e\u0434\u0430, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0431\u0435\u0437\u0443\u043c\u043d\u044b\u0445 <code>#ifdef<\/code>.<\/li>\n<li>\u0412\u044b\u043f\u0443\u0441\u043a \u0438\u0433\u0440\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430\u043c\u0438 (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439, openGL).<\/li>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0438\u0433\u0440\u044b.<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440\u044b (Glide, Verity).<\/li>\n<\/ul>\n<\/li>\n<li>\u041c\u043e\u0434\u0434\u0438\u043d\u0433 \u0438\u0433\u0440\u044b:<br \/> \n<ul>\n<li>\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0434\u043e\u0432, \u0438\u0433\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 game.dll.<\/li>\n<li>\u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b \u0432 \u043c\u043e\u0434\u0430\u0445, \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 QuakeC \u0438 Quake Virtual Machine.<\/li>\n<li>\u041d\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0438\u0437\u0443\u0447\u0430\u0442\u044c QuakeC, DLL \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 C.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  \u041d\u043e Quake2 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 C, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043d\u0438\u043a \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u041e\u041e?\u00bb<\/p>\n<p>  \u0422\u0435\u0445\u043d\u0438\u043a\u0430 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u041e\u041e \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431, \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u0432 JAVA \u0438 C++: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: <code>refimport_t<\/code> \u0438 <code>refexport_t<\/code> \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430. <code>game_import_t<\/code> \u0438 <code>game_export_t<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0438\u0433\u0440\u044b.<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043b\u0443\u0447\u0448\u0435 \u0434\u043e\u043b\u0433\u043e\u0439 \u0440\u0435\u0447\u0438<\/h3>\n<p>  \u0428\u0430\u0433 1: \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435:<\/p>\n<ul>\n<li><code>quake2.exe<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>ref_OpenGL_t<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 <code>NULL<\/code> (\u0441\u0435\u0440\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430).<\/li>\n<li>\u041c\u043e\u0434\u0443\u043b\u044c DLL (<code>ref_opengl.dll<\/code>) \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>kernel_fct_t<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 <code>NULL<\/code> (\u0441\u0435\u0440\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430).<\/li>\n<\/ul>\n<p>  \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u043e\u0433\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/poly_stage1.png\"\/><\/p>\n<p>  \u0428\u0430\u0433 2: \u044f\u0434\u0440\u043e, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0435\u0451 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f DLL.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/poly_stage2.png\"\/><\/p>\n<p>  \u0428\u0430\u0433 3: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f DLL \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0434\u0440\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0435\u0451 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/poly_stage3.png\"\/><\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445.<\/p>\n<h3>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430<\/h3>\n<p>  \u041c\u0435\u0442\u043e\u0434, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>VID_LoadRefresh<\/code>. \u041e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440, \u0447\u0442\u043e\u0431\u044b Quake \u043c\u043e\u0433 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430\u043c\u0438 (\u043d\u043e \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0443 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c).<\/p>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u044f\u0434\u0440\u0430 Quake2:<\/p>\n<pre><code class=\"cpp\">    refexport_t\tre;      qboolean VID_LoadRefresh( char *name )     {         refimport_t\tri;         GetRefAPI_t\tGetRefAPI;                   ri.Sys_Error = VID_Error;         ri.FS_LoadFile = FS_LoadFile;         ri.FS_FreeFile = FS_FreeFile;         ri.FS_Gamedir = FS_Gamedir;         ri.Cvar_Get = Cvar_Get;         ri.Cvar_Set = Cvar_Set;         ri.Vid_GetModeInfo = VID_GetModeInfo;         ri.Vid_MenuInit = VID_MenuInit;         ri.Vid_NewWindow = VID_NewWindow;                                   GetRefAPI = (void *) GetProcAddress( reflib_library, &quot;GetRefAPI&quot; );         re = GetRefAPI( ri );                  ...              }<\/code><\/pre>\n<p>  \u0412 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043a\u043e\u0434\u0435 \u044f\u0434\u0440\u043e Quake2 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>GetRefAPI<\/code> \u043e\u0442 DLL \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>GetProcAddress<\/code> (\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 win32).<\/p>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <code>GetRefAPI<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 DLL \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">    refexport_t GetRefAPI (refimport_t rimp )     {         refexport_t\tre;          ri = rimp;          re.api_version = API_VERSION;          re.BeginRegistration = R_BeginRegistration;         re.RegisterModel = R_RegisterModel;         re.RegisterSkin = R_RegisterSkin;         re.EndRegistration = R_EndRegistration;         re.RenderFrame = R_RenderFrame;         re.DrawPic = Draw_Pic;         re.DrawChar = Draw_Char;          re.Init = R_Init;         re.Shutdown = R_Shutdown;          re.BeginFrame = R_BeginFrame;         re.EndFrame = GLimp_EndFrame;          re.AppActivate = GLimp_AppActivate;          return re; }<\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u044f\u0434\u0440\u043e\u043c \u0438 DLL. \u041e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e DLL \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u044f\u0434\u0440\u043e Quake2 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u043e\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<h3>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u0433\u0440\u044b<\/h3>\n<p>  \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u044f\u0434\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">   game_export_t\t*ge;      void SV_InitGameProgs (void)     {         game_import_t\timport;                           import.linkentity = SV_LinkEdict;         import.unlinkentity = SV_UnlinkEdict;         import.BoxEdicts = SV_AreaEdicts;         import.trace = SV_Trace;         import.pointcontents = SV_PointContents;         import.setmodel = PF_setmodel;         import.inPVS = PF_inPVS;         import.inPHS = PF_inPHS;         import.Pmove = Pmove;                  \/\/ \u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 30 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \t         ge = (game_export_t *)Sys_GetGameAPI (&import);         ge-&gt;Init (); \t\t \t\t     }       void *Sys_GetGameAPI (void *parms)     { \t    void\t*(*GetGameAPI) (void *); \t     \t    \/\/[...] \t     \t     \t    GetGameAPI = (void *)GetProcAddress (game_library, &quot;GetGameAPI&quot;); \t    if (!GetGameAPI) \t    { \t    \tSys_UnloadGame ();\t\t \t    \treturn NULL; \t    }  \t    return GetGameAPI (parms);     }<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 DLL \u0438\u0433\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">    game_import_t\tgi;      game_export_t *GetGameAPI (game_import_t *import)     {             gi = *import;          globals.apiversion = GAME_API_VERSION;         globals.Init = InitGame;         globals.Shutdown = ShutdownGame;         globals.SpawnEntities = SpawnEntities;          globals.WriteGame = WriteGame;         globals.ReadGame = ReadGame;         globals.WriteLevel = WriteLevel;         globals.ReadLevel = ReadLevel;          globals.ClientThink = ClientThink;         globals.ClientConnect = ClientConnect;         globals.ClientDisconnect = ClientDisconnect;         globals.ClientBegin = ClientBegin;          globals.RunFrame = G_RunFrame;          globals.ServerCommand = ServerCommand;          globals.edict_size = sizeof(edict_t);          return &globals;     }<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c. \u0417\u0434\u0435\u0441\u044c \u0432 \u043a\u043e\u0434\u0435 \u044f\u0434\u0440\u043e \u00ab\u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u0442\u00bb \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u044f\u043c:<\/p>\n<p>  \u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u00ab\u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u0442\u00bb \u043a <code>SCR_UpdateScreen<\/code>:<\/p>\n<pre><code class=\"cpp\">    \/\/ \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 quake.exe, \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 quake2.exe \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.     SCR_UpdateScreen()     {         \/\/ re - \u044d\u0442\u043e struct refexport_t, BeginFrame \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 BeginFrame \u0432 DLL.         re.BeginFrame( separation[i] ); \t             \/\/ \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 DLL             SCR_CalcVrect()             SCR_TileClear()             V_RenderView()             SCR_DrawStats             SCR_DrawNet             SCR_CheckDrawCenterString             SCR_DrawPause             SCR_DrawConsole             M_Draw             SCR_DrawLoading                  re.EndFrame();         \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u043c\u0435\u0442\u043e\u0434\u0430\u043c quake.exe.     }<\/code><\/pre>\n<p>  \u0418\u0433\u0440\u0430 \u00ab\u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u0442\u00bb \u043a <code>SV_RunGameFrame<\/code>:<\/p>\n<pre><code class=\"cpp\">    void SV_RunGameFrame (void)         {         \t    sv.framenum++;         \t    sv.time = sv.framenum*100;        \/\/ \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \t     \t    if (!sv_paused-&gt;value || maxclients-&gt;value &gt; 1)             \t         \t        ge-&gt;RunFrame (); \t         \t        ....         }     }<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440<\/h3>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 Quake2 \u2014 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/softRendererStruct.png\"\/><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0434\u0438\u0441\u043a\u0430 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438.<\/p>\n<p>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041e\u043d \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432 \u0441\u0432\u043e\u0451\u043c \u0440\u043e\u0434\u0435 \u0438 \u043e\u0437\u043d\u0430\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u043a\u043e\u043d\u0435\u0446 \u044d\u0440\u044b. \u041f\u043e\u0437\u0436\u0435 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0448\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0443 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 OpenGL \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 256-\u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0439 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b 24-\u0431\u0438\u0442\u043d\u043e\u0433\u043e True Color RGB:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/renderer.gif\"\/><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043c \u0434\u0432\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f:<\/p>\n<ul>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0446\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f<\/li>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  \u041d\u043e \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0443 \u0443\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0447\u0435\u043d\u044c \u0443\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u044b, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435:<\/p>\n<ul>\n<li>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 (64 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f).<\/li>\n<li>\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432.<\/li>\n<li>\u041f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430 Quake2 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 PAK <code>pics\/colormap.pcx<\/code>:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/quake2_palette.jpg\"\/><\/p>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0440\u0430\u0432\u043d\u043e 0, \u0431\u0435\u043b\u043e\u0433\u043e \u2014 15, \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u2014 208, \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u2014 240 (\u0432 \u043b\u0435\u0432\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0433\u043b\u0443), \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0433\u043e \u2014 255.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044d\u0442\u0438\u0445 256 \u0446\u0432\u0435\u0442\u043e\u0432 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 <code>pics\/colormap.pcx<\/code>:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/COLORMAP.jpg\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 256&#215;320 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430, \u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0443\u043c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>64 \u043b\u0438\u043d\u0438\u0439 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432: \u043f\u0435\u0440\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0438\u0437 256 \u0446\u0432\u0435\u0442\u043e\u0432 \u00ab\u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u0439\u00bb \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 63 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 255 \u0446\u0432\u0435\u0442\u0430\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u044b\u0431\u043e\u0440\u0430 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432:\n<ul>\n<li>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0446\u0432\u0435\u0442 \u0438\u0437 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,255] (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b).<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f x*256, \u0433\u0434\u0435 x \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,63] \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0442\u0435\u043c\u043d\u0451\u043d\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0446\u0432\u0435\u0442\u0430 (\u043e\u043d \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f).<\/li>\n<\/ul>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 64 \u043e\u0442\u0442\u0435\u043d\u043a\u0430 256 \u0446\u0432\u0435\u0442\u043e\u0432. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u0437 256 \u0446\u0432\u0435\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u041f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435.<\/li>\n<li>\u041e\u0441\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 16&#215;16, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u0427\u0451\u0442\u043a\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043e\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0432 \u0438\u0433\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0432\u043e\u0434\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0451\u0440\u043d\u044b\u0439 \u0438 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442\u0430.<\/li>\n<\/ul>\n<p>  <b><u>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/u><\/b> \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 Quake2 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 MMX \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0431\u044b\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 RGB, \u0430 \u043d\u0435 \u043d\u0430 \u043f\u0430\u043b\u0438\u0442\u0440\u0435, \u043e \u0447\u0451\u043c \u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a \u0437\u0430\u044f\u0432\u0438\u043b \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 Quake1 \u0432 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e (\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430 10 \u043c\u0438\u043d\u0443\u0442\u0435 17 \u0441\u0435\u043a\u0443\u043d\u0434\u0435):<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 75.0019%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/LXw6BkZ-gdY?rel=0&amp;showinfo=1&amp;start=616\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  MMX \u2014 \u044d\u0442\u043e SIMD-\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 RGB \u0441 \u0437\u0430\u0442\u0440\u0430\u0442\u043e\u0439 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0441 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0426\u041f. \u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u043e\u0442 \u043d\u0435\u0451 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b Pentium \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 MMX \u0431\u044b\u043b\u0438 \u043c\u0430\u043b\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u044b \u0432 1997 \u0433\u043e\u0434\u0443, \u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441 \u0434\u0435\u0448\u0451\u0432\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439.<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0446\u0432\u0435\u0442\u043e\u0432 RGB (16 \u0431\u0438\u0442 \u0438\u043b\u0438 32 \u0431\u0438\u0442 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c) \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0432\u0435\u0442\u043e\u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u044b (8 \u0431\u0438\u0442 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c) \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0434\u043e\u043b\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432\u0448\u0438\u0441\u044c \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c (\u043f\u0430\u043b\u0438\u0442\u0440\u043e\u0439), \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u0431\u0449\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430. \u0415\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0441\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b Pentium (\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439) \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0441\u043b\u0430\u0431\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0448\u0438\u043d\u044b, \u0432\u043b\u0438\u044f\u0432\u0448\u0435\u0439 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0411\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0435\u043d\u0430 \u043d\u0430 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 <i>\u043d\u0443\u043b\u0435\u0432\u043e\u0439<\/i> \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u0412 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043f\u0443\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0441\u043f\u043e\u0441\u043e\u0431\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 Quake 1. \u0412 \u043d\u0451\u043c \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0430\u0440\u0442\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c BSP \u0438 PVS (\u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0442\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\u041a\u0430\u0440\u0442\u0430: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 BSP (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0451\u043c \u043f\u043e\u0437\u0436\u0435).<\/li>\n<li>\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438: \u043b\u0438\u0431\u043e \u043a\u0430\u043a \u00ab\u0441\u043f\u0440\u0430\u0439\u0442\u044b\u00bb (\u043e\u043a\u043d\u0430), \u043b\u0438\u0431\u043e \u043a\u0430\u043a \u00ab\u043e\u0431\u044a\u0435\u043a\u0442\u044b\u00bb (\u0438\u0433\u0440\u043e\u043a\u0438, \u0432\u0440\u0430\u0433\u0438) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0427\u0430\u0441\u0442\u0438\u0446\u044b.<\/li>\n<\/ul>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u044d\u0442\u0438\u043c\u0438 \u00ab\u0441\u0442\u0430\u0440\u044b\u043c\u0438\u00bb \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438, \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u044b 3.6 \u0438 15.6 \u043a\u043d\u0438\u0433\u0438 <a href=\"http:\/\/books.google.com\/books?id=-4ngT05gmAQC&amp;printsec=frontcover&amp;source=gbs_ge_summary_r&amp;cad=0#v=onepage&amp;q&amp;f=false\">Computer graphics: principles and practice<\/a> \u0414\u0436\u0435\u0439\u043c\u0441\u0430 \u0414. \u0424\u043e\u043b\u0438 (James D. Foley). \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0433\u043b\u0430\u0432\u0430\u0445 59-70 \u043a\u043d\u0438\u0433\u0438 <a href=\"http:\/\/www.gamedev.net\/page\/resources\/_\/reference\/programming\/140\/283\/graphics-programming-black-book-r1698\">Graphics programming black book<\/a> \u041c\u0430\u0439\u043a\u043b\u0430 \u0410\u0431\u0440\u0430\u0448\u0430 (Michael Abrash).<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f:<\/p>\n<ol>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043a\u0430\u0440\u0442\u044b<br \/> \n<ul>\n<li>\u041f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u043c\u0443 \u0434\u0435\u0440\u0435\u0432\u0443 BSP \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f.<\/li>\n<li>\u0417\u0430\u043f\u0440\u043e\u0441 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 PVS \u043e\u0431 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 PVS.<\/li>\n<li>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 PVS: \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u0441\u0447\u0438\u0442\u0430\u044e\u0449\u0435\u043c\u0443\u0441\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u043c.<\/li>\n<li>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e BSP. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043d\u0430 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0438:<br \/> \n<ul>\n<li>\u0421\u043d\u043e\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c BSP, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434:<br \/> \n<ul>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d: \u0441\u0442\u0440\u043e\u0438\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u0451\u0431\u0435\u0440.<\/li>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 (\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c=\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430+\u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f) \u0434\u043b\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u041e\u0417\u0423.<\/li>\n<li>\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0442\u0435\u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0436\u0435 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438).<\/li>\n<\/ul>\n<\/li>\n<li>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u044d\u043a\u0440\u0430\u043d\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u044d\u0448\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u041e\u0417\u0423 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0417\u0430\u043f\u0438\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 Z-\u0431\u0443\u0444\u0435\u0440\u0430.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Z-\u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.<\/li>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0441\u0442\u0440\u043e\u0443\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u0441 \u043f\u0430\u043b\u0438\u0442\u0440\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0447\u0430\u0441\u0442\u0438\u0446.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 (\u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u0432 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f).<\/li>\n<\/ol>\n<p>  <u><b>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430:<\/b><\/u> \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0436\u0438\u043c\u0430 (\u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439\/\u043e\u043a\u043e\u043d\u043d\u044b\u0439) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f DirectDraw \u0438\u043b\u0438 GDI. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b (GDI=&gt;<code>rw_dib.c<\/code> DirectDraw=&gt;<code>rw_ddraw.c<\/code>) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u0438\u0431\u043e <code>BitBlt<\/code> <code>WinGDI.h<\/code> \u0438\u043b\u0438 <code>BltFast<\/code> <code>ddraw.h<\/code>.<\/p>\n<h3>DirectDraw \u0438\u043b\u0438 GDI<\/h3>\n<p>  \u0422\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0432 1997 \u0433\u043e\u0434\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0440\u0443\u0447\u0430\u043b\u0438: \u0414\u0436\u043e\u043d \u041a\u0430\u0440\u043c\u0430\u043a \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">\t\/\/ \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u0433\u043b\u0443\u043f\u044b\u0445 DIB<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 Quake2 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441 DirectDraw, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u0442\u0430\u043a \u043e\u043d \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u0432 \u043e\u043a\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441 GDI, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 DIB\u2026 \u043e\u0442\u0440\u0430\u0436\u0451\u043d\u043d\u044b\u043c \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u043e \u043e\u0431\u0440\u0430\u0437 DIB \u0438\u0437 \u041e\u0417\u0423 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u043e\u0442\u0440\u0430\u0436\u0451\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u00abI\u00bb \u0432 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0435 GDI \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00abIndependent\u00bb).<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u043e\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0443 \u043a\u0430\u0434\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0442\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c. \u041d\u0443\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \u044d\u0442\u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439. \u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0432 C.<\/p>\n<pre><code class=\"cpp\">    typedef struct     { \t    pixel_t        *buffer;         \/\/ \u0417\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440\u043e\u0432 \t    pixel_t        *colormap;       \/\/ \u041f\u0430\u043b\u0438\u0442\u0440\u0430 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430: \u0440\u0430\u0437\u043c\u0435\u0440 256 * VID_GRADES \t    pixel_t        *alphamap;       \/\/ \u041f\u0430\u043b\u0438\u0442\u0440\u0430 \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438: \u043a\u0430\u0440\u0442\u0430 \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438 256 * 256 \t    int            rowbytes;        \/\/ \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0448\u0438\u0440\u0438\u043d\u044b, \u0435\u0441\u043b\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043a\u043d\u0435                                         \/\/ \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u0433\u043b\u0443\u043f\u044b\u0445 DIB \t    int            width;           \t    int            height;     } viddef_t; \t     viddef_t vid ;<\/code><\/pre>\n<p>  \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u0434\u0440\u043e\u0432, <code>vid.buffer<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:<\/p>\n<ul>\n<li>\u041f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f DirectDraw<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f WinGDI\/DBI<\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438\u043b\u0438 \u0432\u043d\u0438\u0437 <code>vid.rowbytes<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a <code>vid.width<\/code> \u0438\u043b\u0438 \u043a\u0430\u043a <code>-vid.width<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/buffer_GDI.jpeg\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/buffer_directdraw.jpeg\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430: \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0441 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">    \/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438     byte* pixel = vid.buffer + vid.rowbytes * 0;          \/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438     pixel = vid.buffer + vid.rowbytes * (vid.height-1);          \/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0441\u0442\u0440\u043e\u043a\u0438 i (\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 0)     pixel = vid.buffer + vid.rowbytes * i;      \t     \/\/ \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439 \u0447\u0451\u0440\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c     memset(vid.buffer,0,vid.height*vid.height) ;   \/\/ &lt;-- \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 DirectDraw                                                     \/\/     \u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0431\u043e\u0439 \u0432 \u043e\u043a\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435!<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0442\u0440\u044e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0443 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043d\u0430 \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0438 \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h3>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0440\u0442\u044b<\/h3>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0433\u043b\u0443\u0431\u0436\u0435 \u0437\u0430\u043a\u0430\u043f\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0434\u0432\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043a\u0430\u0440\u0442\u044b:<\/p>\n<ul>\n<li>\u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (BSP)\/ \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 (PVS).<\/li>\n<li>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0420\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u0435 BSP, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PVS<\/h3>\n<p>  \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0433\u043b\u0443\u0431\u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430:<\/p>\n<ul>\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/Binary_space_partitioning\">Wikipedia<\/a> (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0\">\u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c<\/a>).<\/li>\n<li>\u0421\u0442\u0430\u0442\u044c\u044f <a href=\"http:\/\/downloads.gamedev.net\/pdf\/gpbb\/gpbb59.pdf\">The Idea of BSP Trees<\/a> \u041c\u0430\u0439\u043a\u043b\u0430 \u0410\u0431\u0440\u0430\u0448\u0430.<\/li>\n<li>\u0421\u0442\u0430\u0442\u044c\u044f <a href=\"http:\/\/downloads.gamedev.net\/pdf\/gpbb\/gpbb60.pdf\">Compiling BSP Trees<\/a> \u041c\u0430\u0439\u043a\u043b\u0430 \u0410\u0431\u0440\u0430\u0448\u0430.<\/li>\n<li>\u0421\u0442\u0430\u0442\u044c\u044f \u0432 ASCII-\u0441\u0442\u0438\u043b\u0435, <a href=\"http:\/\/www.gamers.org\/dhs\/helpdocs\/bsp_faq.html\">\u0441\u0442\u0430\u0440\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u044f<\/a>.<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u0438 \u0432 Quake1, \u043a\u0430\u0440\u0442\u044b Quake2 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0443\u044e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443: \u0438\u0445 \u043e\u0431\u044a\u0451\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quakeSource\/bsp.jpg\"\/><\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u043f\u0443\u043a\u043b\u044b\u0435 3D-\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438). \u041a\u0430\u043a \u0438 \u0432 Doom \u0441 Quake1, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434 \u0438 \u0441\u0437\u0430\u0434\u0438 \u0432\u043f\u0435\u0440\u0451\u0434.<\/p>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e PVS, \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 (\u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440). \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u043a\u0430\u043a \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u042d\u0442\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u043e\u043c\u043d\u0430 (5 \u041c\u0411), \u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u0436\u0430\u0442\u0430 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0442\u0435\u043d \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u041e\u0417\u0423.<\/p>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u0438\u044f PVS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 0x00, \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u0451\u043d \u043d\u0438\u0436\u0435.<\/p>\n<h3>\u0418\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041a\u0430\u043a \u0438 \u0432 Quake1, \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Quake1 Quake2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0447\u0451\u0442\u0430\u0445 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0446\u0432\u0435\u0442\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435. \u041a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0430\u0440\u0445\u0438\u0432\u0435 <code>PAK<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u044b:<\/p>\n<p>  \u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439: \u041c\u0430\u0439\u043a\u043b \u0410\u0431\u0440\u0430\u0448 \u0432 \u00abBlack Book of Programming\u00bb (\u0433\u043b\u0430\u0432\u0430 \u00abQuake: a post-mortem and a glimpse into the future\u00bb): <\/p>\n<blockquote><p>\u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0447\u0451\u0442\u0430\u0445, \u043a\u0443\u0434\u0430 \u0414\u0436\u043e\u043d \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430&#8230;<\/p><\/blockquote>\n<p>  <\/p>\n<blockquote><p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 Quake 2 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u0434\u043e \u0447\u0430\u0441\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  (\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043d\u0435\u0433\u043e \u0432\u0445\u043e\u0434\u0438\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 BSP, \u0440\u0430\u0441\u0447\u0451\u0442 PVS \u0438 \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043f\u043e\u0437\u0436\u0435.)<\/p><\/blockquote>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u0438\u0437\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0438, \u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u044d\u0442\u0443 \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e <a href=\"http:\/\/freespace.virgin.net\/hugo.elias\/radiosity\/radiosity.htm\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> (<a href=\"http:\/\/fabiensanglard.net\/quake2\/radiosity.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>): \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u0435\u0434\u0435\u0432\u0440.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u044f: \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 RGB \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0441\u0435\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0432 \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u043e\u0433\u043e (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/3colors_01.jpg\"\/><\/p>\n<p>  \u041d\u0438\u0437\u043a\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430, \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e (\u0434\u0430, \u0434\u0430\u0436\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0435), \u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0439 \u0441 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439, \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448.<\/p>\n<p>  <u>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/u> \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0442 2&#215;2 \u0434\u043e 17&#215;17 (\u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 16 \u0432 <a href=\"http:\/\/www.flipcode.com\/archives\/Quake_2_BSP_File_Format.shtml\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> flipcode (<a href=\"http:\/\/fabiensanglard.net\/quake2\/flipcode.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>)) \u0438 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0431\u044b\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u043c\u0438.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u0411\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>R_RenderFrame<\/code>. \u0412\u043e\u0442 \u0435\u0433\u043e \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432 \u043c\u043e\u0438\u0445 <a href=\"http:\/\/fabiensanglard.net\/quake2\/softwareRenderer.notes.php\">\u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u0445<\/a>.<\/p>\n<ul>\n<li><code>R_SetupFrame<\/code>: \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043e\u0431\u0437\u043e\u0440\u0430 \u043e\u0431\u0445\u043e\u0434\u043e\u043c BSP (\u0432\u044b\u0437\u043e\u0432 <code>Mod_PointInLeaf<\/code>), \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 clusterID \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0432 <code>r_viewcluster<\/code>.<\/li>\n<li><code>R_MarkLeaves<\/code>: \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043e\u0431\u0437\u043e\u0440\u0430 (<code>r_viewcluster<\/code>) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u0442 PVS. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 PVS, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0433\u0440\u0430\u043d\u0438.<\/li>\n<li><code>R_PushDlights<\/code>: \u0441\u043d\u043e\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 BSP \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u043d\u0435\u0439 \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434. \u0415\u0441\u043b\u0438 \u0433\u0440\u0430\u043d\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c\u0430\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043d\u0430 \u043d\u0435\u0451 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435.<\/li>\n<li><code>R_EdgeDrawing<\/code>: \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f.<br \/> \n<ul>\n<li><code>R_RenderWorld<\/code>: \u043e\u0431\u0445\u043e\u0434 BSP \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434<br \/> \n<ul>\n<li>\u041f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440.<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0442\u0435\u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 (\u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438).<\/li>\n<\/ul>\n<\/li>\n<li><code>R_ScanEdges<\/code>: \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<br \/> \n<ul>\n<li><code>R_InsertNewEdges<\/code>: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u0451 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/li>\n<li><code>(*pdrawfunc)()<\/code>: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432, \u043d\u043e \u043e\u043d\u0438 \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0430 \u043d\u0438\u0436\u0435.<\/li>\n<li><code>D_DrawSurfaces<\/code>: \u0435\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><code>R_DrawEntitiesOnList<\/code>: \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f BModel (BModel \u2014 \u044d\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0440\u043e\u0432\u043d\u044f). \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0432\u0440\u0430\u0433\u043e\u0432, \u0431\u043e\u0435\u043f\u0440\u0438\u043f\u0430\u0441\u043e\u0432)&#8230;<\/li>\n<li><code>R_DrawAlphaSurfaces<\/code>: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0440\u043e\u0443\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f<\/li>\n<li><code>R_CalcPalette<\/code>: \u0440\u0430\u0441\u0447\u0451\u0442 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u0432 (\u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430, \u0441\u043e\u0431\u0438\u0440\u0430\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0438 \u0442.\u043f.)<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"cpp\">    R_RenderFrame     { \t            R_SetupFrame            \/\/ \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 pdrawfunc \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433: GDI \u0438\u043b\u0438 DirectDraw        {           Mod_PointInLeaf      \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043e\u0431\u0437\u043e\u0440\u0430 (\u043e\u0431\u0445\u043e\u0434\u043e\u043c BSP-\u0434\u0435\u0440\u0435\u0432\u0430) \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 r_viewcluster        }                        R_MarkLeaves            \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043e\u0431\u0437\u043e\u0440\u0430 (r_viewcluster)                                 \/\/ \u043d\u0430\u0431\u043e\u0440\u0430 PVS                R_PushDlights           \/\/ \u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e dlight_t* \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 r_newrefdef.dlights. \t                                        \/\/ \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0433\u0440\u0430\u043d\u0435\u0439 \u0438 \u0438\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0435\u0439                  R_EdgeDrawing           \/\/ \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0443\u0440\u043e\u0432\u043d\u044f\t        {\t               R_BeginEdgeFrame     \/\/ \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 pdrawfunc, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438            R_RenderWorld        \/\/ \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0433\u0440\u0430\u043d\u0435\u0439                                 \/\/ \u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 (surf_max - \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435)           R_DrawBEntitiesOnList\/\/ \u041f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442.                                                                R_ScanEdges          \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0433\u0440\u0430\u043d\u0435\u0439 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0435\u0439: \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u0438\u0440\u0430 \u043a\u0430\u043a \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a                                  \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0432 Z-\u0431\u0443\u0444\u0435\u0440 (\u043d\u043e \u043d\u0435 \u0447\u0442\u0435\u043d\u0438\u0435)                                         {\t\t\t               for (iv=r_refdef.vrect.y ; iv&lt;bottom ; iv++)               {                 R_InsertNewEdges     \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 AET \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c GET                 (*pdrawfunc)();      \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                 D_DrawSurfaces       \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435               }\t                                \/\/ \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                 R_InsertNewEdges     \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 AET \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c GET                 (*pdrawfunc)();      \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                 D_DrawSurfaces       \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435            }                }\t\t        \t\t\t                                       \t \t           \t\t \t        R_DrawEntitiesOnList    \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0432\u0440\u0430\u0433\u043e\u0432, \u0431\u043e\u0447\u0435\u043a \u0438 \u0442.\u0434...\t                                \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Z-\u0431\u0443\u0444\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0442\u0435\u043d\u0438\u044f. \t             R_DrawParticles\t       \/\/ \u0427\u0430\u0441\u0442\u0438\u0446\u044b!        R_DrawAlphaSurfaces     \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0438\u0441\u043a\u0430 &lt;code&gt;pics\/colormap.pcx&lt;\/code&gt;.        R_SetLightLevel\t       \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0411\u041e\u041b\u042c\u0428\u041e\u0419 \u0425\u0410\u041a!)         R_CalcPalette           \/\/ \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b (\u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432), \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043e\u0432                  }<\/code><\/pre>\n<p>  <\/p>\n<h3>R_SetupFrame: \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 BSP<\/h3>\n<p>  \u041e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432 \u043a\u043e\u0434\u0435. \u042d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434 \u0438\u043b\u0438 \u0441\u0437\u0430\u0434\u0438 \u0432\u043f\u0435\u0440\u0451\u0434. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code>cplane_t<\/code>:<\/p>\n<pre><code class=\"cpp\">    typedef struct cplane_s     {         vec3_t   normal;         float    dist;         } cplane_t;<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0438 \u043e\u0442 \u0441\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0432 \u0443\u0437\u043b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">    int d = DotProduct (p,plane-&gt;normal) - plane-&gt;dist;<\/code><\/pre>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0437\u043d\u0430\u043a\u0443 <code>d<\/code> \u043c\u044b \u0443\u0437\u043d\u0430\u0451\u043c, \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0434 \u0438\u043b\u0438 \u0437\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e, \u0438 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Doom \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f Quake3.<\/p>\n<h3>R_MarkLeaves: \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u0430\u044f \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044f PVS<\/h3>\n<p>  \u0422\u043e, \u043a\u0430\u043a \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044e PVS \u0432 \u043c\u043e\u0451\u043c <a href=\"https:\/\/habrahabr.ru\/post\/324804\/\">\u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake 1<\/a>, \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c: \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u0442\u0430\u043c\u0438 1, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 0x00. \u0412 PVS \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 0x00: \u043f\u0440\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0441\u0436\u0430\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430:<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u0438\u0437 \u0441\u0436\u0430\u0442\u043e\u0433\u043e PVS \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0431\u0430\u0439\u0442, \u0442\u043e \u043e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0438\u0437 \u0441\u0436\u0430\u0442\u043e\u0433\u043e PVS \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u0439\u0442 0x00, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f. \u0413\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435:<\/p>\n<pre><code class=\"cpp\">    byte *Mod_DecompressVis (byte *in, model_t *model)     {         static byte  decompressed[MAX_MAP_LEAFS\/8];  \/\/ \u041b\u0438\u0441\u0442 = 1 \u0431\u0438\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u0433\u043e 65536 \/ 8 = 8 192 \u0431\u0430\u0439\u0442                                                      \/\/ \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e PVS.         int   c;         byte   *out;         int    row;          row = (model-&gt;vis-&gt;numclusters+7)&gt;&gt;3;\t         out = decompressed;          do         {             if (*in)            \/\/ \u042d\u0442\u043e \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0431\u0430\u0439\u0442, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u0442\u043e\u043c \u0436\u0435 \u0432\u0438\u0434\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u0436\u0430\u0442\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443.             {                 *out++ = *in++;                 continue;         } \t         c = in[1];              \/\/ \u041c\u044b \u043d\u0435 &quot;\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b\u0438&quot;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0431\u0430\u0439\u0442: \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442 (in[1]) \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c         in += 2;                \/\/ \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 PVS.         while (c)         {             *out++ = 0;             c--;         }           } while (out - decompressed &lt; row); \t         return decompressed;         }<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043e 255 \u0431\u0430\u0439\u0442 (255*8 \u043b\u0438\u0441\u0442\u044c\u0435\u0432), \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u043b\u044c \u0441 \u0447\u0438\u0441\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 255 \u0431\u0430\u0439\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a 511 \u0431\u0430\u0439\u0442 (511*8 \u043b\u0438\u0441\u0442\u044c\u0435\u0432) \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430: 0 \u2014 255 \u2014 0 \u2014 255<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">    \/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 80 \u043b\u0438\u0441\u0442\u044c\u044f\u043c\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 10 \u0431\u0430\u0439\u0442\u0430\u0445: \u0432\u0438\u0434\u0438\u043c\u044b\u0439=1, \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0439=0      \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 PVS          0000 0000    0000 0000  0000 0000   0000 0000    0011 1100     1011 1111    0000 0000    0000 0000    0000 0000   0000 0000         \u0414\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 PVS            0x00 0x00 0x00 0x00 0x39 0xBF 0x00 0x00 0x00 0x00               \/\/ !! \u0421\u0416\u0410\u0422\u0418\u0415!!                     \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0441\u0436\u0430\u0442\u044b\u0439 PVS          0000 0000    0000 1000  0011 1100     1011 1111    0000 0000    0000 1000            \u0414\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u0436\u0430\u0442\u044b\u0439 PVS            0x00 0x04 0x39 0xBF 0x00 0x04<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PVS \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u044c, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0430\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u0441\u0447\u0438\u0442\u0430\u044e\u0449\u0435\u043c\u0443\u0441\u044f \u0432 PVS \u0432\u0438\u0434\u0438\u043c\u044b\u043c, \u0442\u043e\u0436\u0435 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c\u0430\u044f:<\/p>\n<p>  <u>\u0412:<\/u> \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>i<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 PVS?<\/p>\n<p>  <u>\u041e:<\/u> \u0431\u0438\u0442\u043e\u0432\u044b\u043c \u0418 \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0439\u0442\u043e\u043c i\/8 PVS \u0438 1 &lt;&lt; (i % 8)<\/p>\n<pre><code class=\"cpp\">    char isVisible(byte* pvs, int i)     { \t\t \t    \/\/ i&gt;&gt;3 = i\/8     \t    \/\/ i&7  = i%8 \t     \t    return pvs[i&gt;&gt;3] & (1&lt;&lt;(i&7)) \t         }<\/code><\/pre>\n<p>  \u0422\u043e\u0447\u043d\u043e \u043a\u0430\u043a \u0438 \u0432 Quake1, \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u0440\u044e\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e: \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u0432 \u0438 \u0441\u0431\u0440\u043e\u0441\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f <code>int<\/code>. \u041f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u0430\u0434\u0440\u043e\u0432 <code>r_visframecount<\/code> \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432 <code>R_MarkLeaves<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 PVS \u0432\u0441\u0435 \u0437\u043e\u043d\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044e <code>visframe<\/code> \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>r_visframecount<\/code>.<\/p>\n<p>  \u041f\u043e\u0437\u0436\u0435 \u0432 \u043a\u043e\u0434\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u0437\u043b\u0430\/\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">    if (node-&gt;visframe == r_visframecount) \t{        \/\/ \u0423\u0437\u0435\u043b \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \t}<\/code><\/pre>\n<p>  <\/p>\n<h3>R_PushDlights: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 lightID \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 BSP \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c, \u0438 \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430.<\/p>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439:<\/p>\n<ul>\n<li><code>dlightframe<\/code> \u2014 \u044d\u0442\u043e \u0444\u043b\u0430\u0433 <code>int<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043c\u0435\u0442\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 (\u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0431\u0440\u043e\u0441\u0430 \u0432\u0441\u0435\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>r_dlightframecount<\/code>. \u0427\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0442 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b, <code>r_dlightframecount<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u0435\u043d <code>surf.dlightframe<\/code>.<\/li>\n<li><code>dlightbits<\/code> \u2014 \u044d\u0442\u043e \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 <code>int<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u044c.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>R_EdgeDrawing: \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f<\/h3>\n<p>  <code>R_EdgeDrawing<\/code> \u2014 \u044d\u0442\u043e \u043c\u043e\u043d\u0441\u0442\u0440 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445: <\/p>\n<p>  \u0421\u0442\u0435\u043a <code>surf_t<\/code> (\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 <code>m_surface_t<\/code>) \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a\u0435 \u0426\u041f.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surf_stack.png\"\/><\/p>\n<pre><code class=\"cpp\">    \/\/\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439                                                                          surf_t  *surfaces  ;   \/\/ \u041c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439                                                   surf_t  *surface_p ;   \/\/ \u0412\u0435\u0440\u0448\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439                                                     surf_t  *surf_max  ;   \/\/ \u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u043f\u0440\u0435\u0434\u0435\u043b \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439                                                  \/\/ \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f bsp-\u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 &quot;\u0441\u0437\u0430\u0434\u0438 \u0432\u043f\u0435\u0440\u0451\u0434&quot;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c                       \/\/ \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e, \u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434                              \/\/ surfaces[1] \u043a\u0430\u043a \u0444\u043e\u043d, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0435\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439               Note: \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 surfaces - \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c     Note: \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 surfaces - \u044d\u0442\u043e \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0441\u0442\u0435\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 BSP \u0441\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u0430\u0434. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u043a\u0441\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0437\u0436\u0435, \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0447\u0435\u043c \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0435\u043a\u0435, \u0442\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043a \u0442\u043e\u0447\u043a\u0435 \u043e\u0431\u0437\u043e\u0440\u0430). \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u00ab\u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c\u00bb \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440), \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 (\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435). \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0434\u043b\u044f \u043f\u043e\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0426\u041f.<\/p>\n<p>  \u0421\u0442\u0435\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 <code>R_EdgeDrawing<\/code>:<\/p>\n<pre><code class=\"cpp\">    void R_EdgeDrawing (void)     {         \/\/ \u041e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440: 64 \u041a\u0411         surf_t\tlsurfs[NUMSTACKSURFACES +((CACHE_SIZE - 1) \/ sizeof(surf_t)) + 1];          surfaces =  (surf_t *) (((long)&lsurfs[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));         surf_max = &surfaces[r_cnumsurfs];          \/\/ \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c 0 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442; \u043e\u043d\u0430 \u043f\u0443\u0441\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 0         \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0440\u0451\u0431\u0440\u0430         surfaces--;         R_SurfacePatch ();                  R_BeginEdgeFrame ();    \/\/ surface_p = &surfaces[2];\t                                 \/\/ \u0444\u043e\u043d - \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c 1,                                 \/\/ \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c 0 - \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0430 \t         R_RenderWorld          { \t    \tR_RenderFace     \t}     \t         R_DrawBEntitiesOnList                  R_ScanEdges          \/\/ \u0417\u0430\u043f\u0438\u0441\u044c Z-\u0431\u0443\u0444\u0435\u0440\u0430 (\u043d\u043e \u0431\u0435\u0437 \u0447\u0442\u0435\u043d\u0438\u044f)                                       {\t\t\t               for (iv=r_refdef.vrect.y ; iv&lt;bottom ; iv++)               {                 R_InsertNewEdges     \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 AET \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c GET                 (*pdrawfunc)();      \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                 D_DrawSurfaces       \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435               }\t                                                     \/\/ \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                 R_InsertNewEdges     \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 AET \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c GET                 (*pdrawfunc)();      \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                 D_DrawSurfaces       \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435          }          }<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438:  <\/p>\n<ul>\n<li><code>R_BeginEdgeFrame<\/code>: \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u0430\u0434\u0440\u0430.<\/li>\n<li><code>R_RenderWorld<\/code>: \u043e\u0431\u0445\u043e\u0434 BSP (\u0443\u0447\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u043e\u043d \u041d\u0415 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435):<br \/> \n<ul>\n<li>\u041a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c, \u0441\u0447\u0438\u0442\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a \u0441 \u043f\u0440\u043e\u043a\u0441\u0438 <code>surf_t<\/code>.<\/li>\n<li>\u041f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440.<\/li>\n<li>\u0422\u0430\u043a\u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 1\/Z \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Z-\u0431\u0443\u0444\u0435\u0440 \u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u043c\u0438.<\/li>\n<\/ul>\n<p>  <\/li>\n<li><code>R_DrawBEntitiesOnList<\/code>: \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442.<\/li>\n<li><code>R_ScanEdges<\/code>: \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0443\u0440\u043e\u0432\u043d\u044f:<br \/> \n<ul>\n<li>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440.<\/li>\n<li>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 (\u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a\u043e\u043c):<br \/>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/span_stack.png\"\/><br \/> \n<pre><code class=\"cpp\">    \/\/ \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                                                                 espan_t *span_p;       \/\/ \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432                       espan_t *max_span_p;   \/\/ \u041c\u0430\u043a\u0441. span_p \u0437\u0430 \u044d\u0442\u0438\u043c, \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430                 \/\/ \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0441\u0442\u0435\u043a \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 (basespans) \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a\u0435 \u0426\u041f                    void R_ScanEdges (void)     {         int    iv, bottom;         byte   basespans[MAXSPANS*sizeof(espan_t)+CACHE_SIZE];                        ...                       }<\/code><\/pre>\n<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043f\u043e \u044d\u043a\u0440\u0430\u043d\u0443.<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<br \/> \n<ul>\n<li>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440 \u0438\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440.<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<br \/> \n<ul>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u0441\u0442\u0435\u043a\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439.<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d: \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0438 \u0441\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432 \u043d\u0451\u043c \u0447\u0442\u043e-\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c: \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0438 \u0441\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u0412\u0438\u0434\u0435\u043e \u0440\u0430\u0431\u043e\u0442\u044b R_EdgeDrawing<\/h3>\n<p>  \u0412 \u0432\u0438\u0434\u0435\u043e \u043d\u0438\u0436\u0435 \u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 1024&#215;768. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 cvar <code>sw_drawflat 1<\/code>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0446\u0432\u0435\u0442\u0430\u043c\u0438:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/4o5GMdqh39U?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e:<\/p>\n<ol>\n<li>\u042d\u043a\u0440\u0430\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/li>\n<li>\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f. \u042d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u044d\u0448\u0430 \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 Pentium: \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e textureId \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u00ab\u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u00bb. \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440. \u041a\u043e\u0433\u0434\u0430 \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u041e\u0414\u041d\u041e\u0419 \u0433\u0440\u0443\u043f\u043f\u043e\u0439.<\/li>\n<li>\u041c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u043f\u044f\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/li>\n<li>\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043d\u0430\u0432\u0435\u0440\u0445\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043e\u043d\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 40% \u044d\u043a\u0440\u0430\u043d\u0430, \u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 10%. \u0422\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u044b \u0438 \u043e\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e.<\/li>\n<li>OMG, <i>\u043d\u0443\u043b\u0435\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0430<\/i> \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0433\u043e \u043c\u0438\u0440\u0430.<\/li>\n<\/ol>\n<p>  <\/p>\n<h3>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0435 \u0438\u0437\u043b\u0443\u0447\u0435\u043d\u0438\u0435: \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 24-\u0431\u0438\u0442\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432 RGB \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 6-\u0431\u0438\u0442\u043d\u044b\u0435 \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u043e\u0433\u043e (\u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u044f\u0440\u043a\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0438\u0437 R, G \u0438 B), \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u044b:<\/p>\n<p>  \u0427\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0430\u0440\u0445\u0438\u0432\u0435 <code>PAK<\/code> (24 \u0431\u0438\u0442\u0430):<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/3colors_01.jpg\"\/><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441 \u0434\u0438\u0441\u043a\u0430 \u0438 \u0440\u0435\u0441\u044d\u043c\u043f\u043b\u0438\u043d\u0433\u0430 \u0434\u043e 6-\u0431\u0438\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/3colors_01.gif\"\/><\/p>\n<p>  \u0410 \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435: \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0433\u0440\u0430\u043d\u0438 \u0434\u0430\u0451\u0442 \u0446\u0432\u0435\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,255]. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0446\u0432\u0435\u0442 \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0438\u0437 <code>pics\/colormap.pcx<\/code>:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/soft_rend_1_text.jpg\"\/><\/p>\n<p>  \u041a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442\u0441\u044f: \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,63].<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/soft_rend_0_lightmap.jpg\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 <code>pics\/colormap.pcx<\/code> \u0434\u0432\u0438\u0436\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b X \u0438 \u043e\u0441\u0432\u0435\u0449\u0451\u043d\u043d\u043e\u0441\u0442\u044c*63 \u043a\u0430\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 Y:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/COLORMAP_upper.jpg\"\/><\/p>\n<p>  \u0418 \u0432\u0443\u0430\u043b\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/soft_rend_2_surface.jpg\"\/><\/p>\n<p>  \u041b\u0438\u0447\u043d\u043e \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435: \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044f 64 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 256 \u0446\u0432\u0435\u0442\u043e\u0432\u2026 \u0432\u0441\u0435\u0433\u043e 256 \u0446\u0432\u0435\u0442\u0430\u043c\u0438!<\/p>\n<h3>\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439<\/h3>\n<p>  \u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043a \u0426\u041f \u0447\u0430\u0441\u0442\u044c Quake2 (\u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430 \u043d\u0438\u0436\u0435). \u041f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0434\u0432\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430:<\/p>\n<ul>\n<li>MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (mipmapping)<\/li>\n<li>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439: MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  \u041f\u0440\u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f 1\/Z \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/lightmap.jpg\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/mipmap.gif\"\/><\/p>\n<p>  \u0412\u043e\u0442 \u043c\u0438\u043d\u0438\u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 Quake2 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445: <a href=\"http:\/\/BilinearFiltering.zip\">\u0430\u0440\u0445\u0438\u0432<\/a>.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 13&#215;15 \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/q2.test.surface.mipmap3.jpg\"\/><br \/>  \u0423\u0440\u043e\u0432\u0435\u043d\u044c 3 MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440: \u0431\u043b\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 2&#215;2 \u0442\u0435\u043a\u0441\u0435\u043b\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/q2.test.surface.mipmap2.jpg\"\/><br \/>  \u0423\u0440\u043e\u0432\u0435\u043d\u044c 2 MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440: \u0431\u043b\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 4&#215;4 \u0442\u0435\u043a\u0441\u0435\u043b\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/q2.test.surface.mipmap1.jpg\"\/><br \/>  \u0423\u0440\u043e\u0432\u0435\u043d\u044c 1 MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440: \u0431\u043b\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 8&#215;8 \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/q2.test.surface.mipmap0.jpg\"\/><br \/>  \u0423\u0440\u043e\u0432\u0435\u043d\u044c 0 MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440: \u0431\u043b\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 16&#215;16 \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432.<\/p>\n<p>  \u041a\u043b\u044e\u0447 \u043a \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0442\u043e \u0432\u0441\u0451 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043c\u0438\u0440\u0430 (\u0448\u0438\u0440\u0438\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>extent<\/code>):<\/p>\n<ul>\n<li>\u041f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 Quake2 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (X \u0438\u043b\u0438 Y) \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u044b 256, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0440\u0430\u0442\u043d\u044b 16.<\/li>\n<li>\u0418\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043c\u0438\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438:<br \/> \n<ul>\n<li>\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f (\u0432 \u0442\u0435\u043a\u0441\u0435\u043b\u0430\u0445): LmpDim = PolyDim \/ 16 + 1<\/li>\n<li>\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (\u0432 \u0431\u043b\u043e\u043a\u0430\u0445): SurDim = LmpDim -1 = PolyDim \/ 16<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (3,4), \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u2014 (4,5) \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432, \u0430 \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c <i>\u0432\u0441\u0435\u0433\u0434\u0430<\/i> \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 (3,4) \u0431\u043b\u043e\u043a\u0430. \u0423\u0440\u043e\u0432\u043d\u0438 MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0431\u043b\u043e\u043a\u0430 \u0432 \u0442\u0435\u043a\u0441\u0435\u043b\u0430\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0432 \u0442\u0435\u043a\u0441\u0435\u043b\u0430\u0445.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surface_gen.jpg\"\/><\/p>\n<p>  \u0412\u0441\u0451 \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>R_DrawSurface<\/code>. \u0423\u0440\u043e\u0432\u0435\u043d\u044c MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (<code>surfmiptable<\/code>), \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">    static void\t(*surfmiptable[4])(void) = { \tR_DrawSurfaceBlock8_mip0, \tR_DrawSurfaceBlock8_mip1, \tR_DrawSurfaceBlock8_mip2, \tR_DrawSurfaceBlock8_mip3     };        R_DrawSurface     {     \tpblockdrawer = surfmiptable[r_drawsurf.surfmip];\t\t\t\t\t         \tfor (u=0 ; u&lt;r_numhblocks; u++)\t\t\t\t\t\t         \t\t(*pblockdrawer)();      }<\/code><\/pre>\n<p>  \u0412 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043d\u0438\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440: 0 \u2014 \u0441\u0435\u0440\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430, 1 \u2014 \u0436\u0451\u043b\u0442\u043e\u0433\u043e \u0438 2 \u2014 \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/soft_renderer_mipmapping.jpg\"\/><\/p>\n<p>  \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u043e\u043c \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 block[i][j] \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u0444\u0438\u043b\u044c\u0442\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f: lightmap[i][j],lightmap[i+1][j],lightmap[i][j+1] \u0438 lightmap[i+1][j+1]: \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0438 \u0442\u0440\u0451\u0445 \u0432\u043d\u0438\u0437\u0443 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u0435\u0441\u043e\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c. \u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Bilinear_filtering\">\u0441\u0442\u0430\u0442\u044c\u0435 Wikipedia<\/a> \u043e \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  <u>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435:<\/u><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/lightmap_inverted.jpg\"\/><br \/>  \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, 13&#215;15 \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/q2.test.surface.mipmap0_inverted.jpg\"\/><br \/>  \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c 0 MIP-\u0442\u0435\u043a\u0441\u0442\u0443\u0440 (16&#215;16 \u0431\u043b\u043e\u043a\u043e\u0432)=192&#215;224 \u0442\u0435\u043a\u0441\u0435\u043b\u0430.<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/surfaces\/quake00_outligned.jpg\"\/><\/p>\n<h3>\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439: \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  \u0414\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u0432\u0438\u0436\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u044e <code>malloc<\/code> \u0438 <code>free<\/code>, \u043e\u043d \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439. \u0411\u043b\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">    size = SURFCACHE_SIZE_AT_320X240;       pix = vid.width*vid.height;\t\t     if (pix &gt; 64000)\t\t\t\t         size += (pix-64000)*3;\t               size = (size + 8191) & ~8191;              sc_base = (surfcache_t *)malloc(size); \tsc_rover = sc_base;<\/code><\/pre>\n<p>  \u0420\u043e\u0432\u0435\u0440 <code>sc_rover<\/code> \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043d\u044f\u0442\u043e. \u041a\u043e\u0433\u0434\u0430 \u0440\u043e\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043a\u043e\u043d\u0446\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u043d \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0441\u0442\u0430\u0440\u044b\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438. \u041e\u0431\u044a\u0451\u043c \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/Surface%20Cache.jpg\"\/><\/p>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u043d\u043e\u0432\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0431\u043b\u043e\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">    memLoc = (int)&((surfcache_t *)0)-&gt;data[size];     \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a \u0440\u0430\u0437\u043c\u0435\u0440\u0430 + \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043f\u0430\u043c\u044f\u0442\u0438.          memLoc = (memLoc + 3) & ~3;                         \/\/ FCS: \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0434\u043e \u0447\u0438\u0441\u043b\u0430, \u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e 4          sc_rover = (surfcache_t *)( (byte *)new + size);<\/code><\/pre>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u0442\u0440\u044e\u043a \u0441 \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u044d\u0448\u0430 (\u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0430\u043c\u044f\u0442\u0438)<\/p>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c NULL (<code>((surfcache_t *)0)<\/code>) (\u043d\u043e \u0441 \u043d\u0435\u0439 \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438).<\/p>\n<h3>\u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445?<\/h3>\n<p>  \u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Quake2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u00ab\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0438 \u0431\u0435\u0437 \u0433\u043e\u043c\u043e\u0433\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438\u043b\u0438 \u043c\u0430\u0442\u0440\u0438\u0446 (\u043a\u043e\u0434 \u043d\u0438\u0436\u0435 \u0438\u0437 <code>R_ClipAndDrawPoly<\/code>):<\/p>\n<pre><code class=\"cpp\">    XscreenSpace = X \/ Z * XScale     YscreenSpace = Y \/ Z * YScale<\/code><\/pre>\n<p>  \u0413\u0434\u0435 XScale \u0438 YScale \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u0441\u0442\u043e\u0440\u043e\u043d \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>  \u0422\u0430\u043a\u043e\u0435 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 OpenGL \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f GL_PROJECTION + W:<\/p>\n<pre><code class=\"cpp\">    \u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:     =======================                                                  \u0412\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0433\u043b\u0430\u0437\u0430                                                                                                      |      X                                                                           |      Y                                             |      Z                                             |      1      --------------------------------------------------               \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f   |                                             |        XScale       0        0        0     |     XClip           0      YScale      0        0     |     YClip           0         0        V1       V2    |     ZClip           0         0        -1       0     |     WClip                                       \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u0440\u0435\u0437\u043a\u0438:          ================                             XClip =  X * XScale                                                   YClip =  Y * YScale                                                        ZClip =  \/                                                   WClip = -Z             \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b NDC \u0441 \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c W:      =========                             XNDC = XClip\/WClip =  X * XScale \/ -Z                       YNDC = YClip\/WClip =  Y * YScale \/ -Z<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043a\u043e\u0434: \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445? \u041d\u0435\u0442!<\/p>\n<h3>R_DrawEntitiesOnList: \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h3>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0443\u0436\u0435 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/soft_rend_2_surface.jpg\"\/><\/p>\n<p>  \u0414\u0432\u0438\u0436\u043e\u043a \u0442\u0430\u043a\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b 16-\u0431\u0438\u0442\u043d\u044b\u0439 z-\u0431\u0443\u0444\u0435\u0440 (\u043e\u043d \u0431\u044b\u043b \u0437\u0430\u043f\u0438\u0441\u0430\u043d, \u043d\u043e \u0435\u0449\u0451 \u043d\u0435 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0441\u044f):<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/depthBeforeEntities.jpg\"\/><\/p>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u0435\u043c \u043e\u043d\u0438 \u00ab\u044f\u0440\u0447\u0435\u00bb (\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c OpenGL, \u0433\u0434\u0435 \u0431\u043b\u0438\u0436\u0435 \u2014 \u044d\u0442\u043e \u00ab\u0442\u0435\u043c\u043d\u0435\u0435\u00bb). \u0422\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 Z-\u0431\u0443\u0444\u0435\u0440\u0435 \u0432\u043c\u0435\u0441\u0442\u043e Z \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f 1\/Z.<\/p>\n<p>  16-\u0431\u0438\u0442\u043d\u044b\u0439 z-\u0431\u0443\u0444\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <code>d_pzbuffer<\/code>:<\/p>\n<pre><code class=\"cpp\">   short *d_pzbuffer;<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, 1\/Z \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u041c\u0430\u0439\u043a\u043b\u0430 \u0410\u0431\u0440\u0430\u0448\u0430 \u00abConsider the Alternatives: Quake&#8217;s Hidden-Surface Removal\u00bb.<\/p>\n<p>  \u041e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <code>D_DrawZSpans<\/code>:<\/p>\n<pre><code class=\"cpp\">    zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c 1\/Z, \u0442\u043e \u0432\u043e\u0442 \u0441\u0442\u0430\u0442\u044c\u044f \u041a\u043e\u043a-\u041b\u0438\u043c \u041b\u043e (Kok-Lim Low): <a href=\"http:\/\/fabiensanglard.net\/quake2\/Perspective-Correct%20Interpolation.pdf\">PDF<\/a>.<\/p>\n<p>  Z-\u0431\u0443\u0444\u0435\u0440, \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u044f, \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445 (\u0438\u0433\u0440\u043e\u043a\u0430\u0445 \u0438 \u0432\u0440\u0430\u0433\u0430\u0445):<\/p>\n<ul>\n<li>Quake1 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u0430\u0434\u0440\u044b, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f LERP (<code>R_AliasSetUpLerpData<\/code>) \u0434\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438.<\/li>\n<li>Quake1 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a BLOB: \u044d\u0442\u043e \u043d\u0435\u0442\u043e\u0447\u043d\u044b\u0439, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 Quake2 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f BoundingBox \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0445 \u0433\u0440\u0430\u043d\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c.<\/li>\n<\/ul>\n<p>  \u0412 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\u041d\u0435 \u0432\u0441\u0435 \u0442\u0435\u043d\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f.<\/li>\n<li>\u041f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u0438\u043c\u0435\u044e\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0413\u0443\u0440\u043e \u0441 \u0436\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f (<code>{-1, 0, 0}<\/code> \u043e\u0442 <code>R_AliasSetupLighting<\/code>).<\/li>\n<li>\u0418\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430.<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/quake2_withEntities.jpg\"\/><\/p>\n<h3>\u041f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0432 R_DrawAlphaSurfaces<\/h3>\n<p>  \u041f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u044f \u0443\u0436\u0435 \u0434\u0435\u0441\u044f\u0442\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e \u044d\u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a \u044f \u043c\u043e\u0433\u0443 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f <b>\u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0438\u043c<\/b>.<\/p>\n<p>  \u041f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\u041f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u0441\u0442\u0432\u043e.<\/li>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0440\u0435\u0431\u0440\u0430.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0438\u0441\u043a\u0430\u0436\u0430\u0435\u0442\u0441\u044f (\u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u043e\u0434\u0430), \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u041e\u0417\u0423.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f, \u0442\u043e \u0435\u0451 \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u0441 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043a\u0430\u0434\u0440\u043e\u0432.<\/p>\n<p>  \u0422\u0440\u044e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f <code>pics\/colormap.pcx<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0438\u0437 \u043a\u044d\u0448\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u043c (\u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u0430\u0434\u0440\u043e\u0432):<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 X, \u0430 \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 Y. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/COLORMAP_lower.jpg\"\/><\/p>\n<p>  \u0412 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043a\u0430\u0434\u0440 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/dbd\/6f0\/94f\/dbd6f094f9c24dd798ead00bdcddafae.gif\"\/><\/p>\n<h3>R_CalcPalette: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0438 \u0433\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f<\/h3>\n<p>  \u0414\u0432\u0438\u0436\u043e\u043a \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b\u00bb \u0438 \u00ab\u0432\u044b\u0431\u043e\u0440 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b\u00bb, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u0443\u044e \u043f\u0430\u043b\u0438\u0442\u0440\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/quake_damage.jpg\"\/><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u00ab\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0443\u00bb \u0432 DLL \u0438\u0433\u0440\u044b \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 RGBA <code>float player_state_t.blend[4]<\/code> \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0438\u0433\u0440\u0435. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0442\u0438, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 <code>refdef.blend[4]<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f DLL \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 (\u043d\u0443 \u0438 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435!). \u041f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043e\u043d\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u0430\u0436\u0434\u044b\u043c\u0438 256 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 RGB \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u041f\u043e\u0441\u043b\u0435 \u0433\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043f\u0430\u043b\u0438\u0442\u0440\u0430 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443.<\/p>\n<p>  <code>R_CalcPalette<\/code> \u0432 <code>r_main.c<\/code>:<\/p>\n<pre><code class=\"cpp\">    \/\/ newcolor = color * alpha + blend * (1 - alpha)          alpha = r_newrefdef.blend[3];          premult[0] = r_newrefdef.blend[0]*alpha*255;     premult[1] = r_newrefdef.blend[1]*alpha*255;     premult[2] = r_newrefdef.blend[2]*alpha*255;      one_minus_alpha = (1.0 - alpha);      in = (byte *)d_8to24table;     out = palette[0];          for (i=0 ; i&lt;256 ; i++, in+=4, out+=4)         for (j=0 ; j&lt;3 ; j++)             v = premult[j] + one_minus_alpha * in[j];<\/code><\/pre>\n<p>  <u><b>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/b><\/u> \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u043b\u044f \u043d\u0435\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0433\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e (\u0432 <code>R_GammaCorrectAndSetPalette<\/code>):<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/gamma_correction.jpg\"\/><\/p>\n<p>  \u0413\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0451\u043c\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0430\u044f \u0432 \u0441\u0435\u0431\u044f \u0432\u044b\u0437\u043e\u0432 <code>pow<\/code> \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u2026 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0435\u0451 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 R, G \u0438 B \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430!<\/p>\n<pre><code class=\"cpp\">      int newValue = 255 * pow ( (value+0.5)\/255.5 , gammaFactor ) + 0.5;<\/code><\/pre>\n<p>  \u0412\u0441\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 <code>pow<\/code>, \u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0448\u0435\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0440\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 256 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u2014 \u044d\u0442\u043e <i>\u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e<\/i>.<\/p>\n<p>  \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0432\u043e\u0441\u0435\u043c\u044c\u044e \u0431\u0438\u0442\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b, \u043f\u043e\u043b\u043d\u0443\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 256 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">    void Draw_BuildGammaTable (void)     {         int     i, inf;         float   g;          g = vid_gamma-&gt;value;          if (g == 1.0)         {             for (i=0 ; i&lt;256 ; i++)                 sw_state.gammatable[i] = i;             return;         } \t         for (i=0 ; i&lt;256 ; i++)         {             inf = 255 * pow ( (i+0.5)\/255.5 , g ) + 0.5;             if (inf &lt; 0)                 inf = 0;             if (inf &gt; 255)                 inf = 255;             sw_state.gammatable[i] = inf;         }     }<\/code><\/pre>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 (<code>sw_state.gammatable<\/code>) \u0438 \u043e\u043d\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0433\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">    void R_GammaCorrectAndSetPalette( const unsigned char *palette )     {         int i;          for ( i = 0; i &lt; 256; i++ )         {             sw_state.currentpalette[i*4+0] = sw_state.gammatable[palette[i*4+0]];             sw_state.currentpalette[i*4+1] = sw_state.gammatable[palette[i*4+1]];             sw_state.currentpalette[i*4+2] = sw_state.gammatable[palette[i*4+2]];         }          SWimp_SetPalette( sw_state.currentpalette );     }<\/code><\/pre>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u0416\u041a-\u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u043d\u0435\u0442 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0433\u0430\u043c\u043c\u043e\u0439, \u043a\u0430\u043a \u0443 \u042d\u041b\u0422\u2026 \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u043e <a href=\"http:\/\/developer.nvidia.com\/book\/export\/html\/181\">\u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u042d\u041b\u0422-\u044d\u043a\u0440\u0430\u043d\u043e\u0432<\/a>!<\/p>\n<h3>\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 Cloc, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430: \u0432 \u044d\u0442\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043d\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f 14 874 \u0441\u0442\u0440\u043e\u043a. \u042d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 10% \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430, \u043d\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u044f\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<pre><code class=\"cpp\">    $ cloc ref_soft\/           39 text files.           38 unique files.            4 files ignored.      http:\/\/cloc.sourceforge.net v 1.53  T=0.5 s (68.0 files\/s, 44420.0 lines\/s)     -------------------------------------------------------------------------------     Language                     files          blank        comment           code     -------------------------------------------------------------------------------     C                               17           2459           2341           8976     Assembly                         9           1020            880           3849     C\/C++ Header                     7            343            293           2047     Teamcenter def                   1              0              0              2     -------------------------------------------------------------------------------     SUM:                            34           3822           3514          14874     -------------------------------------------------------------------------------<\/code><\/pre>\n<p>  \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0434\u0435\u0432\u044f\u0442\u0438 \u0444\u0430\u0439\u043b\u0430\u0445 <code>r_*.asm<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 25% \u043e\u0431\u044a\u0451\u043c\u0430 \u0432\u0441\u0435\u0439 \u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0430, \u0438 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. \u0414\u0443\u043c\u0430\u044e, \u043e\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0451\u043c \u0442\u0440\u0443\u0434\u0430, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440: \u0431\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 x86 \u041c\u0430\u0439\u043a\u043b\u043e\u043c \u0410\u0431\u0440\u0430\u0448\u0435\u043c. \u0411\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 Pentium, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u0432 \u0435\u0433\u043e \u043a\u043d\u0438\u0433\u0435 \u00abGraphics Programming Black Book\u00bb, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445.<\/p>\n<p>  <u><b>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/b><\/u> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u043d\u0438\u0433\u0435 \u0438 \u0432 \u043a\u043e\u0434\u0435 Quake2 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>ScanEdges<\/code>).<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433<\/h3>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/Visual%20Studio%20Team%20Profiling.jpg\"\/><\/p>\n<p>  \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b, \u0432\u0441\u0435 \u043e\u043d\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 Visual Studio 2008:<\/p>\n<ul>\n<li>AMD Code Analysis<\/li>\n<li>Intel VTune Amplifier XE 2011<\/li>\n<li>Visual Studio Team Profiler<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 <i>\u043e\u0447\u0435\u043d\u044c<\/i> \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Vtune \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u0437 \u041e\u0417\u0423 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c (<code>BitBlit<\/code>), \u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u044b \u0443\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0438\u0445.<\/p>\n<p>  \u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440\u0430\u043c\u0438 Intel \u0438 AMD \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 (\u0438 \u044f \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0437\u043e\u0445\u0438\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c), \u043d\u043e \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 VS 2008 Team \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f\u2026 \u0445\u043e\u0442\u044f \u044f \u0438 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0435\u0433\u043e: \u0438\u0433\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u0442\u0440\u0438 \u043a\u0430\u0434\u0440\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0438 \u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437 20-\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0439 \u0438\u0433\u0440\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0446\u0435\u043b\u044b\u0439 \u0447\u0430\u0441!<\/p>\n<p>  <u>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433 VS 2008 Team edition:<\/u><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/soft\/soft_profiler.jpg\"\/><\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0441\u0430\u043c\u0438 \u0437\u0430 \u0441\u0435\u0431\u044f:<\/p>\n<ul>\n<li>\u0417\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043e\u0448\u0435\u043b\u043e\u043c\u043b\u044f\u044e\u0442: 89% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 DLL.<\/li>\n<li>\u0418\u0433\u0440\u043e\u0432\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0435\u0434\u0432\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u0430: 0%.<\/li>\n<li>\u041d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0432\u0443\u043a\u043e\u0432\u0430\u044f DLL DirectX.<\/li>\n<li>\u0412 <code>libc<\/code> \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u0432 \u044f\u0434\u0440\u0435 quake.exe.<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/soft\/soft_profiler_rend_dll_module.jpg\"\/><\/p>\n<p>  \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0439 \u043d\u0430 \u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 ref_soft.dll:<\/p>\n<ul>\n<li>\u041a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0432\u044b\u0448\u0435, \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0430\u0439\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430:<br \/> \n<ul>\n<li>\u041e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b (33%) \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c Z-\u0431\u0443\u0444\u0435\u0440\u0430 (<code>D_DrawZSpans<\/code>).<\/li>\n<li>\u041e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b (22%) \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0432 \u0437\u0430\u043a\u0430\u0434\u0440\u043e\u0432\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 (<code>D_DrawZSpans16<\/code>).<\/li>\n<li>\u041e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b (13%) \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u043a\u044d\u0448\u0430.<\/li>\n<\/ul>\n<\/li>\n<li>\u0417\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b:<br \/> \n<ul>\n<li><code>R_LeadingEdge<\/code><\/li>\n<li><code>R_GenerateSpans<\/code><\/li>\n<li><code>R_TrailingEdge<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <u>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433 Intel VTune:<\/u><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/ref_sof_full.jpg\"\/><\/p>\n<p>  \u0417\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>18% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u0432: \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u041e\u0417\u0423 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c (<code>BitBlit<\/code>).<\/li>\n<li>34% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 (<code>D_DrawSurfaces<\/code>).<\/li>\n<li>8% \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043e LERP \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432\/\u0432\u0440\u0430\u0433\u043e\u0432 (<code>R_AliasPreparePoints<\/code>).<\/li>\n<\/ul>\n<p>  \u0410 \u0432\u043e\u0442 \u0431\u043e\u043b\u0435\u0435 <a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/profiling_ref_sof.jpg\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433 ref_sof Quake2<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e VTune.<\/p>\n<p>  <u>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433 AMD Code Analysis<\/u><\/p>\n<p>  \u042f\u0434\u0440\u043e <a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/AMD_Profiler_quake2_kernel.png\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 ref_sof <a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/AMD_Profiler_quake2_ref_sof.png\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h3>\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440<\/h3>\n<p>  \u042f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440 (\u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433\u0443 <a href=\"http:\/\/www.flipcode.com\/archives\/Texturing_As_In_Unreal.shtml\">\u043f\u043e\u0445\u043e\u0436\u0435\u043c\u0443 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 Unreal<\/a> (<a href=\"http:\/\/fd.fabiensanglard.net\/quake2\/unreal_kernel_filtering.png\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>)). \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u043c, \u0442\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u0435 <code>D_DrawSpans16<\/code> \u0432 <code>ref_soft\/r_scan.c<\/code>:<\/p>\n<p>  \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (X,Y) \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 <code>pspan-&gt;u<\/code> and <code>pspan-&gt;v<\/code>, \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432 <code>spancount<\/code> \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c.<\/p>\n<p>  \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440: <code>s<\/code> \u0438 <code>t<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0443\u044e\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e) <code>sstep<\/code> \u0438 <code>tstep<\/code> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440.<\/p>\n<p>  \u0423 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u00abSzilard Biro\u00bb, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433\u0430 Unreal I:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/d38\/270\/015\/d38270015eae469e83b5aebaaeb56e61.gif\"\/><\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u0441 \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043c\u043e\u0451\u043c <a href=\"https:\/\/github.com\/fabiensanglard\/Quake-2\">\u0444\u043e\u0440\u043a\u0435 Quake2 \u043d\u0430 github<\/a>. \u0414\u0438\u0437\u0435\u0440\u0438\u043d\u0433 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435\u043c cvar sw_texfilt \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 1.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0434\u0438\u0437\u0435\u0440\u0438\u043d\u0433 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 Unreal 1:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/318\/f33\/d6d\/318f33d6d194469492f3bcd2841a1474.gif\"\/><\/p>\n<h3>\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440 OpenGL<\/h3>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/glRendererStruct.png\"\/><\/p>\n<p>  Quake2 \u0441\u0442\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c, \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c. \u041e\u043d \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 24-\u0431\u0438\u0442\u043d\u043e\u043c\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044e \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/renderer.gif\"\/><\/p>\n<p>  \u0421 <b>\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/b> \u0432\u0435\u0440\u0441\u0438\u044f \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\u0411\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f<\/li>\n<li>\u0426\u0432\u0435\u0442\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/li>\n<li>\u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0430 30% \u0432 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445<\/li>\n<\/ul>\n<p>  \u041d\u0435 \u043c\u043e\u0433\u0443 \u0443\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0446\u0438\u0442\u0430\u0442\u044b \u0438\u0437 \u00abMasters of Doom\u00bb \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0414\u0436\u043e\u043d \u0420\u043e\u043c\u0435\u0440\u043e \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u0446\u0432\u0435\u0442\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 <i>[\u043f\u0440\u0438\u043c. \u043f\u0435\u0440.: \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 Quake 2 \u043e\u043d \u0443\u0436\u0435 \u043f\u043e\u043a\u0438\u043d\u0443\u043b id Software \u0438 \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e Ion Storm]<\/i>:<\/p>\n<blockquote><p>\u0417\u0430\u0442\u0435\u043c \u0420\u043e\u043c\u0435\u0440\u043e \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043a \u0441\u0442\u0435\u043d\u0434\u0443 id [&#8230;].<\/p>\n<p>  \u041e\u043d \u043f\u0440\u043e\u0431\u0438\u043b\u0441\u044f \u0441\u043a\u0432\u043e\u0437\u044c \u0442\u043e\u043b\u043f\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0434\u0435\u043c\u043e Quake II. \u0415\u0433\u043e \u043b\u0438\u0446\u043e \u0441\u0442\u0430\u043b\u043e \u0436\u0451\u043b\u0442\u044b\u043c, \u0430 \u0447\u0435\u043b\u044e\u0441\u0442\u044c \u043e\u0442\u0432\u0438\u0441\u043b\u0430: <b>\u0446\u0432\u0435\u0442\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435!<\/b> \u0420\u043e\u043c\u0435\u0440\u043e \u043d\u0435 \u043c\u043e\u0433 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u0432\u0438\u0434\u0438\u0442. \u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0431\u044b\u043b \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u043f\u043e\u0434\u0437\u0435\u043c\u0435\u043b\u044c\u0435 \u0432\u043e\u0435\u043d\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u0441\u0442\u0440\u0435\u043b\u044f\u043b \u0438\u0437 \u043e\u0440\u0443\u0436\u0438\u044f, \u0436\u0451\u043b\u0442\u044b\u0439 \u043b\u0443\u0447 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0436\u0451\u043b\u0442\u044b\u0439 \u0441\u0432\u0435\u0442 \u043d\u0430 \u0441\u0442\u0435\u043d\u044b. \u041e\u043d \u0431\u044b\u043b \u0441\u043b\u0430\u0431\u044b\u043c, \u043d\u043e \u0420\u043e\u043c\u0435\u0440\u043e \u0432\u0438\u0434\u0435\u043b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0446\u0432\u0435\u0442\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435. \u0412 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d \u043e\u0449\u0443\u0442\u0438\u043b \u0442\u0435 \u0436\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043b \u0432 Softdisk, \u043a\u043e\u0433\u0434\u0430 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0443\u0432\u0438\u0434\u0435\u043b Dangerous Dave in Copyright Infringement <i>[\u043f\u0440\u0438\u043c. \u043f\u0435\u0440.: \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u041a\u0430\u0440\u043c\u0430\u043a\u043e\u043c \u0432 1990 \u0433\u043e\u0434\u0443 \u0434\u0435\u043c\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440\u0430 \u043d\u0430 PC \u0441 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0430]<\/i>.<\/p>\n<p>  \u00ab\u0422\u0432\u043e\u044e \u043c\u0430\u0442\u044c\u00bb, \u2014 \u043f\u0440\u043e\u0431\u043e\u0440\u043c\u043e\u0442\u0430\u043b \u043e\u043d. \u041a\u0430\u0440\u043c\u0430\u043a\u0443 \u0441\u043d\u043e\u0432\u0430 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0438\u0432\u0438\u0442\u044c \u0435\u0433\u043e.<\/p><\/blockquote>\n<p>  \u042d\u0442\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 Daikatana.<\/p>\n<p>  \u0421 <b>\u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430<\/b> \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043d\u0430 50% \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 (\u0441\u043c. \u00ab\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043a\u043e\u0434\u0430\u00bb \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b). \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u043b\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u044b. \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f\/\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0432\u0435\u0440\u0441\u0438\u044f:<\/p>\n<ul>\n<li>Z-\u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0442\u0435\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 (\u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e Z-\u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u0435\u043b\u0430 \u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 VQuake \u0434\u043b\u044f V2200<\/li>\n<li>\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0438\u043f\u043e\u0432 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u041e\u0417\u0423 Z-\u0431\u0443\u0444\u0435\u0440\u0430 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438.<\/li>\n<li>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0430 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0451\u0431\u0435\u0440 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0451\u0431\u0435\u0440.<\/li>\n<li>\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 (\u0438 \u0432 RGB \u0432\u043c\u0435\u0441\u0442\u043e \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0439 \u0441\u0435\u0440\u043e\u0433\u043e): \u0432 \u0426\u041f \u044d\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438.<\/li>\n<\/ul>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 OpenGL \u0431\u043e\u043b\u044c\u0448\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0447\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c: \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043d\u0430 \u043b\u0435\u0442\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0430\u0442\u043b\u0430\u0441 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440.<\/p>\n<p>  <b><u>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0430\u043a\u0442:<\/u><\/b> \u043a\u0430\u0434\u0440 Quake2 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e 600-900 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432: \u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435.<\/p>\n<h3>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u0424\u0430\u0437\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430 \u0438 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0435\u0451 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0443:<\/p>\n<pre><code class=\"cpp\">        R_RenderView         {                        R_PushDlights          \/\/ \u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435             R_SetupFrame             R_SetFrustum             R_SetupGL              \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 GL_MODELVIEW \u0438 GL_PROJECTION                          R_MarkLeaves           \/\/ \u0420\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PVS \u0438 \u043f\u043e\u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432                          R_DrawWorld            \/\/ \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0443\u0440\u043e\u0432\u043d\u044f, \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c BoundingBox             {                             }                          R_DrawEntitiesOnList   \/\/ \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439              R_RenderDlights        \/\/ \u0421\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f                  R_DrawParticles        \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0447\u0430\u0441\u0442\u0438\u0446              R_DrawAlphaSurfaces    \/\/ \u041f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0441 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u044c\u0444\u0430-\u043a\u0430\u043d\u0430\u043b\u0430              R_Flash                \/\/ \u041f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u044b (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438 \u0442.\u043f...)         }<\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u044d\u0442\u0430\u043f\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u0432\u0438\u0434\u0435\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u0432\u0438\u0436\u043e\u043a \u00ab\u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u00bb:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 75.0019%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/DYBrqiKnemI?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\u041c\u0438\u0440.<\/li>\n<li>\u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0432 Quake2 \u043e\u043d\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u00abalias\u00bb).<\/li>\n<li>\u0427\u0430\u0441\u0442\u0438\u0446\u044b.<\/li>\n<li>\u041f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438.<\/li>\n<li>\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u044b.<\/li>\n<\/ul>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432\u0435\u0440\u0448\u0438\u043d. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e <code>DrawTextureChains<\/code> \u0438 <code>R_BlendLightmaps<\/code> \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u0443\u0441\u043a\u0435 \u043a\u043e\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">        R_DrawWorld         {             \/\/\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u0438\u0440\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 100% \u043f\u0440\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u041f\u0415\u0420\u0412\u042b\u0419 \u043f\u0440\u043e\u0445\u043e\u0434 (\u0446\u0432\u0435\u0442\u0430) \u0431\u0435\u0437 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f              R_RecursiveWorldNode    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440             {                 \/\/ \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 PVS \u0441 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e BBox\/\u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438                 \/\/ \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435!                                   \/\/ \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u043c\u043e: \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433                 GL_RenderLightmappedPoly                 {                    if ( is_dynamic )                    {                                         }                    else                    {                                         }                 }             }                          \/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u0412\u0422\u041e\u0420\u041e\u0419 \u043f\u0440\u043e\u0445\u043e\u0434)             DrawTextureChains        \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 bindTexture.             {                 for ( i = 0, image=gltextures ; i&lt;numgltextures ; i++,image++)                 for ( ; s ; s=s-&gt;texturechain)                     R_RenderBrushPoly (s)                     {                     }             }                          \/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u0412\u0422\u041e\u0420\u041e\u0419 \u043f\u0440\u043e\u0445\u043e\u0434: \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f)             R_BlendLightmaps             {                 \/\/ \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f                                  \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f                 if ( gl_dynamic-&gt;value )                 {                 LM_InitBlock                 GL_Bind                 for ( surf = gl_lms.lightmap_surfaces[0]; surf != 0; surf = surf-&gt;lightmapchain )                 {                     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u0430. \u0415\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u043b\u043e\u043a \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0435\u0433\u043e                                       }                 }             }                          R_DrawSkyBox                          R_DrawTriangleOutlines         }<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u0440\u0430<\/h3>\n<p>  \u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>R_DrawWorld<\/code>. \u0412\u0435\u0440\u0448\u0438\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u044f\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/li>\n<li>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b.<\/li>\n<li>\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b.<\/li>\n<li>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/li>\n<li>\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  \u0412 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0435 OpenGL \u043d\u0435\u0442 \u00abSurface\u00bb: \u0446\u0432\u0435\u0442\u0430 \u0438 \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443 \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0435\u0451 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b:<\/p>\n<ol>\n<li>\u0426\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e OpenGL GL_TEXTURE0.<\/li>\n<li>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e OpenGL GL_TEXTURE1.<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/li>\n<\/ol>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u041d\u0415 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0430:<\/p>\n<ol>\n<li>\u0421\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.<\/li>\n<li>\u0426\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e OpenGL GL_TEXTURE0.<\/li>\n<li>\u0412\u0435\u0440\u0448\u0438\u043d\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b.<\/li>\n<li>\u0421\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.<\/li>\n<li>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e OpenGL GL_TEXTURE0.<\/li>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/li>\n<\/ol>\n<p>  <\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438<\/h3>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u044f \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u0441\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c:<\/p>\n<ul>\n<li>\u0426\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b<\/li>\n<li>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f<\/li>\n<\/ul>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 OpenGL gDEBugger \u043c\u043e\u0436\u043d\u043e \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/gDEBugger.jpg\"\/><\/p>\n<p>  \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b (textureID). \u0421\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0430\u0442\u043b\u0430\u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0432 quake2 \u00ab\u0431\u043b\u043e\u043a\u043e\u043c\u00bb) \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/quake2-Context1-Texture1025level0.png\"\/><\/p>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0435, \u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432 \u0430\u0442\u043b\u0430\u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440?<\/p>\n<p>  \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 <b>\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440<\/b>:<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u043a \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u0435\u043d\u044f\u043b \u0441\u0432\u043e\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0436\u0435. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 (<code>glBindTexture<\/code>). \u0412\u043e\u0442 \u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">     for(i=0 ; i &lt; polys.num ; i++)           {          glBindTexture(polys[i].textureColorID , GL_TEXTURE0);          glBindTexture(polys[i].textureLightMapID , GL_TEXTURE1);          RenderPoly(polys[i].vertices);      }<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0446\u0432\u0435\u0442\u043e\u0432\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u0442\u043e \u0442\u0443\u0442 \u043c\u0430\u043b\u043e \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e Quake2 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0430\u0442\u043b\u0430\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043d\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c \u0438\u0437 BSP. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u0433\u043e, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0430\u0442\u043b\u0430\u0441\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">     glBindTexture(polys[textureChain[0]].textureLightMapID , GL_TEXTURE1);         for(i=0 ; i &lt; textureChain.num ; i++)           {          glBindTexture(polys[textureChain[i]].textureColorID , GL_TEXTURE0);          RenderPoly(polys[textureChain[i]].vertices);      }<\/code><\/pre>\n<p>  \u0412 \u0432\u0438\u0434\u0435\u043e \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u00ab\u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u00bb: \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u043d\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u043b\u043e\u043a\u0430 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 75.0019%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/hMog9IMohGw?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u0430 \u043f\u0440\u043e\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0441\u0437\u0430\u0434\u0438 \u0432\u043f\u0435\u0440\u0451\u0434.<\/p>\n<h3>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0437\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u044b \u0432\u043b\u0438\u044f\u043d\u0438\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f (<code>R_PushDlights<\/code>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0449\u0430\u044f \u0432 \u0441\u0435\u0431\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0432\u0435\u0442\u0430, \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (<code>R_BuildLightMap<\/code>).<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 17&#215;17, \u0444\u0430\u0437\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430, \u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>qglTexSubImage2D<\/code> <b>\u043e\u0447\u0435\u043d\u044c<\/b> \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f.<\/p>\n<p>  \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 128&#215;128, \u0435\u0433\u043e id=1024. \u0421\u043c. \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f\u00bb \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443 \u0432 \u0430\u0442\u043b\u0430\u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/17d\/a83\/29f\/17da8329fe814c6f82d228801f863bee.gif\"\/><br \/>  <i>1. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f. 2. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430. 3. \u0427\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u044c \u043a\u0430\u0434\u0440\u043e\u0432.<\/i><\/p>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u0435\u0441\u043b\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433. \u0420\u043e\u0432\u0435\u0440 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043b\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0430\u043c\u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u041a\u0430\u043a \u044f \u0441\u043a\u0430\u0437\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u0432 OpenGL-\u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 \u043d\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u00ab\u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438\u00bb (\u00absurface\u00bb). \u041a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443 \u0438 \u041d\u0415 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0425\u043e\u0442\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c, \u043e\u043d\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u041e\u0417\u0423: \u0435\u0441\u043b\u0438 \u043d\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0449\u0430\u044f \u0432 \u0441\u0435\u0431\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u043d\u0435\u0451 \u0441\u0432\u0435\u0442\u043e\u043c. \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 textureId=1024 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u0410\u0442\u043b\u0430\u0441\u044b \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 Quake2 \u00ab\u0431\u043b\u043e\u043a\u0430\u043c\u0438\u00bb (\u00abBlock\u00bb), \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 128&#215;128 \u0442\u0435\u043a\u0441\u0435\u043b\u043e\u0432 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0440\u0435\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438:<\/p>\n<ul>\n<li><code>LM_InitBlock<\/code>: \u0441\u0431\u0440\u043e\u0441 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u043c.<\/li>\n<li><code>LM_UploadBlock<\/code>: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b.<\/li>\n<li><code>LM_AllocBlock<\/code>: \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  \u0412 \u0432\u0438\u0434\u0435\u043e \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u0438. \u0417\u0434\u0435\u0441\u044c \u0434\u0432\u0438\u0436\u043e\u043a \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u00ab\u0422\u0435\u0442\u0440\u0438\u0441\u00bb: \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442, \u043a\u0443\u0434\u0430 \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0441\u0430\u043c\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 75.0019%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/8r_F0QiU-VM?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0440\u043e\u0432\u0435\u0440 (<code>int gl_lms.allocated[BLOCK_WIDTH]<\/code>) \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e \u0432\u0441\u0435\u0439 \u0448\u0438\u0440\u0438\u043d\u0435, \u043a\u0430\u043a\u0443\u044e \u0432\u044b\u0441\u043e\u0442\u0443 \u0437\u0430\u043d\u044f\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">    \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e &quot;best&quot; \u043b\u0443\u0447\u0448\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u0442\u044c &quot;bestHeight&quot;     \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e &quot;best2&quot; \u041d\u0423\u0416\u041d\u041e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u0442\u044c &quot;tentativeHeight&quot;         static qboolean LM_AllocBlock (int w, int h, int *x, int *y)     {         int        i, j;         int        best, best2;          \/\/FCS: \u043d\u0430 \u044d\u0442\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f         best = BLOCK_HEIGHT;          for (i=0 ; i&lt;BLOCK_WIDTH-w ; i++)         {             best2 = 0;              for (j=0 ; j&lt;w ; j++)             {                 if (gl_lms.allocated[i+j] &gt;= best)                     break;                 if (gl_lms.allocated[i+j] &gt; best2)                     best2 = gl_lms.allocated[i+j];             }             if (j == w)             { \/\/ \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e                 *x = i;                 *y = best = best2;             }         }          if (best + h &gt; BLOCK_HEIGHT)             return false;          for (i=0 ; i&lt;w ; i++)             gl_lms.allocated[*x + i] = best + h;        return true;        }<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00ab\u0440\u043e\u0432\u0435\u0440\u00bb (\u00abrover\u00bb) \u043e\u0447\u0435\u043d\u044c \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u0435\u043d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430.<\/p>\n<h3>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430<\/h3>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0435\u043e, \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0px; width: 100%; height: 0px; position: relative; padding-bottom: 75.0019%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/UOYdpHxlNbY?rel=0&amp;showinfo=1\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" style=\"top: 0px; left: 0px; width: 100%; height: 100%; position: absolute;\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f 3-4 \u0440\u0430\u0437\u0430 (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438):<\/p>\n<ul>\n<li>\u041c\u0438\u0440: 1-2 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).<\/li>\n<li>\u0421\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u0438\u0446: 1 \u043f\u0440\u043e\u0445\u043e\u0434.<\/li>\n<li>\u0421\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432: 1 \u043f\u0440\u043e\u0445\u043e\u0434.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>GL_LINEAR<\/h3>\n<p>  \u0411\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u043c\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438, \u043d\u043e \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0440\u0430\u0441\u0446\u0432\u0435\u043b\u0430 \u043f\u0440\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f:<\/p>\n<p>  \u0411\u044b\u043b\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/3colors_01.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0421\u0442\u0430\u043b\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/3colors_00.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/full_pipeline01_annotated.jpg\"\/><br \/>  <i>1. \u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f\/\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f.<\/i><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/full_pipeline02_annotated.jpg\"\/><br \/>  <i>2. \u0422\u0435\u043a\u0441\u0442\u0443\u0440\u0430: \u0446\u0432\u0435\u0442.<\/i><\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/full_pipeline03_annotated.jpg\"\/><br \/>  <i>3. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f: \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0434\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0430.<\/i><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/510\/c1d\/52c\/510c1d52c43845c58072da02b5aea0a4.gif\"\/><\/p>\n<h3>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439<\/h3>\n<p>  \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438: \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0446\u0432\u0435\u0442\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>glArrayElement<\/code>.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u0432\u0435\u0440\u0448\u0438\u043d \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f LERP \u0434\u043b\u044f \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 (\u0432 Quake1 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u0430\u0434\u0440\u044b).<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0413\u0443\u0440\u043e: \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0432\u0435\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f Quake2 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f. \u041f\u0435\u0440\u0435\u0434 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0447\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0432\u0435\u0442\u043e\u0432. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0413\u0443\u0440\u043e.<\/p>\n<pre><code class=\"cpp\">    R_DrawEntitiesOnList      {         if (!r_drawentities-&gt;value)             return;          \/\/ \u041d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438         for (i=0 ; i &lt; r_newrefdef.num_entities ; i++)         {           R_DrawAliasModel           {             R_LightPoint    \/\/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a \u043c\u043e\u0434\u0435\u043b\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c             GL_Bind(skin-&gt;texnum);  \/\/ \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438                          GL_DrawAliasFrameLerp()  \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430             {               GL_LerpVerts \/\/ \u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f LERP \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d                              \/\/ \u0420\u0430\u0441\u0447\u0451\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 colorArray               for ( i = 0; i &lt; paliashdr-&gt;num_xyz; i++ )               {               }                              qglLockArraysEXT               qglArrayElement       \/\/ \u041e\u0422\u0420\u0418\u0421\u041e\u0412\u041a\u0410!               qglUnlockArraysEXT             }           }         }                                    \/\/ \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e         for (i=0 ; i &lt; r_newrefdef.num_entities ; i++)         {           R_DrawAliasModel           {             [...]           }         }                                }<\/code><\/pre>\n<p>  \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u043d\u0438\u0445 \u0433\u0440\u0430\u043d\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 (\u043d\u0443, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u0441\u0441\u0435\u043b\u044f\u0446\u0438\u044f \u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432 \u0426\u041f, \u0434\u0443\u043c\u0430\u044e, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430).<\/p>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u043e\u0441\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c (<code>{-1, 0, 0}<\/code> ), \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043e \u0432 \u0434\u0432\u0438\u0436\u043a\u0435. \u0426\u0432\u0435\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043d \u0438 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>  \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u043d\u0438\u0436\u0435, \u0433\u0434\u0435 \u0441\u0432\u0435\u0442 \u0438 \u0442\u0435\u043d\u044c \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/shadow_issue_zoom.jpg\"\/><\/p>\n<p>  <u><b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b><\/u> \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430, \u0442\u0435\u043d\u044c \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043f\u0443\u0441\u0442\u043e\u0442\u0443, \u0430 \u0433\u0440\u0430\u043d\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0442\u0435\u043d\u0435\u0439, \u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0435 \u0434\u043b\u044f 1997 \u0433\u043e\u0434\u0430.<\/p>\n<p>  <u>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u0435\u043d\u044f\u0445:<\/u><\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e Quake2 \u0431\u044b\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u043d\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0425\u043e\u0442\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>gl_shadows 1<\/code>.<\/p>\n<p>  \u0422\u0435\u043d\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 (\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430), \u0433\u0440\u0430\u043d\u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u0412 \u043a\u043e\u0434\u0435 <code>R_DrawAliasModel<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 <code>shadevector<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 <code>GL_DrawAliasShadow<\/code> \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0435\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h3>\u041e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439: \u0442\u0440\u044e\u043a \u0441 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/h3>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0430\u043b\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439\/\u0441\u0432\u0435\u0442\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u2026 \u043d\u043e \u043d\u0435\u0442. \u0412\u0441\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 <code>float r_avertexnormal_dots[SHADEDOT_QUANT][256]<\/code>, \u0433\u0434\u0435 <code>SHADEDOT_QUANT<\/code>=16.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0430\u0446\u0438\u044f: \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e: {-1,0,0}.<\/p>\n<p>  \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 16 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e \u043e\u0441\u0438 Y.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 16 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f 256 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439. \u041d\u043e\u0440\u043c\u0430\u043b\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 MD2 \u2014 \u044d\u0442\u043e \u0412\u0421\u0415\u0413\u0414\u0410 \u0438\u043d\u0434\u0435\u043a\u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041b\u044e\u0431\u043e\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 X,Y,Z \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e \u0438\u0437 256 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u0418\u0437-\u0437\u0430 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0432\u0441\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u0449\u0443\u0442\u0441\u044f \u0432 <code>r_avertexnormal_dots<\/code> \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16&#215;256. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c: <a href=\"http:\/\/www.quake-1.com\/docs\/quakesrc.org\/97.html\">http:\/\/www.quake-1.com\/docs\/quakesrc.org\/97.html<\/a> (<a href=\"http:\/\/fabiensanglard.net\/quake2\/modQuantization.zip\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e<\/a>).<\/p>\n<h3>\u0421\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 OpenGL&#8230;<\/h3>\n<p>  <u>\u0413\u0434\u0435 \u043c\u043e\u044f glGenTextures?!:<\/u><\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f openGL-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 textureID \u0438\u0437 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 <code>glGenTextures<\/code>. Quake2 \u043d\u0435 \u0443\u0442\u0440\u0443\u0436\u0434\u0430\u043b\u0441\u044f \u044d\u0442\u0438\u043c \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u043b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u0441 0, \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u043b\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 1024, \u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0441 1025 \u043f\u043e 1036.<\/p>\n<p>  <u>\u041f\u0435\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c Immediate mode:<\/u><\/p>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ImmediateMode. \u041f\u043e \u0434\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 (<code>glVertex3fv<\/code> \u0438 <code>glTexCoord2f<\/code>) \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043c\u0438\u0440\u0430 (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0445 \u0432 \u0433\u0440\u0443\u043f\u043f\u044b).<\/p>\n<p>  \u0413\u0440\u0443\u043f\u043f\u043e\u0432\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (\u0432\u0440\u0430\u0433\u043e\u0432, \u0438\u0433\u0440\u043e\u043a\u043e\u0432) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>glEnableClientState (GL_VERTEX_ARRAY)<\/code>. \u0412\u0435\u0440\u0448\u0438\u043d\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 <code>glVertexPointer<\/code> \u0438 <code>glColorPointer<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0432 \u0426\u041f.<\/p>\n<p>  <u>\u041c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/u><\/p>\n<p>  \u041a\u043e\u0434 \u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043a \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043d\u043e\u0432\u0443\u044e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e\u2026 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <u>\u041d\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>GL_LIGHTING<\/code>:<\/u><\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u0426\u041f (\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0434\u043b\u044f \u043c\u0438\u0440\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0432\u0435\u0449\u0451\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439), \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0442 \u0441\u043b\u0435\u0434\u043e\u0432 <code>GL_LIGHTING<\/code>.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 OpenGL 1.0 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0413\u0443\u0440\u043e (\u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u044f \u0446\u0432\u0435\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438) \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0424\u043e\u043d\u0433\u0443 (\u0433\u0434\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u00ab\u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f\u00bb), \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>GL_LIGHTING<\/code> \u043f\u043b\u043e\u0445\u043e \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0434\u043b\u044f \u043c\u0438\u0440\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430 \u043b\u0435\u0442\u0443.<\/p>\n<p>  \u0415\u0433\u043e \u00ab\u043c\u043e\u0436\u043d\u043e\u00bb \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d. \u041f\u043e\u0445\u043e\u0436\u0435, \u044d\u0442\u043e \u0441\u043e\u0447\u043b\u0438 \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0426\u041f. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0446\u0432\u0435\u0442\u043e\u0432, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0426\u041f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0413\u0443\u0440\u043e.<\/p>\n<h3>\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u044b<\/h3>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0433\u0430\u043c\u043c\u0430-\u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0438\u0441\u043a\u0430. \u041d\u043e OpenGL-\u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0438 \u0432 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u00ab\u0433\u0440\u0443\u0431\u043e\u0439 \u0441\u0438\u043b\u044b\u00bb \u0432 <code>R_Flash<\/code>:<\/p>\n<p>  <u>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/u> \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0441\u043d\u044b\u043c?<\/p>\n<p>  <u>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/u> \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a GL_QUAD \u0441\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u044c\u0444\u0430-\u043a\u0430\u043d\u0430\u043b\u0430. \u0413\u043e\u0442\u043e\u0432\u043e.<\/p>\n<p>  <u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/u> \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440: \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>float player_state_t.blend[4]<\/code> RGBA. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044f\u0434\u0440\u0443 quake2 \u043f\u043e \u0441\u0435\u0442\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0432 DLL \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430.<\/p>\n<h3>\u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433<\/h3>\n<p>  \u041f\u0440\u043e\u0444\u0430\u0439\u043b\u0435\u0440 Visual Studio 2008 Team \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0443\u0434\u0435\u0441\u0435\u043d, \u0432\u043e\u0442 \u0447\u0442\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c \u0434\u043b\u044f OpenGL Quake2:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/openGL_profiler.jpg\"\/><\/p>\n<p>  \u041d\u0438\u0447\u0435\u0433\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e: \u0431\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 OpenGL-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 NVidia \u0438 Win32 (<code>nvoglv32.dll<\/code> \u0438 <code>opengl32.dll<\/code>), \u0432\u0441\u0435\u0433\u043e \u043e\u043a\u043e\u043b\u043e 30%. \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435, \u043d\u043e <b>\u043a\u0443\u0447\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/b> \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 immediate mode, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u041e\u0417\u0423 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0438\u0434\u0443\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 (<code>ref_gl.dll<\/code> 23%) \u0438 \u044f\u0434\u0440\u043e quake2 (<code>quake2.exe<\/code> 15%).<\/p>\n<p>  \u0414\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u0432\u0438\u0436\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 malloc, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (<code>MSVCR90D.dll<\/code> \u0438 <code>msvcrt.dll<\/code>). \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 (<code>gamex86.dll<\/code>).<\/p>\n<p>  \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0437\u0432\u0443\u043a\u043e\u0432\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 directX (<code>dsound.dll<\/code>): 12% \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 dll \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 OpenGL Quake2:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/fd.fabiensanglard.net\/quake2\/openGL\/openGL_profiler_rend_dll_module.jpg\"\/><\/p>\n<ul>\n<li>\u0411\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043c\u0438\u0440\u0430 (<code>R_RecurseiveWorldNode<\/code>).<\/li>\n<li>\u041f\u043e\u0447\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u2014 \u043d\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0432\u0440\u0430\u0433\u043e\u0432 (\u043c\u043e\u0434\u0435\u043b\u0435\u0439 alias): (<code>GL_DrawAliasFrameLerp<\/code> 2,5%). \u0417\u0430\u0442\u0440\u0430\u0442\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u0438, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435.<\/li>\n<li>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f (\u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f) \u0442\u043e\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 2,5% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (<code>GL_RenderLightMappedPoly<\/code>).<\/li>\n<\/ul>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c dll OpenGL \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0432 \u043d\u0435\u0439 \u041d\u0415\u0422 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u00ab\u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u0433\u043e\u0440\u043b\u044b\u0448\u0435\u043a\u00bb.<\/p>\n<h3>\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 Cloc \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f 7 265 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"cpp\">    $ cloc ref_gl           17 text files.           17 unique files.            1 file ignored.      http:\/\/cloc.sourceforge.net v 1.53  T=1.0 s (16.0 files\/s, 10602.0 lines\/s)     -------------------------------------------------------------------------------     Language                     files          blank        comment           code     -------------------------------------------------------------------------------     C                                9           1522           1403           6201     C\/C++ Header                     6            237            175           1062     Teamcenter def                   1              0              0              2     -------------------------------------------------------------------------------     SUM:                            16           1759           1578           7265     -------------------------------------------------------------------------------<\/code><\/pre>\n<p>  \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u043e\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u0430: \u043d\u0430 50% \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u0434\u0430, \u0411\u0415\u0417 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u0430 30% \u0432\u044b\u0448\u0435 \u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0446\u0432\u0435\u0442\u043d\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u0431\u0438\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f. \u041b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 id Software \u043d\u0435 \u0441\u0442\u0430\u043b\u0430 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c \u0434\u043b\u044f Quake3.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/328128\/\"> https:\/\/habrahabr.ru\/post\/328128\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/fabiensanglard.net\/quake2\/shadow_issue_zoom.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041e\u043a\u043e\u043b\u043e \u043c\u0435\u0441\u044f\u0446\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f \u0443\u0434\u0435\u043b\u0438\u043b \u0447\u0442\u0435\u043d\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Quake II. \u042d\u0442\u043e \u0431\u044b\u043b \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0434\u0432\u0438\u0436\u043e\u043a idTech3 \u0432\u043d\u0435\u0441\u0435\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435: Quake 1, Quake World \u0438 QuakeGL \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u0443 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u0434\u0430. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0431\u044b\u043b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f C \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430.<\/p>\n<p>  Quake II \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u0435\u0441\u0442\u044f\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 (\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439) \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u0440\u0435\u043c\u0451\u043d. \u041d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0431\u043e\u043b\u0435\u0435 30 \u0438\u0433\u0440. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u043d \u043e\u0437\u043d\u0430\u043c\u0435\u043d\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439\/8-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0446\u0432\u0435\u0442\u043e\u0432 \u043a \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439\/24-\u0431\u0438\u0442\u043d\u043e\u0439. \u042d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 1997 \u0433\u043e\u0434\u0443.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u043b\u044e\u0431\u0438\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0432\u0438\u0436\u043e\u043a. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u044f \u0432\u0451\u043b \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043c\u0435\u0442\u043e\u043a, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u0441\u0442\u0438\u043b \u0438\u0445 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.<\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u00ab\u043f\u043e\u0434\u0447\u0438\u0441\u0442\u043a\u0438\u00bb \u043c\u0435\u043d\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u043b\u0451\u043a: \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u0435\u0435 40 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u0432\u0438\u0434\u0435\u043e, \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432 \u0438 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043d\u0435 \u0437\u043d\u0430\u044e, \u0441\u0442\u043e\u0438\u043b\u0438 \u043b\u0438 \u043c\u043e\u0438 \u0442\u0440\u0443\u0434\u044b \u0442\u043e\u0433\u043e, \u0438 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 ASCII, \u0432\u044b\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u0451 \u043c\u043d\u0435\u043d\u0438\u0435.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-286268","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286268","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=286268"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286268\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286268"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}