рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдЧрд╣рд░рд╛рдИ


рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдПрдХ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдПрдордЖрдИрдкреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдХрд┐ рдмрдирд╛рд╡рдЯ рдмрдлрд╝рд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреА рд╣реИ (рдпрд╛ рдПрдирдбреАрд╕реА) рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдХреА рд╢рдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред (рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рдореИрдВ рдРрд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рд╕реНрддрд░реЛрдВ рдкрд░ рд╕рдЯреАрдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред)

рдлрд┐рд░, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреА рдбрд╛рдЙрдирд╕реИрдВрдкрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдХреЛ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдкрд╛рдЙрдВрдбрд░ рд╢реЗрдбрд░ рдореЗрдВ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдХрд╛рд░реНрдпрд╕рдореВрд╣ рдХреА рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ 1/16 x 1/16 рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдПрдордЖрдИрдкреА рд╕реНрддрд░ 4), рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХрдИ рдкрд╛рд╕реЛрдВ рдореЗрдВ рдПрдордЖрдИрдкреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдбрд╛рдЙрдирд╕рдореНрдкреНрд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ 2-3 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред

рдкрд░рд┐рдЪрдп


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

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

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

  1. рдХрдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд░ рдХреЗ рдПрдХ рдЯреЗрдХреНрд╕рд▓ (рдпрд╛ рд╕рд┐рд░реНрдл рдХреБрдЫ рдЯреЗрдХреНрд╕рд▓реНрд╕) рдХреЛ рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд░ рдХреЗ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреА рдмрд╣реБрд▓рддрд╛ рдХреЗ рдЕрдиреБрдорд╛рдирд┐рдд рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдПрдХ рдХрдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд░ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рдФрд░ рдХреИрд╢реНрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рд░реНрдЪ рдСрдкрд░реЗрд╢рди (рд╡рд┐рд╢реЗрд╖рдХрд░ рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде) рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рддреЗрдЬреА рд▓рд╛рддрд╛ рд╣реИред

рдбрд╛рдЙрди-рд╕реИрдВрдкрд▓ рдХрд┐рдП рдЧрдП рд╣рд╛рдИ-рдЬреЗрдб рдмрдлрд░ рд╕реНрддрд░реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпрд╛ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ "рдЙрд▓рдЯрд╛" рд╣реЛрдЧрд╛ , рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рд╛рдп-рдЬреЗрдб рдмрдлрд░ рд╕реНрддрд░ рдХреЗ рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдЯреЗрдХреНрд╕рд▓ minрдпрд╛ maxрдкрд┐рдЫрд▓реЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдЯреЗрдХреНрд╕рд▓реНрд╕ред рдХрднреА рдХрднреА рдХреЗ рдореВрд▓реНрдпреЛрдВ minрдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬрдорд╛ рд╣реЛ рдЬрд╛рддреА рд╣реИ maxред рд╕рд░рд▓ рдФрд╕рдд рдореВрд▓реНрдп (рдЬреЛ рдЕрдХреНрд╕рд░ рдирд┐рдпрдорд┐рдд рдкрд╛рда рдХреЗ рдПрдордЖрдИрдкреА рд╕реНрддрд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ) рдХреЛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред

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

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ "рдмрд┐рд▓реНрдХреБрд▓" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ: рдпрджрд┐ Z <= рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп (рдЕрдзрд┐рдХрддрдо) рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдмрдлрд░ рдУрд╡рд░рд▓реИрдк рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЗрд╡рд▓ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рджрд╛рдВрд╡ рдкрд░ рд╣реИ, рдФрд░ рд╕рд╣реА рдкреНрд░рддрд┐рдкрд╛рджрди рдирд╣реАрдВ рд╣реИ)ред

рдореЗрд░рд╛ рдЖрд╡реЗрджрди: рдПрдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ shader рдореЗрдВ рдХрдгреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди


рдЕрдкрдиреЗ PARTICULAL VR рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЗрдВрдЬрди рдореЗрдВ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ shader рдореЗрдВ рдХрдг рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ Hi-Z рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ ред рдЪреВрдВрдХрд┐ рдпрд╣ рд░реЗрдВрдбрд░рд┐рдВрдЧ рддрдХрдиреАрдХ рдирд┐рдпрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд░реЗрдЦрд╛рдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдЧрд╣рд░рд╛рдИ рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдХрдгреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реЙрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рддрдХ рдкрд╣реБрдВрдЪ (рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм) рд▓рдЧрднрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИред рдкреВрд░реНрдг-рд╕реНрдХреНрд░реАрди рд░реИрдВрдбрдо-рдПрдХреНрд╕реЗрд╕ рдмрдирд╛рд╡рдЯ рдкрд░ рдЦреЛрдЬ рд╕рдВрдЪрд╛рд▓рди рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред рд▓реЛрдб рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдореВрд▓ рд╕реЗ 1/16 x 1/16 рдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд╕рд╛рде рдХрдо рдЧрд╣рд░рд╛рдИ рд╡рд╛рд▓реЗ рдмрдлрд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рдмрдлрд╝рд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рдорд╛рди рд╣реИред

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

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

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

рдЕрдм рд╣рдо рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрдХрдиреАрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рддрдХрдиреАрдХ 1: рдПрдХ рдкреВрд░реА Mip рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


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

рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдбреЗрдкреНрде рдмрдлрд░ рд╕реЗ рдПрдХ рдПрдордЖрдИрдкреА рдЪреЗрди рдмрдирд╛рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдХреНрд╕рд▓ рдХреЗ рд▓рд┐рдП рд╕реНрддрд░ рдПрди рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕реНрддрд░ рдПрди -1 рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд 4 рдЯреЗрдХреНрд╕рд▓реНрд╕ рд▓реЗрддреЗ рд╣реИрдВ max( minрдпрд╛ рджреЛрдиреЛрдВ)ред рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкрд╛рд╕ (рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЖрдХрд╛рд░ рдХреЛ рдЖрдзреЗ рд╕реЗ рдХрдо рдХрд░рддреЗ рд╣реБрдП) рддрдм рддрдХ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдореЗрдВ рдЖрдХрд╛рд░ рдореЗрдВ рдЕрдВрддрд┐рдо рдПрдордЖрдИрдкреА рд╕реНрддрд░ 1x1 рдирд╣реАрдВ рдорд┐рд▓рддрд╛ред

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

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

рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдПрдордЖрдИрдкреА-рд╕реНрддрд░ рдПрди рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯреЗрдХреНрд╕рд▓ рдХрд╛ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдпрд╣ рдиреНрдпреВрдирддрдо рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (minрдкреВрд░реНрдг-рд╕реНрдХреНрд░реАрди рдбреЗрдкреНрде рдмрдлрд░ рдХреЗ рд╕рднреА рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХрд╛), (рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд) рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕рдорд╛рди рд╕реНрдерд╛рди рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдмрдирд╛рд╡рдЯ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдордиреНрд╡рдп (рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ)[0,1]2) рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд░ рдХреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯреЗрдХреНрд╕рд▓ рдХреЗ рд▓рд┐рдП (рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдХреЗ) рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди minрдХреЗ рдЗрд╕ рдЯреЗрдХреНрд╕рд▓ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЙрдЪреНрдЪ рдПрдордЖрдИрдкреА рд╕реНрддрд░ рдкрд░ рдЯреЗрдХреНрд╕рд▓ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП , рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИред

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

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП (рдФрд░ рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд╝рд░реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рдЖрдпрд╛рдо рдЕрдВрддрд┐рдо рддрдХ, рдЬрд╣рд╛рдВ рдЖрдпрд╛рдо 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ) рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдПрдХ-рдЖрдпрд╛рдореА рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕рд▓ рдХреЗ рд▓рд┐рдПi рд╕реНрддрд░ N рдкрд░ рд╣рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрддрд░ N-1 рдкрд░ рдЯреЗрдХреНрд╕рд▓реНрд╕ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ 2рддрдерд╛ 2i+1рдФрд░ рдЙрдирдХрд╛ рдЕрд░реНрде рдЦреЛрдЬреЗрдВ minред рдЕрд░реНрдерд╛рддDN[i]=min(DNтИТ1[2i],DNтИТ1[2i+1])ред рд╣рдо рд╕реАрдзреЗ "2 рд╕реЗ 1" рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдмрдирд╛рд╡рдЯ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд░рддрд╛ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХрд╛ рдЖрдХрд╛рд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдЖрдзрд╛ рд╣реИред


рд╕рдо рд╕реНрддрд░ рдХреЗ рдЖрдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг: рдЗрд╕ рд╕реНрддрд░ рдкрд░ 6 рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдШрдЯрд╛рдХрд░ 3 рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреАрди рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЯреЗрдХреНрд╕рд▓реНрд╕ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдмрдирд╛рд╡рдЯ рд╕рдордиреНрд╡рдп рдЖрдХрд╛рд░ рд╣рд░ рджреЛ рдирд┐рдЪрд▓реЗ-рд╕реНрддрд░ рдХреЗ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдкрд░ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдбреЙрдЯреНрд╕ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЗ рдХреЗрдВрджреНрд░ рд╣реИрдВ, рдФрд░ рд╡рд░реНрдЧ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЫрд╛рдирддреЗ рд╕рдордп рдмрдирд╛рд╡рдЯ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВред)

рд╡рд┐рд╖рдо рд╕реНрддрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдФрд░ рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд╝рд░реНрд╕ рдЬреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд┐рд╖рдо рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрддрд░ рд╣реЛрдЧрд╛) рд╕рдм рдХреБрдЫред рдХрдард┐рди рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╡рд┐рд╖рдо рдЖрдХрд╛рд░ рдХреЗ рд╕реНрддрд░ N-1 рдХреЗ рд▓рд┐рдПdimNтИТ1 рдЕрдЧрд▓реЗ рд╕реНрддрд░ (N) рдХрд╛ рдЖрдХрд╛рд░ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ dimN=тМКdimNтИТ12тМЛ, рдЕрд░реНрдерд╛рдд тЙаdimNтИТ12ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрддрд░ N-1 рдХреЗ рд╕реНрддрд░ рдХреЗ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЗ 2 рд╕реЗ 1 рдореИрдкрд┐рдВрдЧ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕реНрддрд░ рдирд╣реАрдВ рд╣реИред рдЕрдм рд╕реНрддрд░ N рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдХреНрд╕рд▓ рдХреЗ рдмрдирд╛рд╡рдЯ рд╕рдордиреНрд╡рдп рдХрд╛ рдЖрдХрд╛рд░ рд╕реНрддрд░ N-1 рдкрд░ 3% рдкрд╛рд░реНрдХреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ ред


рд╡рд┐рд╖рдо рд╕реНрддрд░ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг: рдЗрд╕ рд╕реНрддрд░ рдХреЗ 7 рдЯреЗрдХреНрд╕ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ 3 рдЯреЗрдХреНрд╕рд▓реНрд╕ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рддреАрди рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЗ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЖрдпрд╛рдо рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рд╕реЗ рддреАрди рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдЖрд░реЛрдкрд┐рдд рд╣реИрдВред

рдЗрд╕рд▓рд┐рдпреЗDN[i]=min(DNтИТ1[2i],DNтИТ1[2i+1],DNтИТ1[2i+2])ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрди -1 рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдХрднреА-рдХрднреА рдПрди рдХреЗ рд╕реНрддрд░ рдкрд░ 2 рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЗ minрд▓рд┐рдП рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддреБрд▓рдирд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЖрдпрд╛рдо рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ, рдпрджрд┐ N-1 рд╕реНрддрд░ рдХреЗ рджреЛрдиреЛрдВ рдЖрдпрд╛рдо рд╕рдорд╛рди рд╣реИрдВ, рддреЛ N-1 рд╕реНрддрд░ рдкрд░ 2x2 рдЯреЗрдХреНрд╕рд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ N рд╕реНрддрд░ рдкрд░ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдкрд░ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рд╡рд┐рд╖рдо рд╣реИ, рддреЛ N-1 рд╕реНрддрд░ рдкрд░ 2x3 рдпрд╛ 3x2 рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрддрд░ рдПрди рдкрд░ рдЯреЗрдХреНрд╕реЗрд▓ред рдпрджрд┐ рджреЛрдиреЛрдВ рдЖрдпрд╛рдо рд╡рд┐рд╖рдо рд╣реИрдВ , рддреЛ "рдХреЛрдгреАрдп" рдЯреЗрдХреНрд╕рд▓ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рд╕реНрддрд░ рдПрди -1 рдкрд░ 3x3 рдХреНрд╖реЗрддреНрд░ рдХреА рддреБрд▓рдирд╛ рд╕реНрддрд░ рдПрди рдореЗрдВ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИред



рдХреЛрдб рдЙрджрд╛рд╣рд░рдг


рдЬреАрдПрд▓рдПрд╕рдПрд▓ рд╢реЗрдбрд░ рдХреЛрдб рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдПрдордЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, 1 рд╕реНрддрд░ (рд╕реНрддрд░ 0 рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕реНрддрд░) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

uniform sampler2D u_depthBuffer;
uniform int u_previousLevel;
uniform ivec2 u_previousLevelDimensions;

void main() {
	ivec2 thisLevelTexelCoord = ivec2(gl_FragCoord);
	ivec2 previousLevelBaseTexelCoord = 2 * thisLevelTexelCoord;

	vec4 depthTexelValues;
	depthTexelValues.x = texelFetch(u_depthBuffer,
                                    previousLevelBaseTexelCoord,
                                    u_previousLevel).r;
	depthTexelValues.y = texelFetch(u_depthBuffer,
                                    previousLevelBaseTexelCoord + ivec2(1, 0),
                                    u_previousLevel).r;
	depthTexelValues.z = texelFetch(u_depthBuffer,
                                    previousLevelBaseTexelCoord + ivec2(1, 1),
                                    u_previousLevel).r;
	depthTexelValues.w = texelFetch(u_depthBuffer,
                                    previousLevelBaseTexelCoord + ivec2(0, 1),
                                    u_previousLevel).r;

	float minDepth = min(min(depthTexelValues.x, depthTexelValues.y),
                         min(depthTexelValues.z, depthTexelValues.w));

    // Incorporate additional texels if the previous level's width or height (or both) 
    // are odd. 
	bool shouldIncludeExtraColumnFromPreviousLevel = ((u_previousLevelDimensions.x & 1) != 0);
	bool shouldIncludeExtraRowFromPreviousLevel = ((u_previousLevelDimensions.y & 1) != 0);
	if (shouldIncludeExtraColumnFromPreviousLevel) {
		vec2 extraColumnTexelValues;
		extraColumnTexelValues.x = texelFetch(u_depthBuffer,
                                              previousLevelBaseTexelCoord + ivec2(2, 0),
                                              u_previousLevel).r;
		extraColumnTexelValues.y = texelFetch(u_depthBuffer,
                                              previousLevelBaseTexelCoord + ivec2(2, 1),
                                              u_previousLevel).r;

		// In the case where the width and height are both odd, need to include the 
        // 'corner' value as well. 
		if (shouldIncludeExtraRowFromPreviousLevel) {
			float cornerTexelValue = texelFetch(u_depthBuffer,
                                                previousLevelBaseTexelCoord + ivec2(2, 2),
                                                u_previousLevel).r;
			minDepth = min(minDepth, cornerTexelValue);
		}
		minDepth = min(minDepth, min(extraColumnTexelValues.x, extraColumnTexelValues.y));
	}
	if (shouldIncludeExtraRowFromPreviousLevel) {
		vec2 extraRowTexelValues;
		extraRowTexelValues.x = texelFetch(u_depthBuffer,
                                           previousLevelBaseTexelCoord + ivec2(0, 2),
                                           u_previousLevel).r;
		extraRowTexelValues.y = texelFetch(u_depthBuffer,
                                           previousLevelBaseTexelCoord + ivec2(1, 2),
                                           u_previousLevel).r;
		minDepth = min(minDepth, min(extraRowTexelValues.x, extraRowTexelValues.y));
	}

	gl_FragDepth = minDepth;
}

рдЗрд╕ рдХреЛрдб рдореЗрдВ рдкрдВрдЬреЗ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреА рдЧрд╣рд░рд╛рдИ рдмрдлрд╝рд░реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдпрд╛рдо рджреВрд╕рд░реЗ рдЖрдпрд╛рдо рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рджреЛ рдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдХреЙрд▓ рдЗрдВрдбреЗрдХреНрд╕ texelFetchрдкрд░реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ u_depthBufferред (рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЫреЛрдЯрд╛ рдЖрдпрд╛рдо рджреВрд╕рд░реЗ рд╕реЗ рдкрд╣рд▓реЗ 1 рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред) рдореИрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг texelFetch(рдкреВрд░реНрдгрд╛рдВрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛ, рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдРрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддреГрдд / рдЙрдЪреНрдЪ рдЧрд╣рд░рд╛рдИ рд╡рд╛рд▓реЗ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рд╕рд╛рдордирд╛ рди рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк clampрдкреНрд░рд╕рд╛рд░рд┐рдд texelFetchрдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ textureрдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( рдирдореВрдирд╛ рдореЗрдВ, рдХрд┐рдирд╛рд░реЗ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ)ред рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп minрдпрд╛ maxрд╕реАрдорд╛ рд░реЗрдЦрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреВрд╕рд░реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдХреЙрд▓ texelFetchрдХреЛ рдПрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ textureGather, рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ textureGatherрдПрдордЖрдИрдкреА рд╕реНрддрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ); рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ textureGatherред

рдкреНрд░рджрд░реНрд╢рди


рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡реАрдЖрд░ рдЗрдВрдЬрди рдореЗрдВ рджреЛ (рдПрдХ рдЖрдВрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ) рдЧрд╣рд░рд╛рдИ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рджреЛ рдкреВрд░реНрдг рдПрдордЖрдИрдкреА рдЪреЗрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрдЦ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓реНрдк 1648x1776 рдерд╛, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг 10 рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдо рдореАрд▓ рд╕реНрддрд░реЛрдВ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ 10 рдкрд╛рд╕) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реБрдЖред рдпрд╣ NVIDIA GTX 980 рдкрд░ 0.25 рдПрдордПрд╕ рдФрд░ AMD R9 290 рдкрд░ рджреЛрдиреЛрдВ рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗ рд▓рд┐рдпрд╛ред



Mip- 4, 5 6, , . ( , , , .) Mip- 4 тАФ , (103x111) 2.

mip-


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

рдзреНрдпрд╛рди рджреЗрдВ, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддрд░рд╣, рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд╝рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ рдЬрд┐рдирдХреЗ рдЖрдХрд╛рд░ рджреЛ рдХреА рд╢рдХреНрддрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ (рд▓реЗрдХрд┐рди, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡реЗ рджреЛ рдХреА рд╢рдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ)ред

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

// If the previous level's width is odd and this is the highest-indexed "edge" texel for 
// this level, incorporate the rightmost edge texels from the previous level. The same goes 
// for the height. 
bool shouldIncludeExtraColumnFromPreviousLevel =
    (previousMipLevelBaseTexelCoords.x == u_previousLevelDimensions.x - 3);
bool shouldIncludeExtraRowFromPreviousLevel =
    (previousMipLevelBaseTexelCoords.y == u_previousLevelDimensions.y - 3);

рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдЙрдЪреНрдЪрддрдо рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд╛рд▓реЗ рдЪрд░рдо рдЯреЗрдХреНрд╕рд▓реНрд╕ рдмрд╣реБрдд "рдореЛрдЯреЗ" рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЬрди рдореЗрдВ 2 рд╡рд┐рд╖рдо рдЖрдпрд╛рдо рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рдордиреНрд╡рд┐рдд рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдбрд╝реЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред

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

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ NDC рд╕реНрдкреЗрд╕ рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ[тИТ1,1]2MIP рд╕реНрддрд░ рдкрд░ Texel рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП higherMipLevel:

vec2 windowCoords = (0.5 * ndc.xy + vec2(0.5)) * textureSize(u_depthBuffer, 0);
// Account for texel centers being halfway between integers. 
ivec2 texelCoords = ivec2(round(windowCoords.xy - vec2(0.5)));
ivec2 higherMipLevelTexelCoords =
    min(texelCoords / (1 << higherMipLevel),
        textureSize(u_depthBuffer, higherMipLevel).xy - ivec2(1));

рддрдХрдиреАрдХ 2: рдПрдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╣рд╛рдЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдХрд▓ рд╣рд╛рдп-рдЬреЗрдб рд╕реНрддрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ


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

рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд╛рдп-рдЬреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдЧрд╣рд░рд╛рдИ рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддреА рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЧрдгрдХ shader рд▓рд┐рдЦрд╛ (рд╕реНрддрд░ 4 рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЬрд┐рд╕рдХрд╛ рдореВрд▓ рд╕реЗ 1/16 x 1/16 рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╣реИ)ред рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдореИрдВрдиреЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЛ рдореБрдЦреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдкрд╣рд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЛ atomicMinрдПрдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдЪрд░ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ (рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд┐рдирд╛) рдЧреИрд░-рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ (рдФрд░ рдореЗрд░реА рдЧрд╣рд░рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд float) рдкрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдпрд╣рд╛рдВ рдХреБрдЫ рдЪрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ IEEE 754 рдорд╛рдирдХ рдХреЗ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдорд╛рди рдЕрдкрдиреЗ рдСрд░реНрдбрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ рдЬрдм рдЙрдирдХреЗ рдмрд┐рдЯреНрд╕ рдХреЛ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо floatBitsToUintрдЧрд╣рд░рд╛рдИ рдорд╛рдиреЛрдВ floatрдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдлрд┐рд░ рд╕реЗ рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ uint, рдФрд░ рдлрд┐рд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ atomicMin(рддрдм uintBitsToFloatрд╕рдорд╛рдкреНрдд рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ uint)ред ред

рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди atomicMin16x16 рдереНрд░реЗрдб рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЛ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ atomicMinрд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдореИрдВрдиреЗ рдЫреЛрдЯреЗ рд╕реНрдЯреНрд░реАрдо рдмреНрд▓реЙрдХреНрд╕ (8x8, 4x8, 4x4, 2x4, 2x2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдХреА, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ atomicMinред

рдЗрди рд╕рднреА рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рддреЗрдЬ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиatomicMinрдПрдирд╡реАрдЖрдИрдбреАрдЖрдИрдП рдФрд░ рдПрдПрдордбреА рджреЛрдиреЛрдВ 4x4 рд╕реНрдЯреНрд░реАрдо рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓реЗ (рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдЦреБрдж рдПрдХ 4x4 рдЯреЗрдХреНрд╕рд▓ рдПрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ)ред рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдХреНрдпреЛрдВ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдЧрдгрдирд╛ рдХреА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдордЭреМрддрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ 4x4 рд╡рд░реНрдХрдЧреНрд░реБрдк рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рддрд┐ рддрд╛рдирд╛ / рд▓рд╣рд░ рдореЗрдВ рдХреЗрд╡рд▓ 16 рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рднреА 32 рдпрд╛ 64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ), рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, atomicMinрдореИрдВрдиреЗ рдЗрд╕ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрджреНрдзреГрдд рдПрдирд╡реАрдЖрдИрдбреАрдЖрдИрдП рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдореА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред (рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдХрд╛рд░реНрдпрд╕рдореВрд╣ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдПрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИlog2тБб(n)minрдкреВрд░реЗ рдХрд╛рд░реНрдп рд╕рдореВрд╣ рдХреЗ рдЕрдВрддрд┐рдо рдиреНрдпреВрдирддрдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдиреНрдпреВрдирддрдо рдЕрдВрдХреЛрдВ рдХреА рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрдпреБрдХреНрдд рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЧреБрдЬрд░рддрд╛ рд╣реИред)

рдореИрдВрдиреЗ рд╕рдорд╛рдзрд╛рди рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА atomicMinред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдирд╡реАрдЖрдИрдбреАрдЖрдИрдП рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдореА рд╕рдорд╛рдзрд╛рди atomicMinрдореЗрд░реЗ рдкрд╛рд╕ рдЖрдП рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ (рджреЛрдиреЛрдВ рдЬреАрдкреАрдпреВ рдкрд░ рджрд╕ рдЬреАрдкреАрдпреВ рдХреЗ рднреАрддрд░) рдзреАрдорд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдорд╛рдзрд╛рди atomicMinрдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг


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

ivec2 reducedResTexelCoords = texelCoords / ivec2(downscalingFactor);

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдПрдордЖрдИрдкреА-рд╕реНрддрд░ 4 рдХреЗ рд╕рдордХрдХреНрд╖ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛) downscalingFactor16 рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбрд░ atomicMin4x4 рд╡рд░реНрдХрдЧреНрд░реБрдк рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд░ рд╕реЗ 4x4 рдЯреЗрдХреНрд╕рд▓ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдШрдЯрд╛ рд╣реБрдЖ рдорд╛рди рдЧрд╣рд░рд╛рдИ рдмрдлрд░ minрдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдлрд░ рдЖрдХрд╛рд░ рдХрд╛ 1/16 x 1/16 рд╣реИ (рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЖрдХрд╛рд░ 16 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЧреЛрд▓)ред

uniform sampler2D u_inputDepthBuffer;
uniform restrict writeonly image2DArray u_outputDownsampledMinDepthBufferImage;
// The dimension in normalized texture coordinate space of a single texel in 
// u_inputDepthBuffer. 
uniform vec2 u_texelDimensions;

// Resulting image is 1/16th x 1/16th resolution, but we fetch 4x4 texels per thread, hence 
// the divisions by 4 here. 
layout(local_size_x = 16/4, local_size_y = 16/4, local_size_z = 1) in;

// This is stored as uint because atomicMin only works on integer types. Luckily 
// (non-negative) floats maintain their order when their bits are interpreted as uint (using 
// floatBitsToUint). 
shared uint s_workgroupMinDepthEncodedAsUint;

void main() {
	if (gl_LocalInvocationIndex == 0) {
        // Initialize to 1.0 (max depth) before performing atomicMin's. 
		s_workgroupMinDepthEncodedAsUint = floatBitsToUint(1.0);
	}

	memoryBarrierShared();
	barrier();

	// Fetch a 4x4 texel region per thread with 4 calls to textureGather. 'gatherCoords' 
    // are set up to be equidistant from the centers of the 4 texels being gathered (which 
    // puts them on integer values). In my tests textureGather was not faster than 
    // individually fetching each texel - I use it here only for conciseness. 
    // 
    // Note that in the case of the full-res depth buffer's dimensions not being evenly 
    // divisible by the downscaling factor (16), these textureGather's may try to fetch 
    // out-of-bounds coordinates - that's fine as long as the texture sampler is set to 
    // clamp-to-edge, as redundant values don't affect the resulting min. 

	uvec2 baseTexelCoords = 4 * gl_GlobalInvocationID.xy;
	vec2 gatherCoords1 = (baseTexelCoords + uvec2(1, 1)) * u_texelDimensions;
	vec2 gatherCoords2 = (baseTexelCoords + uvec2(3, 1)) * u_texelDimensions;
	vec2 gatherCoords3 = (baseTexelCoords + uvec2(1, 3)) * u_texelDimensions;
	vec2 gatherCoords4 = (baseTexelCoords + uvec2(3, 3)) * u_texelDimensions;

	vec4 gatheredTexelValues1 = textureGather(u_inputDepthBuffer, gatherCoords1);
	vec4 gatheredTexelValues2 = textureGather(u_inputDepthBuffer, gatherCoords2);
	vec4 gatheredTexelValues3 = textureGather(u_inputDepthBuffer, gatherCoords3);
	vec4 gatheredTexelValues4 = textureGather(u_inputDepthBuffer, gatherCoords4);

	// Now find the min across the 4x4 region fetched, and apply that to the workgroup min 
    // using atomicMin. 
	vec4 gatheredTexelMins = min(min(gatheredTexelValues1, gatheredTexelValues2),
                                 min(gatheredTexelValues3, gatheredTexelValues4));
	float finalMin = min(min(gatheredTexelMins.x, gatheredTexelMins.y),
                         min(gatheredTexelMins.z, gatheredTexelMins.w));
	atomicMin(s_workgroupMinDepthEncodedAsUint, floatBitsToUint(finalMin));

	memoryBarrierShared();
	barrier();

    // Thread 0 writes workgroup-wide min to image. 
	if (gl_LocalInvocationIndex == 0) {
		float workgroupMinDepth = uintBitsToFloat(s_workgroupMinDepthEncodedAsUint);

		imageStore(u_outputDownsampledMinDepthBufferImage,
		           ivec2(gl_WorkGroupID.xy),
                   // imageStore can only be passed vec4, but only a float is stored. 
				   vec4(workgroupMinDepth));
	}
}

рдкреНрд░рджрд░реНрд╢рди


рдореИрдВрдиреЗ рдЙрдкрд░реНрдпреБрдХреНрдд рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реИрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдбреЗрдкреНрде рдмрдлрд╝рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрдг рдорд┐рдк рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрдЦ рдХреЗ рд▓рд┐рдП 1648x1776 рдмрдлрд╝рд░реНрд╕) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ NVIDIA GTX 980 рдкрд░ 0.12 ms рдФрд░ AMD R9 290 рдкрд░ 0.08 ms рдЪрд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ mip рдХреЗ рд╕реНрддрд░ рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рддреЛ 1-4 (NVIDIA рдкрд░ 0.22 ms, 0.25 ms AMD)ред рдПрдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ shader рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди NVIDIA GPUs рдХреЗ рд╕рд╛рде 87% рддреЗрдЬреА рд╕реЗ рдирд┐рдХрд▓рд╛ рдФрд░ AMD GPU рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 197% рдЕрдзрд┐рдХ рддреЗрдЬ рдерд╛ ред

рдкреВрд░реНрдг рд╢рдмреНрджреЛрдВ рдореЗрдВ, рддреНрд╡рд░рдг рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ 0.1 рдПрдордПрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реАрдЖрд░ рдореЗрдВ :)

All Articles