The Witcher 3 рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ: рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд╢ рдкреНрд░рднрд╛рд╡

рдЫрд╡рд┐

[рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд┐рдЫрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ: рдкрд╣рд▓рд╛ рдФрд░ рджреВрд╕рд░рд╛ рдФрд░ рддреАрд╕рд░рд╛ ред]

рднрд╛рдЧ 1. рд╕рд┐рд░рд╕ рдмрд╛рджрд▓


рдЬрдм рдЦреЗрд▓ рдЦреБрд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджреБрдирд┐рдпрд╛ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрдХрд╛рд╢ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛ - рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдЖрдХрд╛рд╢ рд╕рдЪрдореБрдЪ рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдХрд╛ рд▓рдЧрднрдЧ 40-50% рд▓реЗрддрд╛ рд╣реИред рдЖрдХрд╛рд╢ рдПрдХ рд╕реБрдВрджрд░ рдврд╛рд▓ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕рдореЗрдВ рддрд╛рд░реЗ, рд╕реВрд░реНрдп, рдЪрдВрджреНрд░рдорд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдмрд╛рджрд▓ рд╣реИрдВред

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

рдЗрд╕ Witcher 3 рдореЗрдВ рдмрд╛рджрд▓реЛрдВ рдХреА рдХрдИ рдкрд░рддреЗрдВ рд╣реИрдВред рдореМрд╕рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдХреЗрд╡рд▓ рд╕рд┐рд░рд╕ рдХреЗ рдмрд╛рджрд▓ , рдЙрдЪреНрдЪ рдХреНрдпреВрдореНрдпрд▓рд╕ рдмрд╛рджрд▓ , рд╕рдВрднрд╡рддрдГ рд╕реНрддрд░рд┐рдд рдмрд╛рджрд▓реЛрдВ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рдХреБрдЫ рдмрд╛рджрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддреВрдлрд╛рди рдХреЗ рджреМрд░рд╛рди) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдХреЛрдИ рдмрд╛рджрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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


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

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

рдореИрдВрдиреЗ рдЪреБрдбрд╝реИрд▓ 3: рд░рдХреНрдд рдФрд░ рд╢рд░рд╛рдм рд╕реЗ рд╕рд┐рд░рд╕ рдмрд╛рджрд▓реЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реАред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлреНрд░реЗрдо рд╣реИ:


рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ


рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж


рджреВрд╕рд░реЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХреЗ рдмрд╛рдж

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

рдЬрд┐рдпреЛрдореЗрдЯреНрд░рд┐рдХ рдФрд░ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░


рдкрд┐рдХреНрд╕реЗрд▓ shader рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЬреНрдпрд╛рдорд┐рддреАрдп рдФрд░ рд╢реАрд░реНрд╖ shaders рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдмрд╛рджрд▓реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд▓реА рдПрдХ рдирд┐рдпрдорд┐рдд рдЖрдХрд╛рд╢ рдЧреБрдВрдмрдж рдХреА рддрд░рд╣ рд╣реИ:


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


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

рдкрд┐рдХреНрд╕реЗрд▓ shader


рдкрд┐рдХреНрд╕реЗрд▓ shader рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 ps_5_0  
    dcl_globalFlags refactoringAllowed  
    dcl_constantbuffer cb0[10], immediateIndexed  
    dcl_constantbuffer cb1[9], immediateIndexed  
    dcl_constantbuffer cb12[238], immediateIndexed  
    dcl_constantbuffer cb4[13], immediateIndexed  
    dcl_sampler s0, mode_default  
    dcl_resource_texture2d (float,float,float,float) t0  
    dcl_resource_texture2d (float,float,float,float) t1  
    dcl_input_ps linear v0.xyzw  
    dcl_input_ps linear v1.xyzw  
    dcl_input_ps linear v2.w  
    dcl_input_ps linear v3.xyzw  
    dcl_input_ps linear v4.xyz  
    dcl_input_ps linear v5.xyz  
    dcl_output o0.xyzw  
    dcl_temps 4  
   0: mul r0.xyz, cb0[9].xyzx, l(1.000000, 1.000000, -1.000000, 0.000000)  
   1: dp3 r0.w, r0.xyzx, r0.xyzx  
   2: rsq r0.w, r0.w  
   3: mul r0.xyz, r0.wwww, r0.xyzx  
   4: mul r1.xy, cb0[0].xxxx, cb4[5].xyxx  
   5: mad r1.xy, v1.xyxx, cb4[4].xyxx, r1.xyxx  
   6: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r1.xyxx, t0.xyzw, s0  
   7: add r1.xyz, r1.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)  
   8: add r1.xyz, r1.xyzx, r1.xyzx  
   9: dp3 r0.w, r1.xyzx, r1.xyzx  
  10: rsq r0.w, r0.w  
  11: mul r1.xyz, r0.wwww, r1.xyzx  
  12: mul r2.xyz, r1.yyyy, v3.xyzx  
  13: mad r2.xyz, v5.xyzx, r1.xxxx, r2.xyzx  
  14: mov r3.xy, v1.zwzz  
  15: mov r3.z, v3.w  
  16: mad r1.xyz, r3.xyzx, r1.zzzz, r2.xyzx  
  17: dp3_sat r0.x, r0.xyzx, r1.xyzx  
  18: add r0.y, -cb4[2].x, cb4[3].x  
  19: mad r0.x, r0.x, r0.y, cb4[2].x  
  20: dp2 r0.y, -cb0[9].xyxx, -cb0[9].xyxx  
  21: rsq r0.y, r0.y  
  22: mul r0.yz, r0.yyyy, -cb0[9].xxyx  
  23: add r1.xyz, -v4.xyzx, cb1[8].xyzx  
  24: dp3 r0.w, r1.xyzx, r1.xyzx  
  25: rsq r1.z, r0.w  
  26: sqrt r0.w, r0.w  
  27: add r0.w, r0.w, -cb4[7].x  
  28: mul r1.xy, r1.zzzz, r1.xyxx  
  29: dp2_sat r0.y, r0.yzyy, r1.xyxx  
  30: add r0.y, r0.y, r0.y  
  31: min r0.y, r0.y, l(1.000000)  
  32: add r0.z, -cb4[0].x, cb4[1].x  
  33: mad r0.z, r0.y, r0.z, cb4[0].x  
  34: mul r0.x, r0.x, r0.z  
  35: log r0.x, r0.x  
  36: mul r0.x, r0.x, l(2.200000)  
  37: exp r0.x, r0.x  
  38: add r1.xyz, cb12[236].xyzx, -cb12[237].xyzx  
  39: mad r1.xyz, r0.yyyy, r1.xyzx, cb12[237].xyzx  
  40: mul r2.xyz, r0.xxxx, r1.xyzx  
  41: mad r0.xyz, -r1.xyzx, r0.xxxx, v0.xyzx  
  42: mad r0.xyz, v0.wwww, r0.xyzx, r2.xyzx  
  43: add r1.x, -cb4[7].x, cb4[8].x  
  44: div_sat r0.w, r0.w, r1.x  
  45: mul r1.x, r1.w, cb4[9].x  
  46: mad r1.y, -cb4[9].x, r1.w, r1.w  
  47: mad r0.w, r0.w, r1.y, r1.x  
  48: mul r1.xy, cb0[0].xxxx, cb4[11].xyxx  
  49: mad r1.xy, v1.xyxx, cb4[10].xyxx, r1.xyxx  
  50: sample_indexable(texture2d)(float,float,float,float) r1.x, r1.xyxx, t1.xyzw, s0  
  51: mad r1.x, r1.x, cb4[12].x, -cb4[12].x  
  52: mad_sat r1.x, cb4[12].x, v2.w, r1.x  
  53: mul r0.w, r0.w, r1.x  
  54: mul_sat r0.w, r0.w, cb4[6].x  
  55: mul o0.xyz, r0.wwww, r0.xyzx  
  56: mov o0.w, r0.w  
  57: ret 

рджреЛ рдирд┐рд░реНрдмрд╛рдз рдмрдирд╛рд╡рдЯ рдЗрдирдкреБрдЯ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ ( xyz рдЪреИрдирд▓ ) рдФрд░ рдПрдХ рдХреНрд▓рд╛рдЙрдб рдЖрдХрд╛рд░ (рдЪреИрдирд▓ a ) рд╣реИред рджреВрд╕рд░рд╛ рдЖрдХрд╛рд░ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЛрд░ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛, рд╕реАрдбреА рдкреНрд░реЙрдЬреЗрдХреНрдЯ рд░реЗрдб рдкреНрд░реЙрдкрд░реНрдЯреА


рдХреНрд▓рд╛рдЙрдб рд╢реЗрдк, рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реАрдбреА рдкреНрд░реЙрдЬреЗрдХреНрдЯ рд░реЗрдб


рд╢реЛрд░ рдмрдирд╛рд╡рдЯ, рд╕реАрдбреА рдкреНрд░реЙрдЬреЗрдХреНрдЯ рд░реЗрдб

рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреНрд▓рд╛рдЙрдб рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдореБрдЦреНрдп рдмрдлрд░ cb4 рд╣реИред рдЗрд╕ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд░реНрде рд╣реИрдВ:


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп cbuffers рд╕реЗ рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд╣рдо рдЙрди рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

Z- рджрд┐рд╢рд╛ рдЙрд▓рдЯреА рдзреВрдк


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

   0: mul r0.xyz, cb0[9].xyzx, l(1.000000, 1.000000, -1.000000, 0.000000)  
   1: dp3 r0.w, r0.xyzx, r0.xyzx  
   2: rsq r0.w, r0.w  
   3: mul r0.xyz, r0.wwww, r0.xyzx  

   float3 invertedSunlightDir = normalize(lightDir * float3(1, 1, -1) );

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, Z рдЕрдХреНрд╖ рдКрдкрд░ рдХреА рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИ, рдФрд░ cb0 [9] рд╕реВрд░реНрдп рдХреЗ рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╣реИред рдпрд╣ рд╡реЗрдХреНрдЯрд░ рд╕реВрд░реНрдп рдкрд░ рд▓рдХреНрд╖рд┐рдд рд╣реИ - рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ! рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕рд░рд▓ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбрд░ рд▓рд┐рдЦрдХрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рд░рд▓ рдПрдирдбреАрдУрдЯреАрдПрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЖрд╕реНрдердЧрд┐рдд рд╢реЗрдк рдкрд╛рд╕ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдХреНрд▓рд╛рдЙрдб рдЯреЗрдХреНрд╕рдЪрд░ рд╕реИрдВрдкрд▓рд┐рдВрдЧ


рдЕрдЧрд▓рд╛ рдХрджрдо рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ рдХреЛ рдХреНрд▓рд╛рдЙрдб рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рджреЗрдиреЗ, рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

   4: mul r1.xy, cb0[0].xxxx, cb4[5].xyxx   
   5: mad r1.xy, v1.xyxx, cb4[4].xyxx, r1.xyxx   
   6: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r1.xyxx, t0.xyzw, s0   
   7: add r1.xyz, r1.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)   
   8: add r1.xyz, r1.xyzx, r1.xyzx   
   9: dp3 r0.w, r1.xyzx, r1.xyzx   
  10: rsq r0.w, r0.w   
   
   
   // Calc sampling coords  
   float2 cloudTextureUV = Texcoords * textureScale + elapsedTime * speedFactors;  
   
   // Sample texture and get data from it  
   float4 cloudTextureValue = texture0.Sample( sampler0, cloudTextureUV ).rgba;  
   float3 normalMap = cloudTextureValue.xyz;  
   float cloudShape = cloudTextureValue.a;  
   
   // Unpack normal and normalize it  
   float3 unpackedNormal = (normalMap - 0.5) * 2.0;  
   unpackedNormal = normalize(unpackedNormal);

рдЗрд╕рд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред

рдмрд╛рджрд▓реЛрдВ рдХреА рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЧрддрд┐ (рдЧреБрдгрд╛рдВрдХ) рдореЗрдВ ( cb [0] .x ) рдЧреБрдгрд╛ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдЬреЛ рдЖрдХрд╛рд╢ рдореЗрдВ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдЪрд▓рдиреЗ рдХреА рдЧрддрд┐ ( cb4 [5] .xy ) рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛, UVs рдЖрдХрд╛рд╢ рдЧреБрдВрдмрдж рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд╕рд╛рде рдЦрд┐рдВрдЪреЗ рд╣реБрдП рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдмрдирд╛рд╡рдЯ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░рдХреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ( cb4 [4] .xy )ред

рдЕрдВрддрд┐рдо рд╕реВрддреНрд░ рд╣реИ:

samplingUV = Input.TextureUV * textureScale + time * speedMultiplier;

рд╕рднреА 4 рдЪреИрдирд▓реЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ (рдЖрд░рдЬреАрдмреА рдЪреИрдирд▓) рдФрд░ рдПрдХ рдХреНрд▓рд╛рдЙрдб рдЖрдХрд╛рд░ (рдЪреИрдирд▓) рд╣реИред

рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [0; 1] рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ [-1; 1] рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

unpackedNormal = (packedNormal - 0.5) * 2.0;

рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

unpackedNormal = packedNormal * 2.0 - 1.0;

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдирдкреИрдХреНрдб рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВред

рдУрд╡рд░рд▓реЗ рдорд╛рдирджрдВрдб


рд╕рд╛рдорд╛рдиреНрдп рд╡реИрдХреНрдЯрд░, рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдФрд░ рджреНрд╡рд┐-рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╡реИрдХреНрдЯрд░ рд╡реИрдХреНрдЯрд░ рд╢реАрд░реНрд╖ рдЫрд╛рдпрд╛рдХрд╛рд░ рд╕реЗ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдореИрдк рдХрд░рддреЗ рд╣реИрдВред

  11: mul r1.xyz, r0.wwww, r1.xyzx  
  12: mul r2.xyz, r1.yyyy, v3.xyzx  
  13: mad r2.xyz, v5.xyzx, r1.xxxx, r2.xyzx  
  14: mov r3.xy, v1.zwzz  
  15: mov r3.z, v3.w  
  16: mad r1.xyz, r3.xyzx, r1.zzzz, r2.xyzx  
    
   // Perform bump mapping  
   float3 SkyTangent = Input.Tangent;  
   float3 SkyNormal = (float3( Input.Texcoords.zw, Input.param3.w ));  
   float3 SkyBitangent = Input.param3.xyz;  
        
   float3x3 TBN = float3x3(SkyTangent, SkyBitangent, SkyNormal);  
   float3 finalNormal = (float3)mul( unpackedNormal, (TBN) );

рдЪрдордХ (1)


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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  17: dp3_sat r0.x, r0.xyzx, r1.xyzx  
  18: add r0.y, -cb4[2].x, cb4[3].x  
  19: mad r0.x, r0.x, r0.y, cb4[2].x  

рдпрд╣рд╛рдБ рдкреНрд░рд╢реНрди рдореЗрдВ рдлреНрд░реЗрдо рдкрд░ NdotL рдХрд╛ рджреГрд╢реНрдп рд╣реИ:


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

   // Calculate cosine between normal and up-inv lightdir  
   float NdotL = saturate( dot(invertedSunlightDir, finalNormal) );  
   
   // Param 1, line 19, r0.x  
   float intensity1 = lerp( param1Min, param1Max, NdotL );

рдЪрдордХ (2)


рдмрд╛рджрд▓реЛрдВ рдХреА рдЪрдордХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдХ рд╣реИред

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

рдЗрд╕ рдврд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рднрд╛рдЧ (1) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣реА рд╣реИ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╕реВрд░реНрдп рдХреЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рд╕реНрдерд┐рдд рдмрд╛рджрд▓реЛрдВ рдХреЛ рдХрд╛рд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдлреНрд░реЗрдо рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ param2Min рдФрд░ param2Max ( cb4 [0] .x and c44 [1] .x ) 1.0f рдкрд░ рд╕реЗрдЯ рд╣реИрдВред

  20: dp2 r0.y, -cb0[9].xyxx, -cb0[9].xyxx  
  21: rsq r0.y, r0.y  
  22: mul r0.yz, r0.yyyy, -cb0[9].xxyx  
  23: add r1.xyz, -v4.xyzx, cb1[8].xyzx  
  24: dp3 r0.w, r1.xyzx, r1.xyzx  
  25: rsq r1.z, r0.w  
  26: sqrt r0.w, r0.w  
  27: add r0.w, r0.w, -cb4[7].x  
  28: mul r1.xy, r1.zzzz, r1.xyxx  
  29: dp2_sat r0.y, r0.yzyy, r1.xyxx  
  30: add r0.y, r0.y, r0.y  
  31: min r0.y, r0.y, l(1.000000)  
  32: add r0.z, -cb4[0].x, cb4[1].x  
  33: mad r0.z, r0.y, r0.z, cb4[0].x  
  34: mul r0.x, r0.x, r0.z  
  35: log r0.x, r0.x  
  36: mul r0.x, r0.x, l(2.200000)  
  37: exp r0.x, r0.x   
   
   
   // Calculate normalized -lightDir.xy (20-22)  
   float2 lightDirXY = normalize( -lightDir.xy );  
   
   // Calculate world to camera  
   float3 vWorldToCamera = ( CameraPos - WorldPos );  
   float worldToCamera_distance = length(vWorldToCamera);  
        
   // normalize vector  
   vWorldToCamera = normalize( vWorldToCamera );  
        
   
   float LdotV = saturate( dot(lightDirXY, vWorldToCamera.xy) );  
   float highlightedSkySection = saturate( 2*LdotV );  
   float intensity2 = lerp( param2Min, param2Max, highlightedSkySection );  
   
   float finalIntensity = pow( intensity2 *intensity1, 2.2);

рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рд╣рдо рджреЛрдиреЛрдВ рдЪрдордХ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ 2.2 рдХреА рд╢рдХреНрддрд┐ рддрдХ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред

рдмрд╛рджрд▓ рдХрд╛ рд░рдВрдЧ


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

рддрдм рдкрд░рд┐рдгрд╛рдо рдЕрдВрддрд┐рдо рдЧреБрдгрди рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

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

  38: add r1.xyz, cb12[236].xyzx, -cb12[237].xyzx  
  39: mad r1.xyz, r0.yyyy, r1.xyzx, cb12[237].xyzx  
  40: mul r2.xyz, r0.xxxx, r1.xyzx  
  41: mad r0.xyz, -r1.xyzx, r0.xxxx, v0.xyzx  
  42: mad r0.xyz, v0.wwww, r0.xyzx, r2.xyzx  
   
  float3 cloudsColor = lerp( cloudsColorBack, cloudsColorFront, highlightedSunSection );  
  cloudsColor *= finalIntensity;  
  cloudsColor = lerp( cloudsColor, FogColor, FogAmount );

рдХреНрд╖рд┐рддрд┐рдЬ рдкрд░ рд╕рд┐рд░рд╕ рдХреЗ рдмрд╛рджрд▓ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ


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

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреВрд╕рд░реА рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рд╡реЗрдХреНрдЯрд░ рд╡рд░реНрд▓реНрдбрдЯреЙрдореНрдХреЗрд░рд╛ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХреА :

  23: add r1.xyz, -v4.xyzx, cb1[8].xyzx  
  24: dp3 r0.w, r1.xyzx, r1.xyzx  
  25: rsq r1.z, r0.w  
  26: sqrt r0.w, r0.w

рдЖрдЗрдП рдХреЛрдб рдореЗрдВ рдЗрд╕ рд▓рдВрдмрд╛рдИ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЦреЛрдЬреЗрдВ:

  26: sqrt r0.w, r0.w  
  27: add r0.w, r0.w, -cb4[7].x  
  ...  
  43: add r1.x, -cb4[7].x, cb4[8].x  
  44: div_sat r0.w, r0.w, r1.x

рд╡рд╛рд╣, рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реИ?

cb [7] .x рдФрд░ cb [8] .x рдХрд╛ рдорд╛рди 2000.0 рдФрд░ 7000.0 рд╣реИред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдирд╕реНрдЯреЗрдк рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ ред

рдЙрд╕реЗ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ: рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо - рдЕрдВрддрд░рд╛рд▓ рдФрд░ рд╡реА - рдорд╛рдиред

рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ v рдЕрдВрддрд░рд╛рд▓ [ рдорд┐рдирдЯ - рдЕрдзрд┐рдХрддрдо ] рдореЗрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдЕрдВрддрд░рд╛рд▓ [0.0 - 1.0] рдореЗрдВ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ v рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рддреЛ linstep 0.0 рдпрд╛ 1.0 рджреЗрддрд╛ рд╣реИред

рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

linstep( 1000.0, 2000.0, 999.0) = 0.0
linstep( 1000.0, 2000.0, 1500.0) = 0.5
linstep( 1000.0, 2000.0, 2000.0) = 1.0

рдпрд╣реА рд╣реИ, рдпрд╣ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд╕реЗ рд╕реНрдореВрдерд╕реНрдЯреЗрдк рдХреЗ рд╕рдорд╛рди рд╣реИ , рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд░реНрдорд┐рдЯрд┐рдпрди рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рдмрдЬрд╛рдп, рд░реИрдЦрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓рд┐рдирд╕реНрдЯреЗрдк HLSL рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

 // linstep:  
 //  
 // Returns a linear interpolation between 0 and 1 if t is in the range [min, max]   
 // if "v" is <= min, the output is 0  
 // if "v" i >= max, the output is 1  
   
 float linstep( float min, float max, float v )  
 {  
   return saturate( (v - min) / (max - min) );  
 } 

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

  45: mul r1.x, r1.w, cb4[9].x  
  46: mad r1.y, -cb4[9].x, r1.w, r1.w  
  47: mad r0.w, r0.w, r1.y, r1.x  
   
   float distanceAttenuation = linstep( fadeDistanceStart, fadeDistanceEnd, worldToCamera_distance );  
    
   float fadedCloudShape = closeCloudsHidingFactor * cloudShape;  
   cloudShape = lerp( fadedCloudShape, cloudShape, distanceAttenuation );

CloudShape рдкрд╣рд▓реА рдмрдирд╛рд╡рдЯ рд╕реЗ рдПрдХ .a рдЪреИрдирд▓ рд╣реИ, рдФрд░ CloseCloudsHidingFactor рдПрдХ рдирд┐рд░рдВрддрд░ рдмрдлрд░ рдорд╛рди рд╣реИ рдЬреЛ рдЧреЗрд░рд╛рд▓реНрдЯ рдХреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рдмрд╛рджрд▓реЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╕рднреА рдлрд╝реНрд░реЗрдореЛрдВ рдореЗрдВ, рдпрд╣ 0.0 рдХреЗ рдмрд░рд╛рдмрд░ рдерд╛, рдЬреЛ рдмрд╛рджрд▓реЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдбрд┐рд╕реНрдЯреЗрдВрд╢рд┐рдПрд╢рди 1.0 рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ (рдХреИрдорд░реЗ рд╕реЗ рдЖрдХрд╛рд╢ рдХреЗ рдЧреБрдВрдмрдж рдХреА рджреВрд░реА рдмрдврд╝рддреА рд╣реИ), рдмрд╛рджрд▓ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред

рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдирдореВрдирд╛


рдмрд╛рджрд▓реЛрдВ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдХреЗ рдирдореВрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдк рдмрдирд╛рд╡рдЯ рд╕реЗрдЯрд╕реЗрд▓ рдФрд░ рд╕реНрдкреАрдбрдореВрд▓рд┐рдкрд┐рдпрд░ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред

рдмреЗрд╢рдХ, рдЗрди рд╕рднреА рдмрдирд╛рд╡рдЯреЛрдВ рдХреЗ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд░реИрдкрд┐рдВрдЧ рдореЛрдбрд┐рдВрдЧ рдореЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдирдореВрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

  48: mul r1.xy, cb0[0].xxxx, cb4[11].xyxx  
  49: mad r1.xy, v1.xyxx, cb4[10].xyxx, r1.xyxx  
  50: sample_indexable(texture2d)(float,float,float,float) r1.x, r1.xyxx, t1.xyzw, s0  
   
   // Calc sampling coords for noise  
   float2 noiseTextureUV = Texcoords * textureScaleNoise + elapsedTime * speedFactorsNoise;  
   
   // Sample texture and get data from it  
   float noiseTextureValue = texture1.Sample( sampler0, noiseTextureUV ).x;

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдбрд╛рд▓реЗрдВ


рд╢реЛрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕реЗ рдХреНрд▓рд╛рдЙрдбрд╢реЗрдк рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдБ рдереАрдВ, рдЬрд╣рд╛рдБ param2.w рд╣реИ (рдЬреЛ рдХрд┐ рд╣рдореЗрд╢рд╛ 1.0 рд╣реИ) рдФрд░ рдиреЙрдЗрдЬрд╝рдореБрд▓реНрдЯ (рдЬрд┐рд╕рдХрд╛ рдорд╛рди 5.0 рд╣реИ, рд╕реНрдерд┐рд░ рдмрдлрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ generalCloudsVisibility рдХрд╛ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рд╣реИ , рдЬреЛ рдмрд╛рджрд▓реЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

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

  51: mad r1.x, r1.x, cb4[12].x, -cb4[12].x
  52: mad_sat r1.x, cb4[12].x, v2.w, r1.x
  53: mul r0.w, r0.w, r1.x
  54: mul_sat r0.w, r0.w, cb4[6].x
  55: mul o0.xyz, r0.wwww, r0.xyzx
  56: mov o0.w, r0.w
  57: ret   

   // Sample noise texture and get data from it  
   float noiseTextureValue = texture1.Sample( sampler0, noiseTextureUV ).x;  
   noiseTextureValue = noiseTextureValue * noiseMult - noiseMult;  
     
   float noiseValue = saturate( noiseMult * Input.param2.w + noiseTextureValue);  
   noiseValue *= cloudShape;  
     
   float finalNoise = saturate( noiseValue * generalCloudsVisibility);  
   
   return float4( cloudsColor*finalNoise, finalNoise ); 

рд╕рдВрдкреВрд░реНрдг


рддреИрдпрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд▓рдЧрддрд╛ рд╣реИред

рдЖрдк рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рддрд╕реНрд╡реАрд░ рдореЗрд░реА рд╢реЗрдбрд░ рдХреА рд╣реИ, рджреВрд╕рд░реА рдЧреЗрдо рд╢реИрдбрд░ рдХреА рд╣реИ:


рдпрджрд┐ рдЖрдк рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ shader рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рднрд╛рдЧ 2. рдХреЛрд╣рд░рд╛


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

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

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ 2014 рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдИ рдереА, рдФрд░ рдж рд╡рд┐рдЪрд░ 3 2015/2016 рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝ рд╣реБрдИ рдереА, рдЧреЗрд░рд╛рд▓реНрдЯ рдХреЗ рдХрд╛рд░рдирд╛рдореЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдореЗрдВ рдХреЛрд╣рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

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

рдпрд╣рд╛рдБ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛрд╣рд░реЗ shader рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рд╣реИ - рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реЗ рдЦреЗрд▓ (2015 рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдФрд░ рджреЛрдиреЛрдВ рдбреАрдПрд▓рд╕реА) рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ:

 ps_5_0  
    dcl_globalFlags refactoringAllowed  
    dcl_constantbuffer cb3[2], immediateIndexed  
    dcl_constantbuffer cb12[214], immediateIndexed  
    dcl_resource_texture2d (float,float,float,float) t0  
    dcl_resource_texture2d (float,float,float,float) t1  
    dcl_resource_texture2d (float,float,float,float) t2  
    dcl_input_ps_siv v0.xy, position  
    dcl_output o0.xyzw  
    dcl_temps 7  
   0: ftou r0.xy, v0.xyxx  
   1: mov r0.zw, l(0, 0, 0, 0)  
   2: ld_indexable(texture2d)(float,float,float,float) r1.x, r0.xyww, t0.xyzw  
   3: mad r1.y, r1.x, cb12[22].x, cb12[22].y  
   4: lt r1.y, r1.y, l(1.000000)  
   5: if_nz r1.y  
   6:  utof r1.yz, r0.xxyx  
   7:  mul r2.xyzw, r1.zzzz, cb12[211].xyzw  
   8:  mad r2.xyzw, cb12[210].xyzw, r1.yyyy, r2.xyzw  
   9:  mad r1.xyzw, cb12[212].xyzw, r1.xxxx, r2.xyzw  
  10:  add r1.xyzw, r1.xyzw, cb12[213].xyzw  
  11:  div r1.xyz, r1.xyzx, r1.wwww  
  12:  ld_indexable(texture2d)(float,float,float,float) r2.xyz, r0.xyww, t1.xyzw  
  13:  ld_indexable(texture2d)(float,float,float,float) r0.x, r0.xyzw, t2.xyzw  
  14:  max r0.x, r0.x, cb3[1].x  
  15:  add r0.yzw, r1.xxyz, -cb12[0].xxyz  
  16:  dp3 r1.x, r0.yzwy, r0.yzwy  
  17:  sqrt r1.x, r1.x  
  18:  add r1.y, r1.x, -cb3[0].x  
  19:  add r1.zw, -cb3[0].xxxz, cb3[0].yyyw  
  20:  div_sat r1.y, r1.y, r1.z  
  21:  mad r1.y, r1.y, r1.w, cb3[0].z  
  22:  add r0.x, r0.x, l(-1.000000)  
  23:  mad r0.x, r1.y, r0.x, l(1.000000)  
  24:  div r0.yzw, r0.yyzw, r1.xxxx  
  25:  mad r1.y, r0.w, cb12[22].z, cb12[0].z  
  26:  add r1.x, r1.x, -cb12[22].z  
  27:  max r1.x, r1.x, l(0)  
  28:  min r1.x, r1.x, cb12[42].z  
  29:  mul r1.z, r0.w, r1.x  
  30:  mul r1.w, r1.x, cb12[43].x  
  31:  mul r1.zw, r1.zzzw, l(0.000000, 0.000000, 0.062500, 0.062500)  
  32:  dp3 r0.y, cb12[38].xyzx, r0.yzwy  
  33:  add r0.z, r0.y, cb12[42].x  
  34:  add r0.w, cb12[42].x, l(1.000000)  
  35:  div_sat r0.z, r0.z, r0.w  
  36:  add r0.w, -cb12[43].z, cb12[43].y  
  37:  mad r0.z, r0.z, r0.w, cb12[43].z  
  38:  mul r0.w, abs(r0.y), abs(r0.y)  
  39:  mad_sat r2.w, r1.x, l(0.002000), l(-0.300000)  
  40:  mul r0.w, r0.w, r2.w  
  41:  lt r0.y, l(0), r0.y  
  42:  movc r3.xyz, r0.yyyy, cb12[39].xyzx, cb12[41].xyzx  
  43:  add r3.xyz, r3.xyzx, -cb12[40].xyzx  
  44:  mad r3.xyz, r0.wwww, r3.xyzx, cb12[40].xyzx  
  45:  movc r4.xyz, r0.yyyy, cb12[45].xyzx, cb12[47].xyzx  
  46:  add r4.xyz, r4.xyzx, -cb12[46].xyzx  
  47:  mad r4.xyz, r0.wwww, r4.xyzx, cb12[46].xyzx  
  48:  ge r0.y, r1.x, cb12[48].y  
  49:  if_nz r0.y  
  50:   add r0.y, r1.y, cb12[42].y  
  51:   mul r0.w, r0.z, r0.y  
  52:   mul r1.y, r0.z, r1.z  
  53:   mad r5.xyzw, r1.yyyy, l(16.000000, 15.000000, 14.000000, 13.000000), r0.wwww  
  54:   max r5.xyzw, r5.xyzw, l(0, 0, 0, 0)  
  55:   add r5.xyzw, r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  56:   div_sat r5.xyzw, r1.wwww, r5.xyzw  
  57:   add r5.xyzw, -r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  58:   mul r1.z, r5.y, r5.x  
  59:   mul r1.z, r5.z, r1.z  
  60:   mul r1.z, r5.w, r1.z  
  61:   mad r5.xyzw, r1.yyyy, l(12.000000, 11.000000, 10.000000, 9.000000), r0.wwww  
  62:   max r5.xyzw, r5.xyzw, l(0, 0, 0, 0)  
  63:   add r5.xyzw, r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  64:   div_sat r5.xyzw, r1.wwww, r5.xyzw  
  65:   add r5.xyzw, -r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  66:   mul r1.z, r1.z, r5.x  
  67:   mul r1.z, r5.y, r1.z  
  68:   mul r1.z, r5.z, r1.z  
  69:   mul r1.z, r5.w, r1.z  
  70:   mad r5.xyzw, r1.yyyy, l(8.000000, 7.000000, 6.000000, 5.000000), r0.wwww  
  71:   max r5.xyzw, r5.xyzw, l(0, 0, 0, 0)  
  72:   add r5.xyzw, r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  73:   div_sat r5.xyzw, r1.wwww, r5.xyzw  
  74:   add r5.xyzw, -r5.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  75:   mul r1.z, r1.z, r5.x  
  76:   mul r1.z, r5.y, r1.z  
  77:   mul r1.z, r5.z, r1.z  
  78:   mul r1.z, r5.w, r1.z  
  79:   mad r5.xy, r1.yyyy, l(4.000000, 3.000000, 0.000000, 0.000000), r0.wwww  
  80:   max r5.xy, r5.xyxx, l(0, 0, 0, 0)  
  81:   add r5.xy, r5.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)  
  82:   div_sat r5.xy, r1.wwww, r5.xyxx  
  83:   add r5.xy, -r5.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)  
  84:   mul r1.z, r1.z, r5.x  
  85:   mul r1.z, r5.y, r1.z  
  86:   mad r0.w, r1.y, l(2.000000), r0.w  
  87:   max r0.w, r0.w, l(0)  
  88:   add r0.w, r0.w, l(1.000000)  
  89:   div_sat r0.w, r1.w, r0.w  
  90:   add r0.w, -r0.w, l(1.000000)  
  91:   mul r0.w, r0.w, r1.z  
  92:   mad r0.y, r0.y, r0.z, r1.y  
  93:   max r0.y, r0.y, l(0)  
  94:   add r0.y, r0.y, l(1.000000)  
  95:   div_sat r0.y, r1.w, r0.y  
  96:   add r0.y, -r0.y, l(1.000000)  
  97:   mad r0.y, -r0.w, r0.y, l(1.000000)  
  98:   add r0.z, r1.x, -cb12[48].y  
  99:   mul_sat r0.z, r0.z, cb12[48].z  
  100:  else  
  101:   mov r0.yz, l(0.000000, 1.000000, 0.000000, 0.000000)  
  102:  endif  
  103:  log r0.y, r0.y  
  104:  mul r0.w, r0.y, cb12[42].w  
  105:  exp r0.w, r0.w  
  106:  mul r0.y, r0.y, cb12[48].x  
  107:  exp r0.y, r0.y  
  108:  mul r0.yw, r0.yyyw, r0.zzzz  
  109:  mad_sat r1.xy, r0.wwww, cb12[189].xzxx, cb12[189].ywyy  
  110:  add r5.xyz, -r3.xyzx, cb12[188].xyzx  
  111:  mad r5.xyz, r1.xxxx, r5.xyzx, r3.xyzx  
  112:  add r0.z, cb12[188].w, l(-1.000000)  
  113:  mad r0.z, r1.y, r0.z, l(1.000000)  
  114:  mul_sat r5.w, r0.z, r0.w  
  115:  lt r0.z, l(0), cb12[192].x  
  116:  if_nz r0.z  
  117:   mad_sat r1.xy, r0.wwww, cb12[191].xzxx, cb12[191].ywyy  
  118:   add r6.xyz, -r3.xyzx, cb12[190].xyzx  
  119:   mad r3.xyz, r1.xxxx, r6.xyzx, r3.xyzx  
  120:   add r0.z, cb12[190].w, l(-1.000000)  
  121:   mad r0.z, r1.y, r0.z, l(1.000000)  
  122:   mul_sat r3.w, r0.z, r0.w  
  123:   add r1.xyzw, -r5.xyzw, r3.xyzw  
  124:   mad r5.xyzw, cb12[192].xxxx, r1.xyzw, r5.xyzw  
  125:  endif  
  126:  mul r0.z, r0.x, r5.w  
  127:  mul r0.x, r0.x, r0.y  
  128:  dp3 r0.y, l(0.333000, 0.555000, 0.222000, 0.000000), r2.xyzx  
  129:  mad r1.xyz, r0.yyyy, r4.xyzx, -r2.xyzx  
  130:  mad r0.xyw, r0.xxxx, r1.xyxz, r2.xyxz  
  131:  add r1.xyz, -r0.xywx, r5.xyzx  
  132:  mad r0.xyz, r0.zzzz, r1.xyzx, r0.xywx  
  133: else  
  134:  mov r0.xyz, l(0, 0, 0, 0)  
  135: endif  
  136: mov o0.xyz, r0.xyzx  
  137: mov o0.w, l(1.000000)  
  138: ret 

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рд╢реЗрдбрд░ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИред рд╢рд╛рдпрдж рдПрдХ рдкреНрд░рднрд╛рд╡реА рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдХреЛрд╣рд░реЗ рдХреЗ рд╕рд╛рде рд╕реВрд░реНрдпрд╛рд╕реНрдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


рдЖрдЗрдП рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рдЬреИрд╕рд╛ рдХрд┐ рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧрд╣рд░рд╛рдИ рдмрдлрд░, рдПрдореНрдмрд┐рдПрдВрдЯ рд╕рдорд╛рд╡реЗрд╢, рдФрд░ рдПрдХ рдПрдЪрдбреАрдЖрд░ рд░рдВрдЧ рдмрдлрд░ рд╣реИред


рднреАрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдмрдлрд░


рдЖрд╡рдХ рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛


рдЖрдиреЗ рд╡рд╛рд▓реЗ рдПрдЪрдбреАрдЖрд░ рд░рдВрдЧ рдмрдлрд░

... рдФрд░ рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ рдХреЛрд╣рд░реЗ рдХреА рдЫрд╛рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдХреЛрд╣рд░реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдЪрдбреАрдЖрд░ рдмрдирд╛рд╡рдЯред

рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ Witcher 3 рд╢реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреИрдЯрд░реНрди рд╣реИред

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

рдпрджрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд╢ рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ рдПрдХ рд╢реЗрдбрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд╢ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ (рдЧрд╣рд░рд╛рдИ == 1.0), рддреЛ рд╢реЗрдб рдХрд╛рд▓рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рджреГрд╢реНрдп рдореЗрдВ рд╣реИ (рдЧрд╣рд░рд╛рдИ <1.0), рддреЛ рд╣рдо рдЧрд╣рд░рд╛рдИ рдмрдлрд░ (рд▓рд╛рдЗрдиреЛрдВ 7-11) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрд╣рд░реЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

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

рдкрд╣рд▓реА рдмрд╛рдд рдЖрдкрдХреЛ "рдж рд╡рд┐рдЪрд░ 3" рдореЗрдВ рдХреЛрд╣рд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛: рдЗрд╕рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ - "рдХреЛрд╣рд░реЗ рдХрд╛ рд░рдВрдЧ" рдФрд░ "рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рд░рдВрдЧ"ред

 struct FogResult  
 {  
    float4 paramsFog;     // RGB: color, A: influence  
    float4 paramsAerial;  // RGB: color, A: influence  
 };

рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рддреАрди рд░рдВрдЧ рд╣реИрдВ: рд╕рд╛рдордиреЗ, рдордзреНрдп рдФрд░ рдкреАрдЫреЗред рдЕрд░реНрдерд╛рддреН, рдирд┐рд░рдВрддрд░ рдмрдлрд░ рдореЗрдВ "FogColorFront", "FogColorMiddle", "AerialColorBack", рдЖрджрд┐ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рд╣реИрдВ ... рдЖрдЗрдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рджреЗрдЦреЗрдВ:


   // *** Inputs *** //  
   float3 FogSunDir = cb12_v38.xyz;  
   float3 FogColorFront = cb12_v39.xyz;  
   float3 FogColorMiddle = cb12_v40.xyz;  
   float3 FogColorBack = cb12_v41.xyz;  
     
   float4 FogBaseParams = cb12_v42;  
   float4 FogDensityParamsScene = cb12_v43;  
   float4 FogDensityParamsSky = cb12_v44;  
     
   float3 AerialColorFront = cb12_v45.xyz;  
   float3 AerialColorMiddle = cb12_v46.xyz;  
   float3 AerialColorBack = cb12_v47.xyz;  
   float4 AerialParams = cb12_v48;

рдЕрдВрддрд┐рдо рд░рдВрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╡реИрдХреНрдЯрд░ рдФрд░ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Shader рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реНрдерд┐рддрд┐, рдХреИрдорд░рд╛ рд╕реНрдерд┐рддрд┐ (cb12 [0] .xyz) рдФрд░ рдХреЛрд╣рд░реЗ / рдкреНрд░рдХрд╛рд╢ рджрд┐рд╢рд╛ (cb12 [38] .xyz) рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдХреЛрд╣рд░реЗ рдХреЗ рд░реВрдк рдФрд░ рджрд┐рд╢рд╛ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

   float3 frag_vec = fragPosWorldSpace.xyz - customCameraPos.xyz;  
   float frag_dist = length(frag_vec);  
     
   float3 frag_dir = frag_vec / frag_dist;  
   
   float dot_fragDirSunDir = dot(GlobalLightDirection.xyz, frag_dir);

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

   float3 curr_col_fog;  
   float3 curr_col_aerial;  
   {  
     float _dot = dot_fragDirSunDir;  
   
     float _dd = _dot;  
     {  
       const float _distOffset = -150;  
       const float _distRange = 500;  
       const float _mul = 1.0 / _distRange;  
       const float _bias = _distOffset * _mul;  
   
       _dd = abs(_dd);  
       _dd *= _dd;  
       _dd *= saturate( frag_dist * _mul + _bias );  
     }  
   
     curr_col_fog = lerp( FogColorMiddle.xyz, (_dot>0.0f ? FogColorFront.xyz : FogColorBack.xyz), _dd );  
     curr_col_aerial = lerp( AerialColorMiddle.xyz, (_dot>0.0f ? AerialColorFront.xyz : AerialColorBack.xyz), _dd );  
   }

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

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдореА рдЕрдВрддрд┐рдо рдврд╛рд▓ (_dd) рдХрд╛ рдПрдХ рджреГрд╢реНрдп рд╣реИред


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

рдПрдХ рд╡реЗрдХреНрдЯрд░ [рдХреИрдорд░рд╛ ---> рджреБрдирд┐рдпрд╛] рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ 16 рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдПрдХ рдкреНрд░рд╛рд░реВрдкрдг рдЪрд░рдг рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдиреАрдЪреЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЧрдгрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ .z (рдКрдВрдЪрд╛рдИ) рдШрдЯрдХ ( cur_pos_z_step ) рд╢рд╛рдорд┐рд▓ рд╣реИ ред

рдХреЛрд╣рд░реЗ raymarching рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ, рдпрд╣рд╛рдБ ред

   float fog_amount = 1;  
   float fog_amount_scale = 0;  
   [branch]  
   if ( frag_dist >= AerialParams.y )  
   {  
     float curr_pos_z_base = (customCameraPos.z + FogBaseParams.y) * density_factor;  
     float curr_pos_z_step = frag_step.z * density_factor;  
   
     [unroll]  
     for ( int i=16; i>0; --i )  
     {  
       fog_amount *= 1 - saturate( density_sample_scale / (1 + max( 0.0, curr_pos_z_base + (i) * curr_pos_z_step ) ) );  
     }  
   
     fog_amount = 1 - fog_amount;  
     fog_amount_scale = saturate( (frag_dist - AerialParams.y) * AerialParams.z );  
   }  
   
   FogResult ret;  
   
   ret.paramsFog = float4 ( curr_col_fog, fog_amount_scale * pow( abs(fog_amount), final_exp_fog ) );  
   ret.paramsAerial = float4 ( curr_col_aerial, fog_amount_scale * pow( abs(fog_amount), final_exp_aerial ) );

рдХреЛрд╣рд░реЗ рдХреА рдорд╛рддреНрд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдКрдВрдЪрд╛рдИ (рдШрдЯрдХреЛрдВ .z) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЕрдВрдд рдореЗрдВ рдХреЛрд╣рд░реЗ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛрд╣рд░реЗ / рд╡рд╛рдпреБрдордВрдбрд▓ рдХреА рдбрд┐рдЧреНрд░реА рддрдХ рдмрдврд╝рд╛ рджреА рдЬрд╛рддреА рд╣реИред

final_exp_fog рдФрд░ final_exp_aerial рдХреЛ рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рд╡реЗ рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд╣рд░реЗ рдФрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░рдВрдЧ рджреБрдирд┐рдпрд╛ рдХреЛ рдмрдврд╝рддреА рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдХреЛрд╣рд░рд╛ рдЫрд╛ рдЧрдпрд╛


рдореБрдЭреЗ рдЬреЛ рдЫрд╛рдпрд╛рджрд╛рд░ рдорд┐рд▓рд╛, рдЙрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛрдб рдирд╣реАрдВ рдерд╛:

  109:  mad_sat r1.xy, r0.wwww, cb12[189].xzxx, cb12[189].ywyy  
  110:  add r5.xyz, -r3.xyzx, cb12[188].xyzx  
  111:  mad r5.xyz, r1.xxxx, r5.xyzx, r3.xyzx  
  112:  add r0.z, l(-1.000000), cb12[188].w  
  113:  mad r0.z, r1.y, r0.z, l(1.000000)  
  114:  mul_sat r5.w, r0.w, r0.z  
  115:  lt r0.z, l(0.000000), cb12[192].x  
  116:  if_nz r0.z  
  117:   mad_sat r1.xy, r0.wwww, cb12[191].xzxx, cb12[191].ywyy  
  118:   add r6.xyz, -r3.xyzx, cb12[190].xyzx  
  119:   mad r3.xyz, r1.xxxx, r6.xyzx, r3.xyzx  
  120:   add r0.z, l(-1.000000), cb12[190].w  
  121:   mad r0.z, r1.y, r0.z, l(1.000000)  
  122:   mul_sat r3.w, r0.w, r0.z  
  123:   add r1.xyzw, -r5.xyzw, r3.xyzw  
  124:   mad r5.xyzw, cb12[192].xxxx, r1.xyzw, r5.xyzw  
  125:  endif

рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдЙрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд░рдВрдЧ рдФрд░ рдХреЛрд╣рд░реЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ

рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ : рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп, рдХреЗрд╡рд▓ рдПрдХ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (cb12_v192.x 0.0), рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорд╛рди ~ 0.22 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреВрд╕рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред


 #ifdef OVERRIDE_FOG  
     
   // Override  
   float fog_influence = ret.paramsFog.w; // r0.w  
   
   float override1ColorScale = cb12_v189.x;  
   float override1ColorBias = cb12_v189.y;  
   float3 override1Color = cb12_v188.rgb;  
     
   float override1InfluenceScale = cb12_v189.z;  
   float override1InfluenceBias = cb12_v189.w;  
   float override1Influence = cb12_v188.w;  
     
   float override1ColorAmount = saturate(fog_influence * override1ColorScale + override1ColorBias);  
   float override1InfluenceAmount = saturate(fog_influence * override1InfluenceScale + override1InfluenceBias);    
     

   float4 paramsFogOverride;  
   paramsFogOverride.rgb = lerp(curr_col_fog, override1Color, override1ColorAmount ); // ***r5.xyz   
     
   float param1 = lerp(1.0, override1Influence, override1InfluenceAmount); // r0.x  
   paramsFogOverride.w = saturate(param1 * fog_influence ); // ** r5.w  
   
     
   const float extraFogOverride = cb12_v192.x;  
     
   [branch]   
   if (extraFogOverride > 0.0)  
   {  
     float override2ColorScale = cb12_v191.x;  
     float override2ColorBias = cb12_v191.y;  
     float3 override2Color = cb12_v190.rgb;  
     
     float override2InfluenceScale = cb12_v191.z;  
     float override2InfluenceBias = cb12_v191.w;  
     float override2Influence = cb12_v190.w;  
       
     float override2ColorAmount = saturate(fog_influence * override2ColorScale + override2ColorBias);  
     float override2InfluenceAmount = saturate(fog_influence * override2InfluenceScale + override2InfluenceBias);  
      

     float4 paramsFogOverride2;  
     paramsFogOverride2.rgb = lerp(curr_col_fog, override2Color, override2ColorAmount); // r3.xyz   
           
     float ov_param1 = lerp(1.0, override2Influence, override2InfluenceAmount); // r0.z  
     paramsFogOverride2.w = saturate(ov_param1 * fog_influence); // r3.w  
   
     paramsFogOverride = lerp(paramsFogOverride, paramsFogOverride2, extraFogOverride);  
   
   }  
   ret.paramsFog = paramsFogOverride;  
     
 #endif

рдпрд╣рд╛рдБ рдПрдХ рд░реЗрдбрд┐рдлрд┐рдирд┐рд╢рди (рджреВрд╕рд░реА рдЫрд╡рд┐) рдФрд░ рдбрдмрд▓ рд░рд┐рдбрд┐рдлрд╛рдЗрдирдореЗрдВрдЯ (рддреАрд╕рд░реА рдЫрд╡рд┐, рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо) рдХреЗ рд╕рд╛рде рдХреЛрд╣рд░реЗ (рдкрд╣рд▓реА рдЫрд╡рд┐) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдорд╛рд░реА рддреИрдпрд╛рд░ рдХреАрдордд рд╣реИ:




рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛ рдХрд╛ рд╡рд┐рдирд┐рдпрдорди


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


  13:  ld_indexable(texture2d)(float,float,float,float) r0.x, r0.xyzw, t2.xyzw  
  14:  max r0.x, r0.x, cb3[1].x  
  15:  add r0.yzw, r1.xxyz, -cb12[0].xxyz  
  16:  dp3 r1.x, r0.yzwy, r0.yzwy  
  17:  sqrt r1.x, r1.x  
  18:  add r1.y, r1.x, -cb3[0].x  
  19:  add r1.zw, -cb3[0].xxxz, cb3[0].yyyw  
  20:  div_sat r1.y, r1.y, r1.z  
  21:  mad r1.y, r1.y, r1.w, cb3[0].z  
  22:  add r0.x, r0.x, l(-1.000000)  
  23:  mad r0.x, r1.y, r0.x, l(1.000000)

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


рд╣рдо рдмрдирд╛рд╡рдЯ рд╕реЗ рдПрдУ рдХреЛ рд▓реЛрдб рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЕрдзрд┐рдХрддрдо рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ, cb3_v1.x рдмрд╣реБрдд рдЕрдзрд┐рдХ (0.96888) рд╣реИ, рдЬреЛ AO рдХреЛ рдмрд╣реБрдд рдХрдордЬреЛрд░ рдмрдирд╛рддрд╛ рд╣реИред

рдХреЛрдб рдХрд╛ рдЕрдЧрд▓рд╛ рднрд╛рдЧ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХреИрдорд░реЗ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреЛрдб рдХрднреА-рдХрднреА рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдХреЛ рджреЗрдЦреЗрдВ, рдЬреЛ рдЗрд╕ рд╕реЗрдЯрдЕрдк рдХреЗ рдереЛрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

 float AdjustAmbientOcclusion(in float inputAO, in float worldToCameraDistance)  
 {  
   // *** Inputs *** //  
   const float aoDistanceStart = cb3_v0.x;  
   const float aoDistanceEnd = cb3_v0.y;  
   const float aoStrengthStart = cb3_v0.z;  
   const float aoStrengthEnd = cb3_v0.w;  
      
   // * Adjust AO  
   float aoDistanceIntensity = linstep( aoDistanceStart, aoDistanceEnd, worldToCameraDistance );  
   float aoStrength = lerp(aoStrengthStart, aoStrengthEnd, aoDistanceIntensity);   
   float adjustedAO = lerp(1.0, inputAO, aoStrength);  
     
   return adjustedAO;   
 }

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

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

рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг: рдкрд┐рдХреНрд╕реЗрд▓ рджреВрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд░реА 500 рд╣реИред

рд▓рд┐рдирд╕реНрдЯреЗрдк 1.0 рд░рд┐рдЯрд░реНрди;
anoStrength рдмрд░рд╛рдмрд░ aoStrengthEnd рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ;

рдпрд╣ рдПрдУ рд░рд┐рдЯрд░реНрди рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдХрд╛ рд▓рдЧрднрдЧ 77% (рдЕрдВрддрд┐рдо рдмрд▓) рд╣реИред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реА AO рдХреЛ рдкрд╣рд▓реЗ рдЕрдзрд┐рдХрддрдо рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдзреАрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдбрд╛рд▓реЗрдВ


рдХреЛрд╣рд░реЗ рдХреЗ рд░рдВрдЧ рдФрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рдФрд░ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдУ рдХреЗ рд╕рд╛рде рдкреНрд░рднрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

   ...
   FogResult fog = CalculateFog( worldPos, CameraPosition, fogStart, ao, false );  
      
   // Apply AO to influence  
   fog.paramsFog.w *= ao;  
   fog.paramsAerial.w *= ao; 
      
   // Mix fog with scene color  
   outColor = ApplyFog(fog, colorHDR);

рд╕рднреА рдЬрд╛рджреВ ApplyFog рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ :

 float3 ApplyFog(FogResult fog, float3 color)  
 {  
   const float3 LuminanceFactors = float3(0.333f, 0.555f, 0.222f);  
   
   float3 aerialColor = dot(LuminanceFactors, color) * fog.paramsAerial.xyz;  
   color = lerp(color, aerialColor, fog.paramsAerial.w);  
   color = lerp(color, fog.paramsFog.xyz, fog.paramsFog.w);  
    
   return color.xyz;  
 }

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:


рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рд╡рд╛рдпреБрдордВрдбрд▓ рдХреЗ рд░рдВрдЧ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:


рдлрд┐рд░ рд╣рдо рдПрдЪрдбреАрдЖрд░ рд░рдВрдЧ рдХреЛ рд╡рд╛рдпреБрдордВрдбрд▓ рдХреЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЛрд╣рд░реЗ рдХреЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИ:


рдмрд╕ рдЗрддрдирд╛ рд╣реА!

рдХреБрдЫ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ



рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рдкреНрд░рднрд╛рд╡


рд╡рд╛рдпреБрдордВрдбрд▓ рдХрд╛ рд░рдВрдЧ


рдХреЛрд╣рд░реЗ рдХрд╛ рдЕрд╕рд░


рдХреЛрд╣рд░реЗ рдХрд╛ рд░рдВрдЧ


рдХреЛрд╣рд░реЗ рдХреЗ рдмрд┐рдирд╛ рджреГрд╢реНрдп рд╕рдорд╛рдкреНрдд


рдХреЛрд╣рд░реЗ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рджреГрд╢реНрдп


рд╕рдорд╛рдкреНрдд рджреГрд╢реНрдп рд╕рд┐рд░реНрдл рдореБрдЦреНрдп рдХреЛрд╣рд░рд╛ рд╣реИ


рддреБрд▓рдирд╛ рдХреА рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрд╣рд░реЗ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рджреГрд╢реНрдп

рд╕рдВрдкреВрд░реНрдг


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдмрд╣реБрдд рдХреБрдЫ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╢реИрдбрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдпрд╣рд╛рдВ рд╣реИ ред

рдореИрдВ рдЦреБрд╢реА рдХреЗ рд╕рд╛рде рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╢реЗрдбрд░ рдмрд┐рд▓реНрдХреБрд▓ рдореВрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ - рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢ рдХрд░рддрд╛ рд╣реИред

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

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

рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ - рдЗрд╕ shader рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд / рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рднреА рдкрд╛рд╡рддреА рд╕реАрдбреА PROJEKT RED рдХреЛ рднреЗрдЬреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ, рд╡реЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рднрд╛рдЧ 3. рд╢реВрдЯрд┐рдВрдЧ рд╕рд┐рддрд╛рд░реЗ


"рдж рд╡рд┐рдЪрд░ 3" рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╡рд┐рд╡рд░рдг рд╣реИ - рд╢реВрдЯрд┐рдВрдЧ рд╕рд┐рддрд╛рд░реЗред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╡реЗ рд░рдХреНрдд рдФрд░ рд╢рд░рд╛рдм рдбреАрдПрд▓рд╕реА рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВред

рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ:


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкрд╛рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

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

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

1. рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрди


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЖрдХрд╛рд╢, рдЖрдХрд╛рд╢ рдФрд░ рдЪрдВрджреНрд░рдорд╛ рдХреЗ рдЧреБрдВрдмрдж рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╢реВрдЯрд┐рдВрдЧ рд╕рд┐рддрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕рдХреНрд░рд┐рдп рдорд╛рд░реНрдЧ рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ:



DrawIndexed (720) - рдЖрдХрд╛рд╢ рдХреЗ рдЧреБрдВрдмрдж,
DrawIndexed (2160) - рдЖрдХрд╛рд╢ / рдЪрдВрджреНрд░рдорд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░,
DrawIndexed (36) - рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд╕реВрд░рдЬ рдХреА рд░реЛрдбрд╝рд╛ рдХреА рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЦрд╛рдд рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (?)
DrawIndexed (12) - рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░
DrawIndexedInstanced (1116, 1) - рд╕рд┐рд░рд╕ рдмрд╛рджрд▓

рдХреА рддрд░рд╣ рд╕рд┐рд░рд╕ рдмрд╛рджрд▓ , рдкреНрд░рддреНрдпреЗрдХ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдмрд╛рд░ рд▓реА рдЧрдИ рд╣реИред


рдкрд╣рд▓реЗ рдбреНрд░реЙ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ


рдкрд╣рд▓реЗ рдбреНрд░реЙ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо




рдЗрд╕ рдЧреЗрдо рдХреЗ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдкрд╛рд╕ рдХреЗ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреВрд╕рд░реЗ рдбреНрд░реЙ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрди рдорд┐рдХреНрд╕рд┐рдВрдЧ рд╕реНрдЯреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


2. рдЬреНрдпрд╛рдорд┐рддрд┐


рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХреЛ рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдкрддрд▓реА рдЪрддреБрд░реНрднреБрдЬ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: 4 рдХреЛрдиреЗ, 6 рд╕реВрдЪрдХред рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреНрд╡рд╛рдб рд╕рдВрднрд╡ рд╣реИред


рдПрдХ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдХреНрд╡рд╛рдбред


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

рдПрдХ рдорд┐рдирдЯ рд░реБрдХреЛ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рд╣реИ DrawIndexed (12) ! рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рд╢реВрдЯрд┐рдВрдЧ рд╕рд┐рддрд╛рд░реЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ?

рд╣рд╛рдБред


рдЗрд╕ рдлреНрд░реЗрдо рдореЗрдВ, рд╢реВрдЯрд┐рдВрдЧ рд╕рд┐рддрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреГрд╢реНрдпрддрд╛ рдХреЗ рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдмрд╛рд╣рд░ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХреЛрдбрд░ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖ shader:

 vs_5_0  
    dcl_globalFlags refactoringAllowed  
    dcl_constantbuffer cb1[9], immediateIndexed  
    dcl_constantbuffer cb2[3], immediateIndexed  
    dcl_constantbuffer cb12[193], immediateIndexed  
    dcl_input v0.xyz  
    dcl_input v1.xyzw  
    dcl_input v2.xy  
    dcl_input v3.xy  
    dcl_input v4.xy  
    dcl_input v5.xyz  
    dcl_input v6.x  
    dcl_input v7.x  
    dcl_output o0.xyzw  
    dcl_output o1.xyzw  
    dcl_output o2.xy  
    dcl_output o3.xyzw  
    dcl_output_siv o4.xyzw, position  
    dcl_temps 5  
   0: mov r0.xyz, v0.xyzx  
   1: mov r0.w, l(1.000000)  
   2: dp4 r1.x, r0.xyzw, cb2[0].xyzw  
   3: dp4 r1.y, r0.xyzw, cb2[1].xyzw  
   4: dp4 r1.z, r0.xyzw, cb2[2].xyzw  
   5: add r0.x, v2.x, v2.y  
   6: add r0.y, -v2.y, v2.x  
   7: add r2.xyz, -r1.zxyz, cb1[8].zxyz  
   8: dp3 r0.z, r2.xyzx, r2.xyzx  
   9: rsq r0.z, r0.z  
  10: mul r2.xyz, r0.zzzz, r2.xyzx  
  11: dp3 r0.z, v5.xyzx, v5.xyzx  
  12: rsq r0.z, r0.z  
  13: mul r3.xyz, r0.zzzz, v5.xyzx  
  14: mul r4.xyz, r2.xyzx, r3.yzxy  
  15: mad r2.xyz, r2.zxyz, r3.zxyz, -r4.xyzx  
  16: dp3 r0.z, r2.xyzx, r2.xyzx  
  17: rsq r0.z, r0.z  
  18: mul r2.xyz, r0.zzzz, r2.xyzx  
  19: mad r0.z, v7.x, v6.x, l(1.000000)  
  20: mul r3.xyz, r0.zzzz, r3.xyzx  
  21: mul r3.xyz, r3.xyzx, v3.xxxx  
  22: mul r2.xyz, r2.xyzx, v3.yyyy  
  23: mad r0.xzw, r3.xxyz, r0.xxxx, r1.xxyz  
  24: mad r0.xyz, r2.xyzx, r0.yyyy, r0.xzwx  
  25: mov r0.w, l(1.000000)  
  26: dp4 o4.x, r0.xyzw, cb1[0].xyzw  
  27: dp4 o4.y, r0.xyzw, cb1[1].xyzw  
  28: dp4 o4.z, r0.xyzw, cb1[2].xyzw  
  29: dp4 o4.w, r0.xyzw, cb1[3].xyzw  
  30: add r0.xyz, r0.xyzx, -cb12[0].xyzx  
  31: dp3 r0.w, r0.xyzx, r0.xyzx  
  32: sqrt r0.w, r0.w  
  33: div r0.xyz, r0.xyzx, r0.wwww  
  34: add r0.w, r0.w, -cb12[22].z  
  35: max r0.w, r0.w, l(0)  
  36: min r0.w, r0.w, cb12[42].z  
  37: dp3 r0.x, cb12[38].xyzx, r0.xyzx  
  38: mul r0.y, abs(r0.x), abs(r0.x)  
  39: mad_sat r1.x, r0.w, l(0.002000), l(-0.300000)  
  40: mul r0.y, r0.y, r1.x  
  41: lt r1.x, l(0), r0.x  
  42: movc r1.yzw, r1.xxxx, cb12[39].xxyz, cb12[41].xxyz  
  43: add r1.yzw, r1.yyzw, -cb12[40].xxyz  
  44: mad r1.yzw, r0.yyyy, r1.yyzw, cb12[40].xxyz  
  45: movc r2.xyz, r1.xxxx, cb12[45].xyzx, cb12[47].xyzx  
  46: add r2.xyz, r2.xyzx, -cb12[46].xyzx  
  47: mad o0.xyz, r0.yyyy, r2.xyzx, cb12[46].xyzx  
  48: ge r0.y, r0.w, cb12[48].y  
  49: if_nz r0.y  
  50:  mad r0.y, r0.z, cb12[22].z, cb12[0].z  
  51:  mul r0.z, r0.w, r0.z  
  52:  mul r0.z, r0.z, l(0.062500)  
  53:  mul r1.x, r0.w, cb12[43].x  
  54:  mul r1.x, r1.x, l(0.062500)  
  55:  add r0.x, r0.x, cb12[42].x  
  56:  add r2.x, cb12[42].x, l(1.000000)  
  57:  div_sat r0.x, r0.x, r2.x  
  58:  add r2.x, -cb12[43].z, cb12[43].y  
  59:  mad r0.x, r0.x, r2.x, cb12[43].z  
  60:  add r0.y, r0.y, cb12[42].y  
  61:  mul r2.x, r0.x, r0.y  
  62:  mul r0.z, r0.x, r0.z  
  63:  mad r3.xyzw, r0.zzzz, l(16.000000, 15.000000, 14.000000, 13.000000), r2.xxxx  
  64:  max r3.xyzw, r3.xyzw, l(0, 0, 0, 0)  
  65:  add r3.xyzw, r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  66:  div_sat r3.xyzw, r1.xxxx, r3.xyzw  
  67:  add r3.xyzw, -r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  68:  mul r2.y, r3.y, r3.x  
  69:  mul r2.y, r3.z, r2.y  
  70:  mul r2.y, r3.w, r2.y  
  71:  mad r3.xyzw, r0.zzzz, l(12.000000, 11.000000, 10.000000, 9.000000), r2.xxxx  
  72:  max r3.xyzw, r3.xyzw, l(0, 0, 0, 0)  
  73:  add r3.xyzw, r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  74:  div_sat r3.xyzw, r1.xxxx, r3.xyzw  
  75:  add r3.xyzw, -r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  76:  mul r2.y, r2.y, r3.x  
  77:  mul r2.y, r3.y, r2.y  
  78:  mul r2.y, r3.z, r2.y  
  79:  mul r2.y, r3.w, r2.y  
  80:  mad r3.xyzw, r0.zzzz, l(8.000000, 7.000000, 6.000000, 5.000000), r2.xxxx  
  81:  max r3.xyzw, r3.xyzw, l(0, 0, 0, 0)  
  82:  add r3.xyzw, r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  83:  div_sat r3.xyzw, r1.xxxx, r3.xyzw  
  84:  add r3.xyzw, -r3.xyzw, l(1.000000, 1.000000, 1.000000, 1.000000)  
  85:  mul r2.y, r2.y, r3.x  
  86:  mul r2.y, r3.y, r2.y  
  87:  mul r2.y, r3.z, r2.y  
  88:  mul r2.y, r3.w, r2.y  
  89:  mad r2.zw, r0.zzzz, l(0.000000, 0.000000, 4.000000, 3.000000), r2.xxxx  
  90:  max r2.zw, r2.zzzw, l(0, 0, 0, 0)  
  91:  add r2.zw, r2.zzzw, l(0.000000, 0.000000, 1.000000, 1.000000)  
  92:  div_sat r2.zw, r1.xxxx, r2.zzzw  
  93:  add r2.zw, -r2.zzzw, l(0.000000, 0.000000, 1.000000, 1.000000)  
  94:  mul r2.y, r2.z, r2.y  
  95:  mul r2.y, r2.w, r2.y  
  96:  mad r2.x, r0.z, l(2.000000), r2.x  
  97:  max r2.x, r2.x, l(0)  
  98:  add r2.x, r2.x, l(1.000000)  
  99:  div_sat r2.x, r1.x, r2.x  
  100:  add r2.x, -r2.x, l(1.000000)  
  101:  mul r2.x, r2.x, r2.y  
  102:  mad r0.x, r0.y, r0.x, r0.z  
  103:  max r0.x, r0.x, l(0)  
  104:  add r0.x, r0.x, l(1.000000)  
  105:  div_sat r0.x, r1.x, r0.x  
  106:  add r0.x, -r0.x, l(1.000000)  
  107:  mad r0.x, -r2.x, r0.x, l(1.000000)  
  108:  add r0.y, r0.w, -cb12[48].y  
  109:  mul_sat r0.y, r0.y, cb12[48].z  
  110: else  
  111:  mov r0.xy, l(1.000000, 0.000000, 0.000000, 0.000000)  
  112: endif  
  113: log r0.x, r0.x  
  114: mul r0.z, r0.x, cb12[42].w  
  115: exp r0.z, r0.z  
  116: mul r0.z, r0.z, r0.y  
  117: mul r0.x, r0.x, cb12[48].x  
  118: exp r0.x, r0.x  
  119: mul o0.w, r0.x, r0.y  
  120: mad_sat r0.xy, r0.zzzz, cb12[189].xzxx, cb12[189].ywyy  
  121: add r2.xyz, -r1.yzwy, cb12[188].xyzx  
  122: mad r2.xyz, r0.xxxx, r2.xyzx, r1.yzwy  
  123: add r0.x, cb12[188].w, l(-1.000000)  
  124: mad r0.x, r0.y, r0.x, l(1.000000)  
  125: mul_sat r2.w, r0.x, r0.z  
  126: lt r0.x, l(0), cb12[192].x  
  127: if_nz r0.x  
  128:  mad_sat r0.xy, r0.zzzz, cb12[191].xzxx, cb12[191].ywyy  
  129:  add r3.xyz, -r1.yzwy, cb12[190].xyzx  
  130:  mad r1.xyz, r0.xxxx, r3.xyzx, r1.yzwy  
  131:  add r0.x, cb12[190].w, l(-1.000000)  
  132:  mad r0.x, r0.y, r0.x, l(1.000000)  
  133:  mul_sat r1.w, r0.x, r0.z  
  134:  add r0.xyzw, -r2.xyzw, r1.xyzw  
  135:  mad o1.xyzw, cb12[192].xxxx, r0.xyzw, r2.xyzw  
  136: else  
  137:  mov o1.xyzw, r2.xyzw  
  138: endif  
  139: mov o3.xyzw, v1.xyzw  
  140: mov o2.xy, v4.yxyy  
  141: ret

рдпрд╣рд╛рдВ, рдХреЛрд╣рд░реЗ рдХреА рдЧрдгрдирд╛ рддреБрд░рдВрдд рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ (рд▓рд╛рдЗрдиреЗрдВ 30-138)ред рдХреЛрд╣рд░реЗ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рдЧрдгрдирд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдХреЛрд╣рд░реЗ рдХреА рдЗрддрдиреА рд╕рдЯреАрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЙрд▓реНрдХрд╛рдкрд┐рдВрдб рдЖрдорддреМрд░ рдкрд░ рдЧреЗрд░рд╛рд▓реНрдЯ рдХреЗ рд╕рд┐рд░ рдкрд░ рдЙрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд╖рд┐рддрд┐рдЬ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред

рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рдорд╛рдкрджрдВрдбреЛрдВ (рдЖрд░рдЬреАрдмреА = рд░рдВрдЧ, рдПрдХ = рдкреНрд░рднрд╛рд╡) рдХреЛ o0.xyzw рдореЗрдВ рдФрд░ рдХреЛрд╣рд░реЗ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ o1.xyzw рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

o2.xy (рд▓рд╛рдЗрди 140) рд╕рд┐рд░реНрдл рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ рд╣реИред
o3.xyzw (рд▓рд╛рдЗрди 139) рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

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

рдкрд╣рд▓рд╛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ:


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдХреНрд╡рд╛рдб-рдП: 8 рдХреЛрдиреЗ, 12 рд╕реВрдЪрдХ рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╣рд░ рдХреНрд╡рд╛рдб рдХреЗ рд▓рд┐рдП рдкреЛрдЬрд┐рд╢рди рд╕рдорд╛рди рдХреНрдпреЛрдВ рд╣реИ? рдХрд╛рдлреА рд╕рд░рд▓ - рдпрд╣ рдХреНрд╡рд╛рдб рдХреЗ рдХреЗрдВрджреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗрдВрджреНрд░ рд╕реЗ рдХреЗрдВрджреНрд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рддрдХ рдПрдХ рдСрдлрд╕реЗрдЯ рд╣реИ:


рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ (400, 3) рдЗрдХрд╛рдЗрдпреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред (XY рдкреНрд▓реЗрди рдореЗрдВ, Witcher 3 рдореЗрдВ, Z рдЕрдХреНрд╖ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдЕрдВрддрд┐рдо рддрддреНрд╡ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ, рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рдпреВрдирд┐рдЯ рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рд╣реИ рдЬреЛ рдПрдХ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:


рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рд╕реАрдкреАрдпреВ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред

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

   7: add r2.xyz, -r1.zxyz, cb1[8].zxyz  
   8: dp3 r0.z, r2.xyzx, r2.xyzx  
   9: rsq r0.z, r0.z  
  10: mul r2.xyz, r0.zzzz, r2.xyzx

рддрдм рд╣рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╡реЗрдХреНрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╡реЗрдХреНрдЯрд░ рд╕реАрдкреАрдпреВ рдХреА рддрд░рдл рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдирд┐рд░рд░реНрдердХ рд╣реИред

  11: dp3 r0.z, v5.xyzx, v5.xyzx  
  12: rsq r0.z, r0.z  
  13: mul r3.xyz, r0.zzzz, v5.xyzx

рдпрджрд┐ рджреЛ рд╡реИрдХреНрдЯрд░ рд╣реИрдВ, рддреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡реИрдХреНрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рджреНрд╡рд┐-рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╡реЗрдХреНрдЯрд░ рд▓рдВрдм рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  14: mul r4.xyz, r2.xyzx, r3.yzxy  
  15: mad r2.xyz, r2.zxyz, r3.zxyz, -r4.xyzx  
  16: dp3 r0.z, r2.xyzx, r2.xyzx  
  17: rsq r0.z, r0.z  
  18: mul r2.xyz, r0.zzzz, r2.xyzx

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реИрдХреНрдЯрд░ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ (r3.xyz) рдФрд░ рдмрд┐рдЯреЗрдВрдЧреЗрдВрдЯ (r2.xyz) рд╣реИрдВред

рдЖрдЗрдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ TEXCOORD1 рдХреЗ рдЕрдиреБрд░реВрдк Xsize рдФрд░ Ysize рдкреЗрд╢ рдХрд░реЗрдВ , рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (-200, 1.50)ред

рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:

  19: mad r0.z, v7.x, v6.x, l(1.000000)  
  20: mul r3.xyz, r0.zzzz, r3.xyzx  
  21: mul r3.xyz, r3.xyzx, v3.xxxx  
  22: mul r2.xyz, r2.xyzx, v3.yyyy  
  23: mad r0.xzw, r3.xxyz, r0.xxxx, r1.xxyz  
  24: mad r0.xyz, r2.xyzx, r0.yyyy, r0.xzwx  
  25: mov r0.w, l(1.000000) 

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ r0.x, r0.y рдФрд░ r0.z 1.0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рдЕрдВрддрд┐рдо рдЧрдгрдирд╛ рд╕рд░рд▓ рд╣реИ:

worldSpacePosition = quadCenter + tangent * Xsize + bitangent * Ysize

рдЕрдВрддрд┐рдо рднрд╛рдЧ SV_Position рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп-рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЧреБрдгрди рд╣реИ:

  26: dp4 o4.x, r0.xyzw, cb1[0].xyzw  
  27: dp4 o4.y, r0.xyzw, cb1[1].xyzw  
  28: dp4 o4.z, r0.xyzw, cb1[2].xyzw  
  29: dp4 o4.w, r0.xyzw, cb1[3].xyzw  

3. рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░


рдЬреИрд╕рд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрди рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореНрдорд┐рд╢реНрд░рдг рдЕрд╡рд╕реНрдерд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЬрд╣рд╛рдБ SrcColor рдФрд░ SrcAlpha рдХреНрд░рдорд╢рдГ рдкрд┐рдХреНрд╕реЗрд▓ shader рд╕реЗ .rgb рдФрд░ .a рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ , рдФрд░ DestColor .rgb рд░рдВрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░реЗрдВрдбрд░рд░реНрдЯ рдореЗрдВ рд╣реИред рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рд╕рдВрдХреЗрддрдХ SrcAlpha рд╣реИ ред рдХрдИ рдкреНрд░реЛрдПрдХреНрдЯрд┐рд╡ рдЧреЗрдо рд╢реЗрдбрд░реНрд╕ рдЗрд╕реЗ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ: рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯрд╛рд░ рд╢реЗрдбрд░ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдереЗред рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рдж, рд╣рдо рддреАрди рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ 1.0, 0.1 рдФрд░ 0.0 рд╣реИред

FinalColor = SrcColor * One + DestColor * (1.0 - SrcAlpha) =
FinalColor = SrcColor + DestColor * (1.0 - SrcAlpha)






return float4( color * opacity, opacity )



a) opacity = 1.0

FinalColor = color * opacity + DestColor * (1.0 - opacity) =
FinalColor = color = SrcColor



b) opacity = 0.1

FinalColor = color * opacity + DestColor * (1.0 - opacity) =
FinalColor = 0.1 * color + 0.9 * DestColor



c) opacity = 0.0

FinalColor = color * opacity + DestColor * (1.0 - opacity) =
FinalColor = DestColor



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

рдЬрдм рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рд╕рдордЭрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

 ps_5_0  
    dcl_globalFlags refactoringAllowed  
    dcl_constantbuffer cb0[10], immediateIndexed  
    dcl_constantbuffer cb2[3], immediateIndexed  
    dcl_constantbuffer cb4[2], immediateIndexed  
    dcl_input_ps linear v0.xyzw  
    dcl_input_ps linear v1.xyzw  
    dcl_input_ps linear v2.y  
    dcl_input_ps linear v3.w  
    dcl_output o0.xyzw  
    dcl_temps 4  
   0: mov_sat r0.x, v2.y  
   1: ge r0.y, r0.x, l(0.052579)  
   2: ge r0.z, l(0.965679), r0.x  
   3: and r0.y, r0.z, r0.y  
   4: if_nz r0.y  
   5:  ge r0.y, l(0.878136), r0.x  
   6:  add r0.z, r0.x, l(-0.052579)  
   7:  mul r1.w, r0.z, l(1.211303)  
   8:  mov_sat r0.z, r1.w  
   9:  mad r0.w, r0.z, l(-2.000000), l(3.000000)  
  10:  mul r0.z, r0.z, r0.z  
  11:  mul r0.z, r0.z, r0.w  
  12:  mul r2.x, r0.z, l(0.084642)  
  13:  mov r1.yz, l(0.000000, 0.000000, 0.084642, 0.000000)  
  14:  movc r2.yzw, r0.yyyy, r1.yyzw, l(0.000000, 0.000000, 0.000000, 0.500000)  
  15:  not r0.z, r0.y  
  16:  if_z r0.y  
  17:   ge r0.y, l(0.924339), r0.x  
  18:   add r0.w, r0.x, l(-0.878136)  
  19:   mul r1.w, r0.w, l(21.643608)  
  20:   mov_sat r0.w, r1.w  
  21:   mad r3.x, r0.w, l(-2.000000), l(3.000000)  
  22:   mul r0.w, r0.w, r0.w  
  23:   mul r0.w, r0.w, r3.x  
  24:   mad r1.x, r0.w, l(0.889658), l(0.084642)  
  25:   mov r1.yz, l(0.000000, 0.084642, 0.974300, 0.000000)  
  26:   movc r2.xyzw, r0.yyyy, r1.xyzw, r2.xyzw  
  27:  else  
  28:   mov r2.y, l(0)  
  29:   mov r0.y, l(-1)  
  30:  endif  
  31:  not r0.w, r0.y  
  32:  and r0.z, r0.w, r0.z  
  33:  if_nz r0.z  
  34:   ge r0.y, r0.x, l(0.924339)  
  35:   add r0.x, r0.x, l(-0.924339)  
  36:   mul r1.w, r0.x, l(24.189651)  
  37:   mov_sat r0.x, r1.w  
  38:   mad r0.z, r0.x, l(-2.000000), l(3.000000)  
  39:   mul r0.x, r0.x, r0.x  
  40:   mul r0.x, r0.x, r0.z  
  41:   mad r1.x, r0.x, l(-0.974300), l(0.974300)  
  42:   mov r1.yz, l(0.000000, 0.974300, 0.000000, 0.000000)  
  43:   movc r2.xyzw, r0.yyyy, r1.xyzw, r2.xyzw  
  44:  endif  
  45: else  
  46:  mov r2.yzw, l(0.000000, 0.000000, 0.000000, 0.500000)  
  47:  mov r0.y, l(0)  
  48: endif  
  49: mov_sat r2.w, r2.w  
  50: mad r0.x, r2.w, l(-2.000000), l(3.000000)  
  51: mul r0.z, r2.w, r2.w  
  52: mul r0.x, r0.z, r0.x  
  53: add r0.z, -r2.y, r2.z  
  54: mad r0.x, r0.x, r0.z, r2.y  
  55: movc r0.x, r0.y, r2.x, r0.x  
  56: mad r0.y, cb4[1].x, -cb0[9].w, l(1.000000)  
  57: mul_sat r0.y, r0.y, v3.w  
  58: mul r0.x, r0.y, r0.x  
  59: mul r0.yzw, cb2[2].xxyz, cb4[0].xxxx  
  60: mul r0.x, r0.x, cb2[2].w  
  61: dp3 r1.x, l(0.333000, 0.555000, 0.222000, 0.000000), r0.yzwy  
  62: mad r1.xyz, r1.xxxx, v0.xyzx, -r0.yzwy  
  63: mad r0.yzw, v0.wwww, r1.xxyz, r0.yyzw  
  64: add r1.xyz, -r0.yzwy, v1.xyzx  
  65: mad r0.yzw, v1.wwww, r1.xxyz, r0.yyzw  
  66: mul o0.xyz, r0.xxxx, r0.yzwy  
  67: mov o0.w, r0.x  
  68: ret

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╢реЗрдбрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рдерд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1.211303, 21.643608 рдФрд░ 24.189651 рдЬреИрд╕реЗ рд╕рднреА рдореВрд▓реНрдп рдХрд╣рд╛рдВ рд╕реЗ рдЖрдП?

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

рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░ рдЦрдВрдб / рдЕрдВрддрд░рд╛рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЪрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

   // current status: no idea how these are generated  
   const float controlPoint0 = 0.052579;  
   const float controlPoint1 = 0.878136;  
   const float controlPoint2 = 0.924339;  
   const float controlPoint3 = 0.965679;

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ / рдЧрдгрдирд╛ рдХреА рдЧрдИред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реА рд╢рд░реНрдд рд╕рд┐рд░реНрдл рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣реА рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рд╕реАрдорд╛ рдореЗрдВ рд╣реИ [controlPoint0 - controlPointVOD]ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╕рд┐рд░реНрдл 0.0 рд╣реИред

   // Input for the opacity function
   float y = saturate(Input.Texcoords.y);  // r0.x
     
   // Value of opacity function.  
   // 0 - no change  
   // 1 - full color  
   float opacity = 0.0;  
     
   [branch]   
   if (y >= controlPoint0 && y <= controlPoint3)  
   {  
      ...

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХрд╛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ рд╣рдо рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛рд░реНрдп рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ:

   6: add r0.z, r0.x, l(-0.052579)   
   7: mul r1.w, r0.z, l(1.211303)   
   8: mov_sat r0.z, r1.w   
   9: mad r0.w, r0.z, l(-2.000000), l(3.000000)   
  10: mul r0.z, r0.z, r0.z   
  11: mul r0.z, r0.z, r0.w   
  12: mul r2.x, r0.z, l(0.084642)

рд▓рд╛рдЗрди 9 рдореЗрдВ рдЧреБрдгрд╛рдВрдХ '-2.0' рдФрд░ '3.0' рд╣реИ, рдЬреЛ рд╕реНрдореВрдерд╕реНрдЯреЗрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ ред рд╣рд╛рдВ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдорд╛рди рд╣реИред

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде HLSL smoothstep рдлрдВрдХреНрд╢рди: ret smoothstep (рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо, x) рд╣рдореЗрд╢рд╛ x рдХреЛ [ min-max ] рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ ред рджреЗрдЦрдиреЗ рдХрд╛ рдПрдХ рдХреЛрдбрд╛рдВрддрд░рдХ рдмрд┐рдВрджреБ рд╕реЗ, рдЗрд╕ рдШрдЯрд╛рддрд╛ рдЧрдпрд╛ рдорд┐рдирдЯ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп (рдХрд┐ рд▓рд╛рдЗрди 9 рдкрд░ r0.z рд╕реЗ рд╣реИ,) рд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо, рдЗрд╕ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдХрд╛ рдПрдХ рдЧреБрдгрди рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ 'mul_sat' рдЬреИрд╕реА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, 'mov_sat' рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдорд┐рдирдЯ рдФрд░ рдЕрдзрд┐рдХрддрдо smoothstep рдХреЗ рдХрд╛рд░реНрдпреЛрдВ 0 рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ 1.

рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХреНрд╕рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП [0, 1]ред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛рд░реНрдп рдореЗрдВ рддреАрди рдЦрдВрдб рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдЙрд╕ рдЬрдЧрд╣ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЕрдВрддрд░рд╛рд▓ [рд╕реЗрдЧрдореЗрдВрдЯрд╕реНрдЯрд╛рд░реНрдЯ-рд╕реЗрдЧрдореЗрдВрдЯ] рдореЗрдВ рд╣реИрдВред

рдЬрд╡рд╛рдм рд▓рд┐рдирд╕реНрдЯреЗрдк рдлрд╝рдВрдХреНрд╢рди рд╣реИ!

 float linstep(float min, float max, float v)  
 {  
   return ( (v-min) / (max-min) );  
 }

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдкрд╣рд▓рд╛ рдЦрдВрдб рд▓реЗрддреЗ рд╣реИрдВ: [реж.режрелреирел 0. реп - реж.13136резрейрем]ред рдШрдЯрд╛рд╡ рд▓рд╛рдЗрди 6 рдкрд░ рд╣реИред рдпрджрд┐ рд╣рдо рд╡рд┐рднрд╛рдЬрди рдХреЛ рдЧреБрдгрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ -> 1.0 / (0.878136 - 0.052579) = 1.0 / 0.825557 = ~ 1.211303ред

рд╕реНрдореВрдерд╕реНрдЯреЗрдк рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реАрдорд╛ [0, 1] рдореЗрдВ рд╣реИред рд▓рд╛рдЗрди 12 рдкрд░ рдЧреБрдгрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рд╡рдЬрди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХрд╛ рдЕрдкрдирд╛ рд╡рдЬрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рдХреА рдЕрдзрд┐рдХрддрдо рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдЦрдВрдб [0.052579 - 0.878136] рдХреЗ рд▓рд┐рдП, рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ [0 - 0.084642] рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реИред

рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рдордирдорд╛рдиреЗ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 float getOpacityFunctionValue(float x, float cpLeft, float cpRight, float weight)  
 {  
   float val = smoothstep( 0, 1, linstep(cpLeft, cpRight, x) );  
   return val * weight;  
 }

рддреЛ, рдкреВрд░реЗ рдмрд┐рдВрджреБ рдмрд╕ рдЗрд╕реА рдЦрдВрдб рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рд╡рдЬрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

   const float weight0 = 0.084642;  
   const float weight1 = 0.889658;  
   const float weight2 = 0.974300; // note: weight0+weight1 = weight2

рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ (x) рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:

   float opacity = 0.0;

   [branch]   
   if (y >= controlPoint0 && y <= controlPoint3)  
   {  
     // Range of v: [0, weight0]  
     float v = getOpacityFunctionValue(y, controlPoint0, controlPoint1, weight0);  
     opacity = v;  
     
     [branch]  
     if ( y >= controlPoint1 )  
     {  
       // Range of v: [0, weight1]  
       float v = getOpacityFunctionValue(y, controlPoint1, controlPoint2, weight1);  
       opacity = weight0 + v;  
   
       [branch]  
       if (y >= controlPoint2)  
       {  
         // Range of v: [0, weight2]  
         float v = getOpacityFunctionValue(y, controlPoint2, controlPoint3, weight2);
         opacity = weight2 - v;          
       }  
     }  
   }

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


рдЧреНрд░рд╛рдл рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛рд░реНрдпред

рд▓рд╛рд▓ рдЪреИрдирд▓ - рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдорд╛рдиред
рд╣рд░рд╛ рдЪреИрдирд▓ - рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБред
рдиреАрд▓рд╛ рдЪреИрдирд▓ - рд╡рдЬрд╝рдиред


рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╛рдХреА рд╕рдм рд╕рд┐рд░реНрдл рдкрд░рд┐рд╖реНрдХрд░рдг рд╕реНрдкрд░реНрд╢ рд╣реИред рдлрд┐рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгрди рд╣реЛрддреЗ рд╣реИрдВ: рд╕рд┐рддрд╛рд░реЛрдВ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛, рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХрд╛ рд░рдВрдЧ рдФрд░ рдХреЛрд╣рд░реЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ред TW3 рд╢реЗрдбреНрд╕ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдк рдпрд╣рд╛рдБ 1.0 рд╕реЗ рдирд┐рд░рд░реНрдердХ рдЧреБрдгрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

   // cb4_v1.x = 1.0  
   float starsOpacity = 1.0 - cb0_v9.w * cb4_v1.x;    
   opacity *= starsOpacity;  

   // Calculate color of a shooting star  
   // cb4_v0.x = 10.0
   // cb2_v2.rgb = (1.0, 1.0, 1.0)
   float3 color = cb2_v2.rgb * cb4_v0.x;
     
   // cb2_v2.w = 1  
   opacity *= cb2_v2.w;
     
   FogResult fr = { Input.FogParams, Input.AerialParams };  
   color = ApplyFog(fr, color);
     
   return float4( color*opacity, opacity);  
 }

4. рд╕рд╛рд░рд╛рдВрд╢


рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рднрд╛рдЧ рдореЗрдВ рд╣реИред рдЗрд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред

рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдкрд┐рдХреНрд╕реЗрд▓ shader рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ (x) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ r2.x (рд▓рд╛рдЗрди 49 рдкрд░ рд╢реБрд░реВ) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕рдорд╛рд░реЛрд╣ рддреАрди рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдмрдирд╛рддрд╛ рд╣реИ: minRange (r2.y), maxRange (r2.z) рдФрд░ рдореВрд▓реНрдп (r2.w)ред рд╡реЗ рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ (x) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

lerp( minRange, maxRange, smoothstep(0, 1, value) );

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрддрд┐рдо рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдорд╛рди рдХреЛ рд▓рд╛рдЗрди 55 рдкрд░ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрджрд┐ рдЗрдирдкреБрдЯ рдорд╛рди x рд╣реИрд╕реАрдорд╛ рдореЗрдВ рд╣реИ [controlPoint0 - controlPoint3], рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП r2.x рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЬрдм x рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЧрдгрдирд╛ r0.x рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ред

рдореИрдВрдиреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рдкрд┐рдХреНрд╕рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ [controlPoint0 - controlPoint3], рдФрд░ рдЕрдВрддрд┐рдо рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛ рдЧрдИред

рдЖрдЬ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╣реАред рдФрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

All Articles