рдУрдкрдирдЬреАрдПрд▓ рдЬрд╛рдиреЗрдВред рдкрд╛рда рел.резреж - рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдПрдореНрдмрд┐рдПрдВрдЯ рдЗрдВрдХреНрд▓реВрдЬрди

OGL3

SSAO


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

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

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


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

рд╕рд╛рдордЧреНрд░реА
рднрд╛рдЧ 1. рдЖрд░рдВрдн рдХрд░рдирд╛

  1. рдУрдкрди
  2. рдЦрд┐рдбрд╝рдХреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг
  3. рдирдорд╕реНрдХрд╛рд░ рдЦрд┐рдбрд╝рдХреА
  4. рдирдорд╕реНрддреЗ рддреНрд░рд┐рдХреЛрдг
  5. shaders
  6. рдмрдирд╛рд╡рдЯ
  7. рдкрд░рд┐рд╡рд░реНрддрди
  8. рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА
  9. рдХреИрдорд░рд╛

рднрд╛рдЧ 2. рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд╢

  1. рд░рдВрдЧ
  2. рдкреНрд░рдХрд╛рд╢ рдореВрд▓ рдмрд╛рддреЗрдВ
  3. рд╕рд╛рдордЧреНрд░реА
  4. рдмрдирд╛рд╡рдЯ рдХреЗ рдирдХреНрд╢реЗ
  5. рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд
  6. рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд

рднрд╛рдЧ 3ред 3 рдбреА рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

  1. рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдорд╛рди рд▓реЗрдВ
  2. рдореЗрд╖ рдмрд╣реБрднреБрдЬ рд╡рд░реНрдЧ
  3. 3 рдбреА рдореЙрдбрд▓ рд╡рд░реНрдЧ

рднрд╛рдЧ 4. рдЙрдиреНрдирдд OpenGL рд╕реБрд╡рд┐рдзрд╛рдПрдБ

  1. рдЧрд╣рд░рд╛рдИ рдкрд░реАрдХреНрд╖рдг
  2. рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдкрд░реАрдХреНрд╖рдг
  3. рд░рдВрдЧ рдорд┐рд▓рд╛рдирд╛
  4. рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдЪреЗрд╣рд░реЗ
  5. рдлреНрд░реЗрдо рдмрдлрд░
  6. рдШрди рдХрд╛рд░реНрдб
  7. рдЙрдиреНрдирдд рдбреЗрдЯрд╛ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
  8. рдЙрдиреНрдирдд GLSL
  9. рдЬреНрдпрд╛рдорд┐рддреАрдп shader
  10. instancing
  11. рдЪреМрд░рд╕рд╛рдИ

рднрд╛рдЧ 5. рдЙрдиреНрдирдд рдкреНрд░рдХрд╛рд╢

  1. рдЙрдиреНрдирдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ред рдмреНрд▓рд┐рди-рдлреЛрдВрдЧ рдореЙрдбрд▓ред
  2. рдЧрд╛рдорд╛ рд╕реБрдзрд╛рд░
  3. рдЫрд╛рдпрд╛ рдХрд╛рд░реНрдб
  4. рд╕рд░реНрд╡рджрд┐рд╢рд╛рддреНрдордХ рдЫрд╛рдпрд╛ рдирдХреНрд╢реЗ
  5. рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░рдг
  6. рд▓рдВрдмрди рдорд╛рдирдЪрд┐рддреНрд░рдг
  7. рдПрдЪрдбреАрдЖрд░
  8. рдлреВрд▓
  9. рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рддрд┐рдкрд╛рджрди
  10. SSAO

рднрд╛рдЧ 6. рдкреАрдмреАрдЖрд░

  1. рд╕рд┐рджреНрдзрд╛рдВрдд
  2. рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд
  3. IBLред рд╡рд┐рдХреНрд╖реЗрдкрдгред
  4. IBLред рдорд┐рд░рд░ рдПрдХреНрд╕рдкреЛрдЬрд╝рд░ред


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

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


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

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


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

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


рдЗрд╕ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирдореВрдиреЗ рдХреЗ рдЧреЛрд▓рд╛рдХрд╛рд░ рдХреЛрд░ рд╕реЗ рдПрдХ рдЧреЛрд▓рд╛рд░реНрдз рдХреЛ рдЙрдиреНрдореБрдЦ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╕рддрд╣ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрддрд╛ рд╣реИ:


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

рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдмрдлрд░


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

  • рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░;
  • рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░;
  • рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕рд░рд┐рдд рд░рдВрдЧ;
  • рдирдореВрдиреЗ рдХрд╛ рдореВрд▓
  • рдирдореВрдирд╛ рдХреЛрд░ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реЛрдЯреЗрд╢рди рд╡реЗрдХреНрдЯрд░ред

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


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

рдЗрд╕ рдкрд╛рда рдореЗрдВ, рдХреЛрдб рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдкрд░ рдкрд╛рда рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдкрд╛рда рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВред

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

#version 330 core layout (location = 0) out vec4 gPosition; layout (location = 1) out vec3 gNormal; layout (location = 2) out vec4 gAlbedoSpec; in vec2 TexCoords; in vec3 FragPos; in vec3 Normal; void main() { //        gPosition = FragPos; //       gNormal = normalize(Normal); //    -   gAlbedoSpec.rgb = vec3(0.95); } 

рдЪреВрдВрдХрд┐ SSAO рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рднрд╛рд╡ рд╣реИ, рдФрд░ рдЫрд╛рдпрд╛рдВрдХрди рдХрд╛рд░рдХ рдХреА рдЧрдгрдирд╛ рджреГрд╢реНрдп рдХреЗ рджреГрд╢реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рджреГрд╢реНрдп рд╕реНрдерд╛рди рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢реАрд░реНрд╖ shader рд╕реЗ рдкреНрд░рд╛рдкреНрдд FragPos рд╡реИрд░рд┐рдПрдмрд▓ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдорд╛рдирджрдВрдб рдЬреА-рдмрдлрд░ рдХреЛ рджреГрд╢реНрдп рд╕реНрдерд╛рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрдЧреЗ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

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

GPosition рд░рдВрдЧ рдмрдлрд╝рд░ рдмрдирд╛рд╡рдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 glGenTextures(1, &gPosition); glBindTexture(GL_TEXTURE_2D, gPosition); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

рдпрд╣ рдмрдирд╛рд╡рдЯ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдореВрдиреЛрдВ рдХреЗ рдореВрд▓ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЧрд╣рд░рд╛рдИ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдмрдирд╛рд╡рдЯ рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ - рдЗрд╕рд╕реЗ рдЕрдВрд╢реЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЕрдВрддрд░рд╛рд▓ [0., 1.] рддрдХ рдХрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рд░рд┐рдкреАрдЯ рдореЛрдб рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВ - GL_CLAMP_TO_EDGE рд╕реЗрдЯ рд╣реИред рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдореЗрдВ рдУрд╡рд░рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдореБрдЦреНрдп рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдЧрд▓рдд рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрд╣рд░рд╛рдИ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдорд┐рд▓реЗрдВрдЧреЗред

рдЕрдЧрд▓рд╛, рд╣рдо рдирдореВрдиреЛрдВ рдХреЗ рдПрдХ рдЧреЛрд▓рд╛рд░реНрджреНрдзреАрдп рдХреЛрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛрдВрдЧреЗред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрдиреНрдореБрдЦ рдЧреЛрд▓рд╛рд░реНрдз рдмрдирд╛рдирд╛


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


рдЧреЛрд▓рд╛рд░реНрдз рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рдПрдХ рдПрдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рдирддреЗ рд╣реБрдП, 64 рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирдореВрдиреЗ рдХреЗ рдореВрд▓ рдХрд╛ рдЧрдарди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

 //      0.0 - 1.0 std::uniform_real_distribution<float> randomFloats(0.0, 1.0); std::default_random_engine generator; std::vector<glm::vec3> ssaoKernel; for (unsigned int i = 0; i < 64; ++i) { glm::vec3 sample( randomFloats(generator) * 2.0 - 1.0, randomFloats(generator) * 2.0 - 1.0, randomFloats(generator) ); sample = glm::normalize(sample); sample *= randomFloats(generator); float scale = (float)i / 64.0; ssaoKernel.push_back(sample); } 

рдпрд╣рд╛рдБ рд╣рдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ [-1, 1.], рдФрд░ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ z рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВ [0., 1.] (рдпрджрд┐ рдЕрдВрддрд░рд╛рд▓ x рдФрд░ y рдХреЗ рд╕рдорд╛рди рд╣реИ , рддреЛ рд╣рдореЗрдВ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдХреЛрд░ рдорд┐рд▓реЗрдЧрд╛ рдирдореВрдирд╛)ред рдкрд░рд┐рдгрд╛рдореА рдирдореВрдирд╛ рд╡реИрдХреНрдЯрд░ рдЧреЛрд▓рд╛рд░реНрджреНрдзреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдирдореВрдиреЗ рдХрд╛ рдореВрд▓ рдЕрдВрдд рдореЗрдВ рд╕рддрд╣ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд╕рд╛рде рдЙрдиреНрдореБрдЦ рд╣реЛрдЧрд╛ред

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

 scale = lerp(0.1f, 1.0f, scale * scale); sample *= scale; ssaoKernel.push_back(sample); } 

Lerp () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 float lerp(float a, float b, float f) { return a + f * (b - a); } 

рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд╛рд▓ рд╣рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╡рд┐рддрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирдореВрдирд╛ рдмрд┐рдВрджреБ рдХрд░реНрдиреЗрд▓ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред


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

рдирдореВрдирд╛ рдХреЛрд░ рдХрд╛ рд░реИрдВрдбрдо рд░реЛрдЯреЗрд╢рди


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

рдПрдХ 4x4 рд╕рд░рдгреА рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдШреБрдорд╛рд╡ рд╡рд╛рд▓реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рднрд░реЗрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЙрдиреНрдореБрдЦ рд╣реЛ:

 std::vector<glm::vec3> ssaoNoise; for (unsigned int i = 0; i < 16; i++) { glm::vec3 noise( randomFloats(generator) * 2.0 - 1.0, randomFloats(generator) * 2.0 - 1.0, 0.0f); ssaoNoise.push_back(noise); } 

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

рдЕрдЧрд▓рд╛, рдПрдХ 4x4 рдмрдирд╛рд╡рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдШреВрдордиреЗ рд╡рд╛рд▓реЗ рд╡реИрдХреНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рднрд░реЗрдВред рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП GL_REPEAT рд░рд┐рдкреНрд▓реЗ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

 unsigned int noiseTexture; glGenTextures(1, &noiseTexture); glBindTexture(GL_TEXTURE_2D, noiseTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 4, 4, 0, GL_RGB, GL_FLOAT, &ssaoNoise[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

рдЦреИрд░, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ SSAO рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рд╣реИрдВ!

Shader SSAO


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

 unsigned int ssaoFBO; glGenFramebuffers(1, &ssaoFBO); glBindFramebuffer(GL_FRAMEBUFFER, ssaoFBO); unsigned int ssaoColorBuffer; glGenTextures(1, &ssaoColorBuffer); glBindTexture(GL_TEXTURE_2D, ssaoColorBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ssaoColorBuffer, 0); 

рдЪреВрдВрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ [0., 1.] рдХреЗ рднреАрддрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрд▓рдмреНрдз рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ GL_RED рдХреЛ рд░рдВрдЧреАрди рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, SSAO рд╕реНрдЯреЗрдЬ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

 //  :  G- glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); [...] glBindFramebuffer(GL_FRAMEBUFFER, 0); //  G-      SSAO glBindFramebuffer(GL_FRAMEBUFFER, ssaoFBO); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, gPosition); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, gNormal); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, noiseTexture); shaderSSAO.use(); SendKernelSamplesToShader(); shaderSSAO.setMat4("projection", projection); RenderQuad(); glBindFramebuffer(GL_FRAMEBUFFER, 0); //  :    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderLightingPass.use(); [...] glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, ssaoColorBuffer); [...] RenderQuad(); 

ShaderSSAO shader G-рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдХреЛ рдЗрдирдкреБрдЯ, рд╕рд╛рде рд╣реА рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдФрд░ рдирдореВрдирд╛ рдХреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

 #version 330 core out float FragColor; in vec2 TexCoords; uniform sampler2D gPosition; uniform sampler2D gNormal; uniform sampler2D texNoise; uniform vec3 samples[64]; uniform mat4 projection; //             //      1280x720 const vec2 noiseScale = vec2(1280.0/4.0, 720.0/4.0); void main() { [...] } 

рдЪрд░ рд╢реЛрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╢реЛрд░ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдЫреЛрдЯреА рдмрдирд╛рд╡рдЯ рдХреЛ рд╕реНрдХреНрд░реАрди рдХреА рдкреВрд░реА рд╕рддрд╣ рдкрд░ рдЯрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЯреЗрдХреНрд╕рдЪрд░реНрдбреНрд╕ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ [0., 1.] рдХреЗ рднреАрддрд░ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╢реЛрд░ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 vec3 fragPos = texture(gPosition, TexCoords).xyz; vec3 normal = texture(gNormal, TexCoords).rgb; vec3 randomVec = texture(texNoise, TexCoords * noiseScale).xyz; 

рдЯреЗрдХреНрд╕рдиреЛрдЗрдЬрд╝ рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рджреЛрд╣рд░рд╛рдиреЗ рдореЛрдб рдХреЛ GL_REPEAT рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдм рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреА рд╕рддрд╣ рдкрд░ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред RandomVec , fragPos рдФрд░ рд╣рд╛рде рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реЗ рдкреНрд░рдЬрд╛рддрд┐рдпреЛрдВ рдХреЗ рд╕реНрдерд╛рди рдкрд░ TBN рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal)); vec3 bitangent = cross(normal, tangent); mat3 TBN = mat3(tangent, bitangent, normal); 

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

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

рдЬрдмрдХрд┐ рдпрд╣ рднреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИ, рдЪрд▓реЛ рдЪрд░рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ:

 float occlusion = 0.0; for(int i = 0; i < kernelSize; ++i) { //     vec3 sample = TBN * samples[i]; //      - sample = fragPos + sample * radius; [...] } 

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

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

 vec4 offset = vec4(sample, 1.0); offset = projection * offset; //     offset.xyz /= offset.w; //   offset.xyz = offset.xyz * 0.5 + 0.5; //    [0., 1.] 

рдХреНрд▓рд┐рдк рд╕реНрдкреЗрд╕ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ x рдШрдЯрдХ рдХреЛ w рдШрдЯрдХ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╡рд┐рднрд╛рдЬрди рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдбрд┐рд╡рд╛рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ ( NDC ) рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рд╡реЗрдХреНрдЯрд░ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ [0., 1.] рддрд╛рдХрд┐ рдЗрд╕реЗ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

 float sampleDepth = texture(gPosition, offset.xy).z; 

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

 occlusion += (sampleDepth >= sample.z + bias ? 1.0 : 0.0); 

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

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


рдЬрд╛рдБрдЪ рдХреЗрд╡рд▓ рдирдореВрдирд╛ рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рднреАрддрд░ рдкрдбрд╝реЗ рдЧрд╣рд░рд╛рдИ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛рдВрдХрди рдЧреБрдгрд╛рдВрдХ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдЧрд╛:

 float rangeCheck = smoothstep(0.0, 1.0, radius / abs(fragPos.z - sampleDepth)); occlusion += (sampleDepth >= sample.z + bias ? 1.0 : 0.0) * rangeCheck; 

рд╣рдо GLSL рд╕реНрдореВрдерд╕реНрдЯреЗрдк () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рдмреАрдЪ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕реБрдЪрд╛рд░реВ рдкреНрд░рдХреНрд╖реЗрдк рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, 0 рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рдХрдо рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдпрд╛ 1 рдпрджрд┐ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рджреВрд╕рд░реЗ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрджрд┐ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдЕрдВрддрд░ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рднреАрддрд░ рд╣реИ , рддреЛ рдЗрд╕рдХрд╛ рдорд╛рди рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ [0., 1.] рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд┐рдХрдирд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛:


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

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

 } occlusion = 1.0 - (occlusion / kernelSize); FragColor = occlusion; 

рд╣рдорд╛рд░реЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдиреИрдиреЛрд╕реБрдЗрдЯ рд╡рд╛рд▓реЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП, SSAO shader рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рд╡рдЯ рджреЗрддрд╛ рд╣реИ:


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

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

рдзреБрдВрдзрд▓рд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╛рдпрд╛рдВрдХрди


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

 unsigned int ssaoBlurFBO, ssaoColorBufferBlur; glGenFramebuffers(1, &ssaoBlurFBO); glBindFramebuffer(GL_FRAMEBUFFER, ssaoBlurFBO); glGenTextures(1, &ssaoColorBufferBlur); glBindTexture(GL_TEXTURE_2D, ssaoColorBufferBlur); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ssaoColorBufferBlur, 0); 

рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдореЗрдВ рд╢реЛрд░ рдХреА рдмрдирд╛рд╡рдЯ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдмреНрд▓рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рддреЗ рд╕рдордп рдЕрдкрдиреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #version 330 core out float FragColor; in vec2 TexCoords; uniform sampler2D ssaoInput; void main() { vec2 texelSize = 1.0 / vec2(textureSize(ssaoInput, 0)); float result = 0.0; for (int x = -2; x < 2; ++x) { for (int y = -2; y < 2; ++y) { vec2 offset = vec2(float(x), float(y)) * texelSize; result += texture(ssaoInput, TexCoords + offset).r; } } FragColor = result / (4.0 * 4.0); } 

Shader рдмрд╕ SSAO рдмрдирд╛рд╡рдЯ рдХреЗ рдЯреЗрдХреНрд╕рд▓реНрд╕ рдХреЛ -2 рд╕реЗ +2 рддрдХ рдХреА рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдСрдлрд╝рд╕реЗрдЯ рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдХреЗ рд╕рдЯреАрдХ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ: рдЯреЗрдХреНрд╕рдЪрд░рд╕рд╛рдЗрдЬрд╝ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрдирд╛рд╡рдЯ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде vec2 рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ Shader рдмрд╕ рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдФрд╕рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА рдзрдмреНрдмрд╛ рджреЗрддрд╛ рд╣реИ:


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╛рдпрд╛рдВрдХрди рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдирд╛рд╡рдЯ рд╣реИ - рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдореЗрдВ рдХрдореА рдХреЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ!

рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╛рдпрд╛рдВрдХрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ


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

 #version 330 core out vec4 FragColor; in vec2 TexCoords; uniform sampler2D gPosition; uniform sampler2D gNormal; uniform sampler2D gAlbedo; uniform sampler2D ssao; struct Light { vec3 Position; vec3 Color; float Linear; float Quadratic; float Radius; }; uniform Light light; void main() { //    G- vec3 FragPos = texture(gPosition, TexCoords).rgb; vec3 Normal = texture(gNormal, TexCoords).rgb; vec3 Diffuse = texture(gAlbedo, TexCoords).rgb; float AmbientOcclusion = texture(ssao, TexCoords).r; //   -    //   :   -  vec3 ambient = vec3(0.3 * Diffuse * AmbientOcclusion); vec3 lighting = ambient; //    (0, 0, 0)   - vec3 viewDir = normalize(-FragPos); //   vec3 lightDir = normalize(light.Position - FragPos); vec3 diffuse = max(dot(Normal, lightDir), 0.0) * Diffuse * light.Color; //   vec3 halfwayDir = normalize(lightDir + viewDir); float spec = pow(max(dot(Normal, halfwayDir), 0.0), 8.0); vec3 specular = light.Color * spec; //   float dist = length(light.Position - FragPos); float attenuation = 1.0 / (1.0 + light.Linear * dist + light.Quadratic * dist * dist); diffuse *= attenuation; specular *= attenuation; lighting += diffuse + specular; FragColor = vec4(lighting, 1.0); } 

рдХреЗрд╡рд▓ рджреЛ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рд╣реИрдВ: рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдФрд░ рдПрдореНрдмрд┐рдПрдВрдЯрдУрдХреНрд╡рд┐рдХреНрд▓реВрд╢рди рдХреЗ рдорд╛рди рд╕реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд▓рд╛рдЗрдЯрд┐рдВрдЧ рдШрдЯрдХ рдХрд╛ рдЧреБрдгрди ред рдПрдХрд▓ рдиреАрд▓реЗ рдмрд┐рдВрджреБ рдкреНрд░рдХрд╛рд╢ рдХреЗ рд╕рд╛рде рдПрдХ рджреГрд╢реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:


рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред

SSAO рдкреНрд░рднрд╛рд╡ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреГрдврд╝рддрд╛ рд╕реЗ рдХрд░реНрдиреЗрд▓рд╛рдЗрдЬрд╝ , рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдЬреИрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЕрдХреНрд╕рд░ рдЙрдиреНрд╣реЗрдВ рдареАрдХ-рдареАрдХ рдЯреНрдпреВрдирд┐рдВрдЧ рдХрд░рдирд╛ рдХрд▓рд╛рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд╛рди / рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреЛрдИ "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда" рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдВрдпреЛрдЬрди рдирд╣реАрдВ рд╣реИ: рдХреБрдЫ рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдирдореВрдирд╛ рдХреЛрд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рддреНрд░рд┐рдЬреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдврд╝реЗ рд╣реБрдП рддреНрд░рд┐рдЬреНрдпрд╛ рдФрд░ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг 64 рдирдореВрдирд╛ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрдорд╛рдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рд╕реВрдЪреАрдмрджреНрдз рд╡рд░реНрджреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдЫрд╛рдпрд╛рдВрдХрди рдкреНрд░рднрд╛рд╡ рдХреА рдЧрдВрднреАрд░рддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдПрдХ рдФрд░ рд╡рд░реНрджреА рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдбрд┐рдЧреНрд░реА рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 occlusion = 1.0 - (occlusion / kernelSize); FragColor = pow(occlusion, power); 

рдореИрдВ рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдкрд░ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рддрд╕реНрд╡реАрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рджреЗрдЧрд╛ред

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

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди


  1. SSAO рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ : рдЬреЙрди рдЪреИрдкрдореИрди рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдкрд╛рда рд▓реЗрдЦ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕ рдкрд╛рда рдХрд╛ рдХреЛрдб рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. рдЕрдкрдиреА SSAO рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬрд╛рдиреЗрдВ : рдПрдХ рдмрд╣реБрдд рд╣реА рдореВрд▓реНрдпрд╡рд╛рди рд▓реЗрдЦ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ SSAO рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕рд╛рде рди рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджрдмрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рднреА рд╣реИрдВред рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреАред
  3. рдЧрд╣рд░рд╛рдИ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде SSAO : рдЧрд╣рд░рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯреБрдХрдбрд╝реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ OGLDev рджреНрд╡рд╛рд░рд╛ рдореБрдЦреНрдп SSAO рд╕рдмрдХ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╢рд┐рд╖реНрдЯред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдорд╣рддреНрд╡ рдЬреА-рдмрдлрд░ рдореЗрдВ рдкрджреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореЗрдореЛрд░реА рдмрдЪрдд рдХреЗ рдХрд╛рд░рдг рд╣реИред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрддрдирд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдпрд╣ SSAO рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ : рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрдмрд╛рджрд▓реЛрдВ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд░ рд╣реИ ред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреА рдЧрдВрднреАрд░ рдЗрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

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


All Articles