OpenGL ES 3.0 рдкрд░ SSAO


рдПрдХ рджрд┐рди, рдЕрдЧрд▓реЗ рдбреЗрдореЛ рдХреЛ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рджреЗрдЦрддреЗ рд╣реБрдП, рд╕рд╡рд╛рд▓ рдЙрдардиреЗ рд▓рдЧрд╛: рдХреНрдпрд╛ рдПрд╕рдПрд╕рдПрдУ рдХреЛ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦреЗ рдФрд░ рдзреАрдорд╛ рди рд╣реЛ?
рдЧреИрд▓реЗрдХреНрд╕реА рдиреЛрдЯ 3 рдПрди 9000 (рдорд╛рд▓реА рдЯреА 62) рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓рдХреНрд╖реНрдп рдПрдлрдкреАрдПрд╕ 30 рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕ рдЖрд╢рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ ( рд╡рд┐рдХрд┐ рдпрд╛ рдЪрд░рдг 3 ) рд╕реЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдореЗрдВ рдЬреЛрд░ рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдЕрдиреБрдХреВрд▓рди рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди "рдПрд╕рдПрд╕рдПрдУ рдХреА рдХрд┐рд╕реНрдореЛрдВ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдПрдЧреАред

SSAO рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдлреА рд▓рдЬреНрдЬрд╛рдЬрдирдХ рдкреНрд░рднрд╛рд╡ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдФрд╕рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрджреГрд╢реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрднреА рднреА рдЗрд╕реЗ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MRT рд╕рдкреЛрд░реНрдЯ рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ OpenGL ES рд╡рд░реНрдЬрди 3.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд╕.рдПрд╕.рдП.рдУ.


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

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

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦреЗрдВ - рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдВрджреБ рдХреЗ рдиреАрдЪреЗ рдХреА рд╕рддрд╣ рднреА рдЫрд╛рдпрд╛рдВрдХрди рдореЗрдВ рдЕрдкрдирд╛ ("рдмреЗрдХрд╛рд░") рдпреЛрдЧрджрд╛рди рджреЗрддреА рд╣реИред рдирддреАрдЬрддрди, рдЪрд┐рддреНрд░ рдЧреНрд░реЗ рдЯрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЬрд╣рд╛рдВ рдХреЛрдИ рдЫрд╛рдпрд╛рдВрдХрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


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

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

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

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрд╢реЛрдзрди рд╣реИ, рдФрд░ рдпрд╣ рд▓рд╛рдЧреВ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдорд╛рдирджрдВрдбреЛрдВ, рдЧрд╣рд░рд╛рдИ рдФрд░ рд░рдВрдЧ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ OpenGL ES 3.0 рдХреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдПрдХрд╛рдзрд┐рдХ рд░реЗрдВрдбрд░ рд▓рдХреНрд╖реНрдп, рд╣рдо рдХрдИ рдмрдлрд╝рд░реНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реА рд╕рдордп рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрдорд╛рдг):
// ,        (  ),     GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; GLuint fbo; GLuint colorBuff; GLuint normBuff; GLuint depthBuff; //     void createTexture(GLuint &id, int inFormat, int w, int h, int format, int type, int filter, int wrap, void* pix=NULL) { glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexImage2D(GL_TEXTURE_2D, 0, inFormat, w, h, 0, format, type, pix); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap); } ... glGenFramebuffers(1, &fbo); //   glBindFramebuffer(GL_FRAMEBUFFER, fbo); // width  height -   createTexture(colorBuff, GL_RGB8, width, height, GL_RGB, GL_UNSIGNED_BYTE, GL_NEAREST, GL_MIRRORED_REPEAT); createTexture(normBuff, GL_RGB8, width, height, GL_RGB, GL_UNSIGNED_BYTE, GL_NEAREST, GL_MIRRORED_REPEAT); createTexture(depthBuff, GL_DEPTH_COMPONENT24, width, height, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_NEAREST, GL_MIRRORED_REPEAT); //    ,        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuff, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, normBuff, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthBuff, 0); int err = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (err != GL_FRAMEBUFFER_COMPLETE) LOGE("Main framebuffer error: %i", err); glDrawBuffers(2, buffers); 

рдЖрдЧреЗ рднреА рдЗрд╕реА рддрд░рд╣ рд╕реЗ, рд▓реЗрдХрд┐рди рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ SSAO рдХреЗ рддрд╣рдд рдПрдХ рдмрдлрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
SSAO рдХреЗ рддрд╣рдд рдмрдлрд░
 glGenFramebuffers(1, &ssaoFbo1); glBindFramebuffer(GL_FRAMEBUFFER, ssaoFbo1); //     ,     ,    GL_R8 createTexture(ssaoBuff1, GL_R8, width/ssaoScaleW, height/ssaoScaleH, GL_RED, GL_UNSIGNED_BYTE, GL_LINEAR, GL_MIRRORED_REPEAT); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ssaoBuff1, 0); // glDrawBuffers   ,        


рдпрд╣ рдмрдлрд░ рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 1920x1080) рдХреЗ рд╕рдорд╛рди рдмрдирд╛ рджреЗрдВред

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

рджреГрд╢реНрдп рдХреЛ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд░рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рднреА рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рддреЗ рд╣реИрдВред рджреГрд╢реНрдп рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░:
 #version 300 es uniform mat4 matrixProj; uniform mat4 matrixView; uniform vec3 lightPos; layout(location = 0) in vec3 vPos; //   layout(location = 1) in vec3 nPos; //  layout(location = 2) in vec3 tPos; //     layout(location = 3) in vec2 tCoord; //   out vec3 light; out vec3 gNorm; out float zPos; out vec2 texCoord; void main() { vec4 p = matrixProj*matrixView*vec4(vPos, 1.0); gl_Position = p; texCoord = tCoord; //      ,           vec3 bitangent = cross(tPos, nPos); mat3 tbn = mat3(tPos, bitangent, nPos); light = normalize(lightPos-vPos)*tbn; zPos = pz; //  z-  -      vec4 n = (matrixView*vec4(nPos, 0.0)); //      gNorm = normalize(n.xyz); } 

рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдирд╛:
 #version 300 es precision highp float; //      24- ,     ,     24 ,       uniform sampler2D texDiff; //   uniform sampler2D texNorm; //       layout(location = 0) out vec3 colorBuff; //    layout(location = 1) out vec3 normBuff; //   in vec3 light; in vec3 gNorm; in float zPos; in vec2 texCoord; const vec3 ambientColor = vec3(0.3); const float zFar = 40.0; //    void main() { vec3 n = normalize(texture(texNorm, texCoord).xyz*2.0-1.0); vec3 l = normalize(light); vec3 c = texture(texDiff, texCoord).rgb; float a = clamp(dot(n, l), 0.0, 1.0); colorBuff = c*(a+ambientColor); //   normBuff = normalize(gNorm)*0.5+0.5; //   gl_FragDepth = zPos/zFar; //       } 


рд╣рдореЗрдВ рдЧреЛрд▓рд╛рд░реНрдз (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрдпрди) рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЫрд╛рдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рд╕реБрдВрджрд░ (рддрд╛рдХрд┐ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЕрдзрд┐рдХ рд╢рд╛рд░реАрд░рд┐рдХ) - рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдШрдирддреНрд╡ рдХреЗрдВрджреНрд░ рд╕реЗ рдЕрдзрд┐рдХ рдФрд░ рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рдХрд╛рдиреВрди рд╣реЛрдирд╛ред
 for (int i=0; i<samples; i++) { rndTable[i] = vec3(random(-1, 1), random(-1, 1), random(-1, -0)); //    ( ) rndTable[i].normalize(); //   rndTable[i] *= (i+1.0f)/samples; //  ( ) } 






рдмреЗрд╢рдХ, рдирдореВрдиреЗ рдореЗрдВ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрддрдиреА рдмрдбрд╝реА рдирд╣реАрдВ рд╣реЛрдЧреАред рдЪрд▓реЛ рдЗрд╕реЗ 10 рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рддреЗ рд╣реИрдВред

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

Shader рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 vec3 normal = texture(normBuff, texCoord).xyz*2.0-1.0; vec3 rvec = texture(randMap, texCoord*scr).xyz*2.0-1.0; vec3 tangent = normalize(rvec-normal*dot(rvec, normal)); vec3 bitangent = cross(tangent, normal); mat3 rotate = mat3(tangent, bitangent, normal); 


рд╣рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЙрд▓реНрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЫрд╡рд┐ рд╕реНрдерд╛рди рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЗрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЬреЗрдб-рд╕рдордиреНрд╡рдп рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрдорд░реЗ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╡реЗрдХреНрдЯрд░ (рд░реЗ) рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВред рдЬреЗрдб-рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХреИрдорд░реЗ рд╕реЗ рдмреАрдо рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдлрд╝реЙрд╡ рд╣реИред рдореИрдВрдиреЗ рд╡рд░реНрджреА рдкрд░ рдмрдЪрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрдХрд┐рдд рдХрд┐рдпрд╛ред
 #version 300 es const fov = 0.57735; layout(location = 0) in vec2 vPos; layout(location = 1) in vec2 tCoord; uniform float aspect; out vec2 texCoord; out vec3 viewRay; void main() { gl_Position = vec4(vPos, 0.0, 1.0); texCoord = tCoord; viewRay = vec3(-vPos.x*aspect*fov, -vPos.y*fov, 1.0); //   ,      } 

рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдореЗрдВ, рдХрд┐рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрд╣рд╛рд▓ рдХреА рдЬрд╛рддреА рд╣реИ:
 float depth = texture(depthBuff, texCoord).x; //    ,   depth *= zFar; //  z- vec3 pos = viewRay*depth; //      

рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирдореВрдиреЛрдВ рд╕реЗ рдЫрд╛рдпрд╛рдВрдХрди рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:
 float acc = 0.0; for (int i=0; i<samples; i++) { vec3 samplePos = rotate*rndTable[i]; //  samplePos = samplePos*radius+pos; //        //          ,            vec4 shift = proj*vec4(samplePos, 1.0); shift.xy /= shift.w; shift.xy = shift.xy*0.5+0.5; //   z- float sampleDepth = texture(depthBuff, shift.xy).x*zFar; //       -      .     ,       ,   smoothstep,   -   float distanceCheck = smoothstep(0.0, 1.0, radius/abs(pos.z-sampleDepth)); //       -     .  - ,    step acc += step(sampleDepth, samplePos.z)*distanceCheck; } 

рдкрд░рд┐рдгрд╛рдо рдзреБрдВрдзрд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧрд╛рдКрд╕реА рдзреБрдВрдзрд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрдлрд░ рдмрдирд╛рдПрдВред рд╣рдо рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░реЗрдВрдЧреЗ, рдЕрдВрдд рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЫрд╛рдпрд╛ рд╣реИ, рдЬреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рднреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ, рдХреИрд╢ рд╣рдорд╛рд░реА рддрд░рдл рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рдЕрдЧрд░ SSAO рдХреИрд╢ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрдврд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдЪреВрдХ рд╣реЛрддреА рд╣реИ, рддреЛ рдмрдирд╛рд╡рдЯ рд╕реЗ рдирдореВрдиреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдзрдмреНрдмрд╛
 #version 300 es precision mediump float; uniform sampler2D ssaoBuff; layout(location = 0) out float outColor; in vec2 texCoord; const float blurSize = 2.5/1920.0; void main() { float sum = 0.0; sum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y - 2.0*blurSize)).r * 0.0625; sum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y - blurSize)).r * 0.25; sum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y )).r * 0.375; sum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y + blurSize)).r * 0.25; sum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y + 2.0*blurSize)).r * 0.0625; outColor = sum; } 

рдХреНрд╖реИрддрд┐рдЬ рдзрдмреНрдмрд╛
 #version 300 es precision mediump float; uniform sampler2D ssaoBuff; layout(location = 0) out float outColor; in vec2 texCoord; const float blurSize = 2.5/1080.0; void main() { float sum = 0.0; sum += texture(ssaoBuff, vec2(texCoord.x - 2.0*blurSize, texCoord.y)).r * 0.0625; sum += texture(ssaoBuff, vec2(texCoord.x - blurSize, texCoord.y)).r * 0.25; sum += texture(ssaoBuff, vec2(texCoord.x, texCoord.y)).r * 0.375; sum += texture(ssaoBuff, vec2(texCoord.x + blurSize, texCoord.y)).r * 0.25; sum += texture(ssaoBuff, vec2(texCoord.x + 2.0*blurSize, texCoord.y)).r * 0.0625; outColor = sum; } 


рдЖрдк рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдЗрд╕рд▓рд┐рдП, рдирдореВрдирд╛ рдмрдирд╛рддреЗ рд╕рдордп, рд╢реВрдиреНрдп рдЬреЗрдб-рд╕рдордиреНрд╡рдп рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЫреЛрдЯреЗ рдореВрд▓реНрдп рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 0.1 рд╕реЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреЛрд▓рд╛рд░реНрдз рдиреАрдЪреЗ рд╕реЗ рдЫрдВрдЯрдиреА рдХреА рддрд░рд╣ рд╣реИ:

рдФрд░ рдлрд┐рд░ рдирдореВрдиреЗ рд╕реЗ рдЕрдВрдХ "рдЪрд░рдгреЛрдВ" рдореЗрдВ рдирд╣реАрдВ рдЧрд┐рд░реЗрдВрдЧреЗред рддрд╕реНрд╡реАрд░ рдмреЗрд╣рддрд░ рд╣реЛрдЧреА:

рд▓реЗрдХрд┐рди рдПрдлрдкреАрдПрд╕ рдЕрднреА рднреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред

рдЕрдиреБрдХреВрд▓рди


рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдмрд╕реЗ рдЖрдо рд╕рдорд╛рдзрд╛рди рдирдореВрдирд╛ рдореЗрдВ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рдФрд░ рдПрд╕рдПрд╕рдПрдУ рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рдЖрдзрд╛ рдХрд░рдХреЗ, рд╣рдо рд▓рдЧрднрдЧ 150% рдПрдлрдкреАрдПрд╕ рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдкрд░ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдмрд╣реБрдд рдХрдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦреЗрдВ - рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЫрд╡рд┐ рд╕рдлреЗрдж рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЫрд╛рдпрд╛рдВрдХрди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдХрд╛рдЯ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдореБрдЦреМрдЯрд╛ рдЫреЛрдЯреЗ рдмрдлрд░ рдХреЗ рд▓рд┐рдП SSAO рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо SSAO рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдореЗрдВ 16 рдЧреБрдирд╛ рдЫреЛрдЯреЗ рдФрд░ рджреВрд╕рд░рд╛ рдмрдлрд░ рдмрдирд╛рдПрдБрдЧреЗред рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рдВрдЪ рддрдХ рдХрдо рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рди рдмрдирд╛рдПрдВ, рд▓реЗрдХрд┐рди рдЧреЛрд▓рд╛рд░реНрдз рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рд╕рдорд╛рди рджреВрд░реА рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ:
 for (int i=0; i<samplesLow; i++) { float angle = DEG2RAD*360.0f*i/samplesLow; rndTableLow[i] = vec3(sinf(angle), cosf(angle), -0.1); } 

рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдЫрд╛рдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдЪрд┐рдХрдиреА рдмрджрд▓рд╛рд╡ рдХреЗ рдПрдХ рдореБрдЦреМрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрд╣реБрдд рд╡рд┐рдкрд░реАрдд рдмрдирд╛ рджреЗрдВрдЧреЗ - рдкрд┐рдХреНрд╕реЗрд▓ рдпрд╛ рддреЛ рдХрд╛рд▓рд╛ рдпрд╛ рд╕рдлреЗрдж рд╣реИ:
 outColor = step(254.0/255.0, 1.0-(acc/float(samples))); 

рдмреНрд▓рд░ рд╢реИрдбрд░ рдХреЛ рднреА рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдм рдпрд╣ рджреЛ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдХреЛрдиреЛрдВ рдкрд░ рд╕реНрдерд┐рдд рдЪрд╛рд░ рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛:
 #version 300 es precision mediump float; uniform sampler2D ssaoLowBuff; uniform float aspect; layout(location = 0) out float outColor; in vec2 texCoord; const float blurSize = 0.01; void main() { float sum = 0.0; sum += texture(ssaoLowBuff, vec2(texCoord.x - blurSize, texCoord.y - blurSize*aspect)).r; sum += texture(ssaoLowBuff, vec2(texCoord.x - blurSize, texCoord.y + blurSize*aspect)).r; sum += texture(ssaoLowBuff, vec2(texCoord.x, texCoord.y )).r; sum += texture(ssaoLowBuff, vec2(texCoord.x + blurSize, texCoord.y - blurSize*aspect)).r; sum += texture(ssaoLowBuff, vec2(texCoord.x + blurSize, texCoord.y + blurSize*aspect)).r; outColor = step(254.0/255.0, sum/5.0); } 

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

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо SSAO рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ 1.5 рдЧреБрдирд╛ рдШрдЯрд╛рдпрд╛, рдФрд░ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдШрдЯрд╛рдХрд░ 8 рдХрд░ рджреА):

рдирддреАрдЬрддрди, рдПрдлрдкреАрдПрд╕ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рджреГрд╢реНрдп рд╣рд╛рдирд┐ рдХреЗ рдмрд┐рдирд╛ рддреАрди рдЧреБрдирд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ рдЦрд╛рдореА рд╣реИ - рдЕрдЧрд░ рджреГрд╢реНрдп рдореЗрдВ рдХрдИ рдХреЛрдг рдпрд╛ рдЕрдиреНрдп рдЫрд╛рдпрд╛рдВрдХрди рд╕реНрдерд╛рди рд╣реИрдВ, рддреЛ рдореБрдЦреМрдЯрд╛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдмрд╣реБрдд рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдХрдо рдХрд┐рдП рдЧрдП рдПрд╕рдПрд╕рдПрдУ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рднреА рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдкреВрд░реНрдг SSAO рдЯреБрдХрдбрд╝рд╛ shader рдХреЛрдб:
 #version 300 es precision highp float; //  24-   const int samples = 8; //   const float radius = 0.5; //   const float power = 2.0; //   const float zFar = 40.0; //    uniform sampler2D normBuff; //   uniform sampler2D depthBuff; //   uniform sampler2D randMap; //      uniform sampler2D ssaoMask; //  SSAO -  uniform vec2 scr; //    randMap,     SSAO uniform vec3 rndTable[samples]; //  uniform mat4 proj; //   layout(location = 0) out float outColor; //   in vec2 texCoord; //   in vec3 viewRay; //    void main() { //      ,    -   float k = texture(ssaoMask, texCoord).x; if (k==1.0) discard; //          -  float depth = texture(depthBuff, texCoord).x; if (depth==1.0) discard; depth *= zFar; vec3 pos = viewRay*depth; vec3 normal = texture(normBuff, texCoord).xyz*2.0-1.0; vec3 rvec = texture(randMap, texCoord*scr).xyz*2.0-1.0; vec3 tangent = normalize(rvec-normal*dot(rvec, normal)); vec3 bitangent = cross(tangent, normal); mat3 rotate = mat3(tangent, bitangent, normal); float acc = 0.0; for (int i=0; i<samples; i++) { vec3 samplePos = rotate*rndTable[i]; //  samplePos = samplePos*radius+pos; //        //          ,            vec4 shift = proj*vec4(samplePos, 1.0); shift.xy /= shift.w; shift.xy = shift.xy*0.5+0.5; //   z- float sampleDepth = texture(depthBuff, shift.xy).x*zFar; //       -      .     ,       ,   smoothstep,   -   float distanceCheck = smoothstep(0.0, 1.0, radius/abs(pos.z-sampleDepth)); //       -     .  - ,    step acc += step(sampleDepth, samplePos.z)*distanceCheck; } outColor = pow(1.0-(acc/float(samples)), power); //   } 

рдмрдирд╛рд╡рдЯ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ




рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ (SSAO рдХрд╛ рдЖрдХрд╛рд░ рд╕реНрдХреНрд░реАрди рд╕реЗ 2 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ):

(SSAO рдХрд╛ рдЖрдХрд╛рд░ рд╕реНрдХреНрд░реАрди рд╕реЗ 1.5 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ):


рдмреНрдпреЛрд░рд╛


рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдкрдорд╛рдирдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛ рджрд┐рдпрд╛ред
рдмрд╛рдЗрдЯ рдХреНрд░рдо
рдЬрдм рдореИрдВрдиреЗ рдмрдирд╛рд╡рдЯ рдФрд░ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХрдирд╡рд░реНрдЯрд░ рд▓рд┐рдЦрд╛, рддреЛ рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рдПрдЖрд░рдПрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ x86 рд╕реЗ рдЕрд▓рдЧ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯ рдХреА рд▓рдВрдмрд╛рдИ рд╣реЛрддреА рд╣реИ, рддреЛ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдРрд╕рд╛ рди рдХрд░реЗрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
  • uint32_t htonl (uint32_t hostlong);
  • uint16_t htons (uint16_t hostshort);

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ (Qt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рд╕рд╛рде рдХреБрдЫ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:
 #include <netinet/in.h> ... QDataStream out(&file); out << htons(s); //     unsigned short out << htonl(*((unsigned int*)&f)); //     float 
рдЖрдВрд╢рд┐рдХ рд╡рд┐рднрд╛рдЬрдХ
рдХреНрд╖реЗрддреНрд░реАрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, sscanf рдлрд╝рдВрдХреНрд╢рди рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрд╣реАрдВ рдмрд┐рдВрджреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдВрд╢рд┐рдХ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХрд╣реАрдВ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдореЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 readed1 = sscanf("float: 1,5", "float: %f", &f); readed2 = sscanf("float: 1.5", "float: %f", &f); 

рд░реАрдбреЗрдб 1 рдФрд░ рд░реАрдб 2 рдХреЗ рдорд╛рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдХреНрд╖реЗрддреНрд░реАрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, * .obj рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрддреЗ рд╕рдордпред
рд▓реЙрдЧ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдмреНрд░реЗрдХ
рдпрджрд┐ рдЖрдк рд▓реЙрдЧрдХреИрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рд▓реЙрдЧ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдХрдо рд╕реЗ рдХрдо рдиреЛрдЯ 3 n9000 рдкрд░, рдЬрдм рд╕реВрдЪрдирд╛ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рд▓реЙрдЧ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддреА рд╣реИ (рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рджрд░ рд╣рд░ рд╕реЗрдХрдВрдб), рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореИрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдХрд┐ рдЬрдм рддрдХ рдореИрдВ рд▓реЙрдЧ (adb logcat -c рдХрдорд╛рдВрдб) рдХреЛ рд╕рд╛рдл рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ рддрдм рддрдХ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ред
рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреА.рдкреА.рдпреВ.
рдПрдХ shader рд▓рд┐рдЦрд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ gpu рд╡рд╛рд▓реЗ рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЙрдкрд░реЛрдХреНрдд SSAO рд╢реЗрдбрд░ рдХреЛрдб рдорд╛рд▓реА рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдбреНрд░реЗрдиреЛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ 320 рдФрд░ 330) рдкрд░ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдбреНрд░реЗрдиреЛ (рдХрдо рд╕реЗ рдХрдо рд╢реЗрд╖ 300 shader рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ) рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рддрд╛ рд╣реИред рдореБрдЭреЗ shader рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛, рд▓реВрдк рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рд╛:
 ... float getSample(in int i, in mat3 rotate, in vec3 pos, in vec3 rnd) { vec3 samplePos = rotate*rnd; samplePos = samplePos*radius+pos; vec4 shift = proj*vec4(samplePos, 1.0); shift.xy /= shift.w; shift.xy = shift.xy*0.5+0.5; float sampleDepth = texture(depthBuff, shift.xy).x*zFar; float distanceCheck = smoothstep(0.0, 1.0, radius/abs(pos.z-sampleDepth)); return step(sampleDepth, samplePos.z)*distanceCheck; } void main() { ... float acc = 0.0; acc += getSample(0, rotate, pos, rndTable[0]); acc += getSample(1, rotate, pos, rndTable[1]); acc += getSample(2, rotate, pos, rndTable[2]); acc += getSample(3, rotate, pos, rndTable[3]); acc += getSample(4, rotate, pos, rndTable[4]); acc += getSample(5, rotate, pos, rndTable[5]); acc += getSample(6, rotate, pos, rndTable[6]); acc += getSample(7, rotate, pos, rndTable[7]); outColor = pow(1.0-(acc/float(samples)), power); } 

рдпрд╣ рднрдпрд╛рдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ - рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдпрд╛ рдкреАрдПрдо рдореЗрдВ рд▓рд┐рдЦреЗрдВред
NDK рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП IDE рдХреЗ рд░реВрдк рдореЗрдВ QtCreator
рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЧреНрд░рд╣рдг рдпрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗ рдЕрдзрд┐рдХ рдХреНрдпреВрдЯреАрдХреНрд░реЗрдЯрд░ рдкрд╕рдВрдж рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдирдбреАрдХреЗ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХреНрд▓рд┐рдкреНрд╕ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ QtCreator рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ:
Qt рдХреНрд░рд┐рдПрдЯрд░ рдЦреЛрд▓реЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ -> рдирдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ ... -> рдЖрдпрд╛рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ -> рдЖрдпрд╛рдд рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЬрд╛рдПрдБ
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ


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


рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреНрд░реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдВрдЧреА рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдХреНрдпреВрдЯреА рдирд┐рд░реНрдорд╛рддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдПрдЧрд╛:
MyProject.config - рдпрд╣рд╛рдВ рдЖрдк рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NEON рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ #define __ARM_NEON__ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реА
MyProject.files - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреНрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ
MyProject.includes - рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдирдХреНрд▓реВрдЬрд╝рди рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 /home/torvald/android-ndk-r9/sources/android/cpufeatures /home/torvald/android-ndk-r9/sources/cxx-stl/stlport/stlport /home/torvald/android-ndk-r9/sources/cxx-stl/gabi++/include /home/torvald/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.6/include /home/torvald/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed /home/torvald/android-ndk-r9/platforms/android-18/arch-arm/usr/include /home/torvald/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.6/include/ /home/torvald/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.6/include/-fixed 

рдЖрдк рд╕рдВрдХрд▓рди рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рддреИрдирд╛рддреА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 #!/bin/sh case "$1" in clean) ndk-build clean && ant clean ;; deploy) adb install -r bin/MainActivity-debug.apk > /dev/null 2>&1 & # && adb logcat -c && adb logcat -s "SSAOTest" #      Qt Creator -    ;; run) #adb shell am start -n com.torvald.ssaotest/com.torvald.ssaotest.MainActivity > /dev/null 2>&1 & ;; *) #kill $(ps aux | grep "adb logcat" | grep -v "grep" | awk '{print $2}') > /dev/null 2>&1 & ndk-build NDK_DEBUG=0 -j9 && ant debug ;; esac 

рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдЯреИрдм рдореЗрдВ, рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ:
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ




рдпрд╣ рд╕рдм рд╣реИ, рдЕрдм рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ, рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХреНрдпреВрдЯреА рдХреНрд░рд┐рдПрдЯрд░ рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрдЯреАрдПрд╕рдПрд▓ рдФрд░ рд╕реА ++ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ, рдСрдЯреЛ-рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рдЕрдиреНрдп рдмрдиреНрд╕ред


рдбреЗрдореЛ


рдпрджрд┐ OpenGL ES 3.0 рдХреЗ рд╕рд╛рде Android рдкрд░ рдХреЛрдИ рдбрд┐рд╡рд╛рдЗрд╕ рд╣реИ, рддреЛ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ GUI рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рд╢рд░реНрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рдКрдкрд░ / рдиреАрдЪреЗ рд╕реНрд▓рд╛рдЗрдб рдХрд░реЗрдВ - рдЬрд╝реВрдо рдЗрди / рдЬрд╝реВрдо рдЖрдЙрдЯ рдХрд░реЗрдВ
  2. рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ (ssao, рдХрдо ssao, ssao + рд░рдВрдЧ, рд░рдВрдЧ рдХреЗрд╡рд▓) рдмрджрд▓реЗрдВ
  3. рдкрд░ / рдмрдВрдж рдХрд▓рдВрдХ
  4. рджреГрд╢реНрдп рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди

рдореБрдлреНрдд рд╕реНрдХреНрд░реАрди рдХреНрд╖реЗрддреНрд░ - рдХреИрдорд░рд╛ рд░реЛрдЯреЗрд╢рди


рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:

рд╕реНрд░реЛрдд рдХреЛрдб - рдЕрдкрдиреЗ рдХреЛ рдкрде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛
apk - рдиреЛрдЯ 3 n9000 (mali T62), рдиреЛрдЯ 3 n9005 (рдПрдбреНрд░реЗрдиреЛ 330), рдиреЗрдХреНрд╕рд╕ 5 (рдПрдбреНрд░реЗрдиреЛ 330), рдПрдЪрдЯреАрд╕реА рд╡рди (рдПрдбреНрд░реЗрдиреЛ 320) рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╕рдВрджрд░реНрдн


рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╛рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрдн:
рд╕реНрдХреНрд░реАрди-рд╕реНрдкреЗрд╕ рдПрдВрдмрд┐рдПрдВрд╕ рдЗрдВрдкреНрд▓реАрдореЗрдВрдЯ рдСрди рд╕реНрдЯреЗрдк 3 рдбреАред SSAO рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ
OpenGL ES 3.0 рдПрдкреАрдЖрдИ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдб - OpenGL ES 3.0 рдХрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдВрджрд░реНрдн рд╣реЗрдорд┐рд╕реНрдлреЛрд░рд┐рдХрд▓
рд╕реНрдХреНрд░реАрди-рд╕реНрдкреЗрд╕ рдПрдореНрдмрд┐рдПрдВрдЯ рдЗрдВрдХреНрд▓реВрдЬрди - рд╣реЗрдорд┐рд╕реНрдлреЛрд░рд┐рдХрд▓ SSAO
рд╕реНрдЯреЛрди рдмреНрд░рд┐рдЬ 3 рдбреА рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ - рдкреБрд▓ рдореЙрдбрд▓ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ
рдЬреЙрди-рдЪреИрдкрдореИрди-рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдбреЗрдореЛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ : SSAO рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ - рдореЗрд░реЗ рд▓рд┐рдП рд╣реЗрдорд┐рд╕рдлреЗрд░рд┐рдХрд▓
SSAO SSAO рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВ рдЧреЗрдо
рдмрдлрд╝рд░ рдХрд╛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЖрдХреНрд░рдордг рдХрд░рдирд╛ -
рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП z- рдмрдлрд░ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрднреНрдпрд╛рд╡реЗрджрди,
рдЕрдкрдиреЗ SSAO рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬрд╛рдиреЗрдВ - SSAO рдХреА рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ / рдЬрд╛рдо / рдЕрд╢реБрджреНрдзрд┐ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ

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


All Articles