рдЧрддрд┐рд╢реАрд▓ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рджрд░реНрд╢рди

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЛ рдЬреЙрди рдЪреИрдкрдореИрди рдХреЗ рд▓реЗрдЦ "рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓реЛрдХрд▓ рдПрдХреНрд╕рдкреЛрдЬрд░" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

рдЫрд╡рд┐

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

рдХрдо / рдЙрдЪреНрдЪ рдЧрддрд┐рд╢реАрд▓ рд░реЗрдВрдЬ


рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ (1990 рдХреЗ рджрд╢рдХ) рдореЗрдВ, рдЦреЗрд▓ рдХреЛ рд╕реАрдзреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд LDR (рд╕рдВрдХреАрд░реНрдг рдЧрддрд┐рд╢реАрд▓ рд░реЗрдВрдЬ) рдкреНрд░рд╛рд░реВрдк (рдЧрд╛рдорд╛ рд╕реНрдерд╛рди, 8 рдмрд┐рдЯреНрд╕) рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╕рд░рд▓ рдФрд░ рд╕рд╕реНрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреЛрдЯреЛрд░рд┐рдЕрд▓рд┐рд╕реНрдЯрд┐рдХ рдЪрд┐рддреНрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

рдЧреНрд▓реЛрдмрд▓ рдСрдЯреЛ рдПрдХреНрд╕рдкреЛрдЬрд░


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

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

float Lavg = exp(textureLod(txLuminance, uv, 99.0).x); float ev100 = log2(Lavg * 100.0 / 12.5); ev100 -= uExposureCompensation; // optional manual bias float exposure = 1.0 / (1.2 * exp2(ev100)); 

рд╕рдВрддреГрдкреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрдЧ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдИрдПрд╕рдУ рдорд╛рдирдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд, рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ (3)

рдЪреВрдВрдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдФрд╕рдд рдЪрдордХ рдЧрддрд┐рд╢реАрд▓ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдШрд╛рддреАрдп рд╣рд┐рд╕реНрдЯреИрд░рд┐рд╕реАрд╕ рдлрд╝рдВрдХреНрд╢рди (2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рдЪрд┐рдХрдирд╛рдИ рдЬрд╛рддреА рд╣реИ:

 Lavg = Lavg + (Lnew - Lavg) * (1.0 - exp(uDeltaTime * -uRate)); 

рдЕрдиреБрд╡рд╛рджрдХ рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ shader downsampling рдмрдирд╛рд╡рдЯ рдХреА рдЪрдордХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдореАрд▓ рд╕реНрддрд░ (1x1) рдХреА рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рдиред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧреЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЗрд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

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

рдЫрд╡рд┐

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

рд╕реНрдерд╛рдиреАрдп рдПрдИ


рдпрджрд┐ рд╣рдо рдбрд╛рдЙрдирд╕рдореНрдкрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдордзреНрдпрдо рдЪрдордХ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдерд╛рдиреАрдп рдФрд╕рдд рдЪрдордХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реНрдпреВрдорд┐рдиреЗрдВрд╕ рдмрдлрд░ (4) рдХреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред

 float Lavg = exp(textureLod(txLuminance, uv, uLuminanceLod).x; 

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

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдорд╣рд╛рди рд╡рд┐рдЪрд╛рд░ рд╣реИ: рдЫрд╡рд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкрдбрд╝реЛрд╕реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдкрд░реАрддред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдПрдХ рдШреГрдгрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рд╕рдмрд╕реЗ рдЕрдкреНрд░рд┐рдп рдмреНрд▓реЙрдХ "halos" рд╣реИрдВ рдЬреЛ рдЙрдЪреНрдЪ рд╡рд┐рдкрд░реАрдд рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЗрдВ рд▓реНрдпреВрдорд┐рдиреЗрдиреНрд╕ рдмрдлрд░ рдХреЛ рдкреВрд░реНрд╡ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдХреЗ рдпрд╛ рдмрд╕ рдмрд╛рдЗрд╕рд┐рдХреНрдпреВ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рддреЛ рдЪрд┐рдХрдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдпрд╣ рдЕрднреА рднреА рдШреГрдгрд┐рдд рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИред

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

рдЫрд╡рд┐

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

 float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; float L = mix(Lglobal, Llocal, uLocalExposureRatio); // .. use L to compute the final exposure scale as before 

рдЫрд╡рд┐

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

рдЫрд╡рд┐

рдСрдЯреЛ рдорд┐рдХреНрд╕ рдЕрдиреБрдкрд╛рдд


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

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

рдЫрд╡рд┐

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

рдЫрд╡рд┐

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

рдЫрд╡рд┐

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ "рдЙрдЬреНрдЬреНрд╡рд▓" рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЪрдордХ рдмрд╣реБрдд рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ:

рдЫрд╡рд┐

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

 float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; // average in x float Lmax = exp(textureLod(txLuminance, uv, 99.0).y; // max in y float Lratio = min(saturate(abs(Lmax - Lglobal) / Lmax), uLocalExposureMax); float L = mix(Lglobal, Llocal, Lratio); // .. use L to compute the final exposure scale as before 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ uLocalExposureMax рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдПрдХреНрд╕рдкреЛрдЬрд╝рд░ рдХреЗ рдкреВрд░реНрдг рдЕрдзрд┐рдХрддрдо рдбрд┐рдЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ uLocalExposureMax <0.3 ред

рдЕрдВрддрд┐рдо рдХреЛрдб
 float Llocal = exp(textureLod(txLuminance, uv, uLuminanceLod).x; float Lglobal = exp(textureLod(txLuminance, uv, 99.0).x; // average in x float Lmax = exp(textureLod(txLuminance, uv, 99.0).y; // max in y float Lratio = min(saturate(abs(Lmax - Lglobal) / Lmax), uLocalExposureMax); float L = mix(Lglobal, Llocal, Lratio); float ev100 = log2(L * 100.0 / 12.5); ev100 -= uExposureCompensation; // optional manual bias float exposure = 1.0 / (1.2 * exp2(ev100)); vec3 result = hdrColor * exposure; result += bloom; //etc outColor.rgb = result; 


рдирд┐рд╖реНрдХрд░реНрд╖


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

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

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


  1. рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдЯреЛрдирдореИрдкрд┐рдВрдЧ (рдмрд╛рд░реНрдЯ рд╡реНрд░реЛрдирд╕реНрдХреА )
  2. рдПрдХ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдзрд╛рд░рд┐рдд рдХреИрдорд░рд╛ (рдкреИрдбреНрд░рд┐рдХ рд╣реЗрдиреЗрд╕реА) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
  3. рдлреНрд░реЙрд╕реНрдЯрдмрд╛рдЗрдЯ рдХреЛ PBR (S├йbastien Lagarde, et alред) рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ред
  4. рдЯреЛрдирдореИрдкрд┐рдВрдЧ рдкрд░ рдПрдХ рдХрд░реАрдм рджреЗрдЦреЛ (рдореИрдЯ рдкреЗрдЯреНрдЯреАрдиреЛ )
  5. рд▓реАрдирд┐рдпрд░ рд╣реЛрдиреЗ рдХрд╛ рдорд╣рддреНрд╡ (рд▓реИрд░реА рдЧреНрд░рд┐рдЯреНрдЬрд╝, рдПрдЯ рдЕрд▓ред)
  6. рдЙрдиреНрдирдд рддрдХрдиреАрдХ рдФрд░ рдПрдЪрдбреАрдЖрд░ / рд╡реАрдбреАрдЖрд░ рдХрд▓рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЯрд┐рдореЛрдереА рд▓реЛрдЯреНрд╕) рдХрд╛ рдЕрдиреБрдХреВрд▓рди

рдПрдЪрдбреАрдЖрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрд╕рдЖрдИрдмреАрдПрд▓ рдЖрд░реНрдХрд╛рдЗрд╡ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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


All Articles