[рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд┐рдЫрд▓реЗ рд╣рд┐рд╕реНрд╕реЗ: рдкрд╣рд▓рд╛ рдФрд░ рджреВрд╕рд░рд╛ рдФрд░ рддреАрд╕рд░рд╛ ред]рднрд╛рдЧ 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
float2 cloudTextureUV = Texcoords * textureScale + elapsedTime * speedFactors;
float4 cloudTextureValue = texture0.Sample( sampler0, cloudTextureUV ).rgba;
float3 normalMap = cloudTextureValue.xyz;
float cloudShape = cloudTextureValue.a;
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
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 рдХрд╛ рджреГрд╢реНрдп рд╣реИ:рдЗрд╕ рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж (рд╕рдВрддреГрдкреНрддрд┐ рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд┐рдиреАрдЖрдпрдиреНрд╕рд┐рдЯреА рдФрд░ рдореИрдХреНрд╕рд┐рдирд┐рдЯреА рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реВрд░рдЬ рдХреА рд░реЛрд╢рдиреА рд╕реЗ рд░реЛрд╢рдиреА рд╡рд╛рд▓реЗ рдмрд╛рджрд▓реЛрдВ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдЙрдЬреНрдЬреНрд╡рд▓ рд╣реЛрдВрдЧреЗред
float NdotL = saturate( dot(invertedSunlightDir, finalNormal) );
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
float2 lightDirXY = normalize( -lightDir.xy );
float3 vWorldToCamera = ( CameraPos - WorldPos );
float worldToCamera_distance = length(vWorldToCamera);
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 рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
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
float2 noiseTextureUV = Texcoords * textureScaleNoise + elapsedTime * speedFactorsNoise;
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
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;
float4 paramsAerial;
};
рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рддреАрди рд░рдВрдЧ рд╣реИрдВ: рд╕рд╛рдордиреЗ, рдордзреНрдп рдФрд░ рдкреАрдЫреЗред рдЕрд░реНрдерд╛рддреН, рдирд┐рд░рдВрддрд░ рдмрдлрд░ рдореЗрдВ "FogColorFront", "FogColorMiddle", "AerialColorBack", рдЖрджрд┐ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рд╣реИрдВ ... рдЖрдЗрдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рджреЗрдЦреЗрдВ:
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
float fog_influence = ret.paramsFog.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 );
float param1 = lerp(1.0, override1Influence, override1InfluenceAmount);
paramsFogOverride.w = saturate(param1 * fog_influence );
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);
float ov_param1 = lerp(1.0, override2Influence, override2InfluenceAmount);
paramsFogOverride2.w = saturate(ov_param1 * fog_influence);
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)
{
const float aoDistanceStart = cb3_v0.x;
const float aoDistanceEnd = cb3_v0.y;
const float aoStrengthStart = cb3_v0.z;
const float aoStrengthEnd = cb3_v0.w;
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 );
fog.paramsFog.w *= ao;
fog.paramsAerial.w *= ao;
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) рд╕реЗ рд░реЗрдВрдЬ рдореЗрдВ рдЯреЗрдХреНрд╕рдХреЛрд░реНрдб рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд▓реНрдХрд╛рдкрд┐рдВрдб рдХреА рдкреВрд░реА рд▓рдВрдмрд╛рдИ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВредрдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░ рдЦрдВрдб / рдЕрдВрддрд░рд╛рд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЪрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
const float controlPoint0 = 0.052579;
const float controlPoint1 = 0.878136;
const float controlPoint2 = 0.924339;
const float controlPoint3 = 0.965679;
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ / рдЧрдгрдирд╛ рдХреА рдЧрдИредрдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реА рд╢рд░реНрдд рд╕рд┐рд░реНрдл рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣реА рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рд╕реАрдорд╛ рдореЗрдВ рд╣реИ [controlPoint0 - controlPointVOD]ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╕рд┐рд░реНрдл 0.0 рд╣реИред
float y = saturate(Input.Texcoords.y);
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;
рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ (x) рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ: float opacity = 0.0;
[branch]
if (y >= controlPoint0 && y <= controlPoint3)
{
float v = getOpacityFunctionValue(y, controlPoint0, controlPoint1, weight0);
opacity = v;
[branch]
if ( y >= controlPoint1 )
{
float v = getOpacityFunctionValue(y, controlPoint1, controlPoint2, weight1);
opacity = weight0 + v;
[branch]
if (y >= controlPoint2)
{
float v = getOpacityFunctionValue(y, controlPoint2, controlPoint3, weight2);
opacity = weight2 - v;
}
}
}
рдпрд╣рд╛рдБ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдореЗрдВ рддреЗрдЬ рд╡реГрджреНрдзрд┐ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХреЗ рд╢рд░реАрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ:рдЧреНрд░рд╛рдл рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛рд░реНрдпред
рд▓рд╛рд▓ рдЪреИрдирд▓ - рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдорд╛рдиред
рд╣рд░рд╛ рдЪреИрдирд▓ - рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБред
рдиреАрд▓рд╛ рдЪреИрдирд▓ - рд╡рдЬрд╝рдиредрдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╛рдХреА рд╕рдм рд╕рд┐рд░реНрдл рдкрд░рд┐рд╖реНрдХрд░рдг рд╕реНрдкрд░реНрд╢ рд╣реИред рдлрд┐рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгрди рд╣реЛрддреЗ рд╣реИрдВ: рд╕рд┐рддрд╛рд░реЛрдВ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛, рд╢реВрдЯрд┐рдВрдЧ рд╕реНрдЯрд╛рд░ рдХрд╛ рд░рдВрдЧ рдФрд░ рдХреЛрд╣рд░реЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ред TW3 рд╢реЗрдбреНрд╕ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЖрдк рдпрд╣рд╛рдБ 1.0 рд╕реЗ рдирд┐рд░рд░реНрдердХ рдЧреБрдгрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
float starsOpacity = 1.0 - cb0_v9.w * cb4_v1.x;
opacity *= starsOpacity;
float3 color = cb2_v2.rgb * cb4_v0.x;
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], рдФрд░ рдЕрдВрддрд┐рдо рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛ рдЧрдИредрдЖрдЬ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╣реАред рдФрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред