рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдж рд╡рд┐рдЪрд░ 3 рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдЗрд╕ рдЧреЗрдо рдореЗрдВ рдЕрджреНрднреБрдд рд░реЗрдВрдбрд░рд┐рдВрдЧ рддрдХрдиреАрдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдХрдерд╛рдирдХ / рд╕рдВрдЧреАрдд / рдЧреЗрдордкреНрд▓реЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд╛рдирджрд╛рд░ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ The Witcher 3 рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдпрд╣ Adrian Correger рджреНрд╡рд╛рд░рд╛
GTA V рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рдЕрднреА рдХреЗ рд▓рд┐рдПред
рд╣рдо рдЯреЛрди рд╕реБрдзрд╛рд░ рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рднрд╛рдЧ 1: рдЯреЛрди рд╕реБрдзрд╛рд░
рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдПрдПрдП рдЧреЗрдореНрд╕ рдореЗрдВ, рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЯреЛрди рд╕реБрдзрд╛рд░ рд╣реИред
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЪрдордХ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдпрд╣ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ (рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ 8 рдмрд┐рдЯреНрд╕, рдЬреЛ рд╣рдореЗрдВ 0-255 рджреЗрддрд╛ рд╣реИ)ред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЯреЛрдирд╛рдореЗрдкрд┐рдВрдЧ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╢реНрд░реЗрдгреА рдХреЛ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд╢ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдлрд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдЪрдбреАрдЖрд░ рдЫрд╡рд┐, рдЬрд┐рд╕рдХрд╛ рд░рдВрдЧ рдорд╛рди 1.0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рджреГрд╢реНрдп рдХреА рдФрд╕рдд рд░реЛрд╢рдиреА (рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреА рдЧрдгрдирд╛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдорд╛рдирд╡ рдЖрдВрдЦреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрдЦ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣рд╛рдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛)ред
рдЕрдЧрд▓рд╛ (рдФрд░ рдЕрдВрддрд┐рдо) рдХрджрдо рд╢рдЯрд░ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рд╢рдЯрд░ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдЯреЛрди рд╕реБрдзрд╛рд░ рд╡рдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред рдФрд░ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рднреНрд░рд╛рдордХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ "рд╕рдлреЗрдж рдмрд┐рдВрджреБ" (рд╕рдлреЗрдж рдмрд┐рдВрджреБ) рдФрд░ "рдордзреНрдп рдЧреНрд░реЗ" (рдордзреНрдп рдЧреНрд░реЗ)ред рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд░реНрд╡реНрд╕ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореИрдЯ рдкреЗрдЯрд┐рдЯрд┐рдиреЛ
рдХреЗ рдП рдХреНрд▓реЛрдЬрд░ рд▓реБрдХ рдСрди рдЯреЛрди рдореИрдкрд┐рдВрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ ред
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЯреЛрди рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдСрдирд▓рд╛рдЗрди рдХрдо рд╕реЗ рдХрдо
рдХреБрдЫ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣реЗ рд╣реИрдВ ... рдХреБрдЫ рд╣рдж рддрдХред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдПрдЪрдбреАрдЖрд░ рдЪрдордХ / рд╕рдлреЗрдж рдмрд┐рдВрджреБ / рдордзреНрдпрдо рдЧреНрд░реЗ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдирд╣реАрдВ - рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ "рдпреБрджреНрдз-рдкрд░реАрдХреНрд╖рдг" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рд╣рдо рд░реЗрдВрдбрд░рдбреЙрдХ рдореЗрдВ рдиреЛрд╡рд┐рдЧреНрд░рд╛рдб рдХреЗ рдореБрдЦреНрдп quests рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдЗрд╕ рдлреНрд░реЗрдо рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЕрдзрд┐рдХрддрдо рд╣реИрдВ:
рдереЛрдбрд╝рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЯреЛрди рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╣реНрд╡рд╛рди рдорд┐рд▓рд╛! рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдПрдЪрдбреАрдЖрд░ рд░рдВрдЧреЛрдВ (рдмрдирд╛рд╡рдЯ рд╕рдВрдЦреНрдпрд╛ 0, рдкреВрд░реНрдг рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди) рдФрд░ рджреГрд╢реНрдп рдХреА рдФрд╕рдд рдЪрдордХ (рдмрдирд╛рд╡рдЯ рд╕рдВрдЦреНрдпрд╛ 1, 1x1, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ, рдкрд╣рд▓реЗ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдХрдВрдкрд╛рдЙрдВрдбрд░ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛) рдХрд╛ рдПрдХ рдмрдлрд░ рд╣реИред
рдЖрдЗрдП рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
ps_5_0 dcl_globalFlags refactoringAllowed dcl_constantbuffer cb3[17], immediateIndexed dcl_resource_texture2d (float,float,float,float) t0 dcl_resource_texture2d (float,float,float,float) t1 dcl_input_ps_siv v0.xy, position dcl_output o0.xyzw dcl_temps 4 0: ld_indexable(texture2d)(float,float,float,float) r0.x, l(0, 0, 0, 0), t1.xyzw 1: max r0.x, r0.x, cb3[4].y 2: min r0.x, r0.x, cb3[4].z 3: max r0.x, r0.x, l(0.000100) 4: mul r0.y, cb3[16].x, l(11.200000) 5: div r0.x, r0.x, r0.y 6: log r0.x, r0.x 7: mul r0.x, r0.x, cb3[16].z 8: exp r0.x, r0.x 9: mul r0.x, r0.y, r0.x 10: div r0.x, cb3[16].x, r0.x 11: ftou r1.xy, v0.xyxx 12: mov r1.zw, l(0, 0, 0, 0) 13: ld_indexable(texture2d)(float,float,float,float) r0.yzw, r1.xyzw, t0.wxyz 14: mul r0.xyz, r0.yzwy, r0.xxxx 15: mad r1.xyz, cb3[7].xxxx, r0.xyzx, cb3[7].yyyy 16: mul r2.xy, cb3[8].yzyy, cb3[8].xxxx 17: mad r1.xyz, r0.xyzx, r1.xyzx, r2.yyyy 18: mul r0.w, cb3[7].y, cb3[7].z 19: mad r3.xyz, cb3[7].xxxx, r0.xyzx, r0.wwww 20: mad r0.xyz, r0.xyzx, r3.xyzx, r2.xxxx 21: div r0.xyz, r0.xyzx, r1.xyzx 22: mad r0.w, cb3[7].x, l(11.200000), r0.w 23: mad r0.w, r0.w, l(11.200000), r2.x 24: div r1.x, cb3[8].y, cb3[8].z 25: add r0.xyz, r0.xyzx, -r1.xxxx 26: max r0.xyz, r0.xyzx, l(0, 0, 0, 0) 27: mul r0.xyz, r0.xyzx, cb3[16].yyyy 28: mad r1.y, cb3[7].x, l(11.200000), cb3[7].y 29: mad r1.y, r1.y, l(11.200000), r2.y 30: div r0.w, r0.w, r1.y 31: add r0.w, -r1.x, r0.w 32: max r0.w, r0.w, l(0) 33: div o0.xyz, r0.xyzx, r0.wwww 34: mov o0.w, l(1.000000) 35: ret
рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдХрдИ рдмрд┐рдВрджреБ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реЛрдб рдХреА рдЧрдИ рдЪрдордХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдореВрд▓реНрдпреЛрдВ (рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ) рдХреЗ рднреАрддрд░ рд╕реАрдорд┐рдд (рдЕрдзрд┐рдХрддрдо / рдорд┐рдирдЯ рдХреЙрд▓) рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рджреГрд╢реНрдп рдХреА рдЙрдЪреНрдЪ рдпрд╛ рдирд┐рдореНрди рд╢рдЯрд░ рдЧрддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХрджрдо рдмрд╣реБрдд рдЖрдо рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЯреЛрди рдХрд░реЗрдХреНрд╢рди рдХрд░реНрд╡реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рд╡рд╣ рддреБрд░рдВрдд рдЗрд╕ "11.2" рдорд╛рди рдХреЛ рдкрд╣рдЪрд╛рди рд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬреЙрди рд╣рдмрд▓ рдХреЗ
рдЕрдирдЪрд╛рд░реНрдЯреЗрдб 2 рдЯреЛрди рдХрд░реЗрдХреНрд╢рди рд╡рдХреНрд░ рд╕реЗ рд╕рдлреЗрдж рдмрд┐рдВрджреБ рдХрд╛ рдорд╛рди рд╣реИред
рд╡рд╛рдпреБ рд╕реЗрдирд╛ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ cbuffer рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: cb3_v16.x, cb3_v16.y, cb3_v16.zред рд╣рдо рдЙрдирдХреЗ рдЕрд░реНрде рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдореЗрд░рд╛ рдХреВрдмрдбрд╝:
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ "x" рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд╕рдлреЗрдж рд╕реНрдХреЗрд▓" рдпрд╛ рдордзреНрдпрдо рдЧреНрд░реЗ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 11.2 (рдкрдВрдХреНрддрд┐ 4) рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╢рдЯрд░ рдЧрддрд┐ рд╕реЗрдЯрд┐рдВрдЧ (рд▓рд╛рдЗрди 10) рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рдЕрдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
"Y" - рдореИрдВрдиреЗ рдЗрд╕реЗ "u2 рдЕрдВрд╢ рдХрд╛рд░рдХ" рдХрд╣рд╛, рдФрд░ рдЬрд▓реНрдж рд╣реА рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпреЛрдВред
"Z" "рдШрд╛рддрд╛рдВрдХ рдкреИрд░рд╛рдореАрдЯрд░" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреНрд░рд┐рдкрд▓ рд▓реЙрдЧ / mul / exp (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдШрд╛рддрд╛рдВрдХ рдореЗрдВ) рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдВрджреЗрд╣ рдХреЗ рдПрдХ рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдЗрди рдЪрд░ рдирд╛рдореЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░реЗрдВ!
рднреА:
cb3_v4.yz - рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЪрдордХ рдХреА рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдорд╛рди,
cb3_v7.xyz - Uncharted2 рд╡рдХреНрд░ рдХреЗ рдПрд╕реА рдкреИрд░рд╛рдореАрдЯрд░,
cb3_v8.xyz - Uncharted2 рд╡рдХреНрд░ рдХреЗ DF рдкреИрд░рд╛рдореАрдЯрд░ред
рдЕрдм рдЪрд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдЖрддреЗ рд╣реИрдВ - рд╣рдо рдПрдХ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд╢реЗрдбрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдХреЛрдбрд░ рджреЗрдЧрд╛ред
рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рддрдирд╛ рд▓рдВрдмрд╛ рд╢реЗрдбрд░ рд╣реЛрдЧрд╛, рдХрд╛рд░реНрдп рдЙрддрдирд╛ рд╣реА рдХрдард┐рди рд╣реЛрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ hlsl-> asm рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд▓рд┐рдЦрд╛ рдерд╛ред
рджреЗрд╡рд┐рдпреЛрдВ рдФрд░ рд╕рдЬреНрдЬрдиреЛрдВ ... рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдбреА 3 рдбреА рдПрд╕рдбрд░рдбрд┐рд╕рдмрд╕реЗрдореНрдмрд▓рд░!
рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рддреИрдпрд╛рд░ рдПрдЪрдПрд▓рдПрд╕рдПрд▓
рдЯреЛрдирд▓ рдХрд░реЗрдХреНрд╢рди рдж рд╡рд┐рдЪрд░ 3 рдорд┐рд▓рд╛ :
cbuffer cBuffer : register (b3) { float4 cb3_v0; float4 cb3_v1; float4 cb3_v2; float4 cb3_v3; float4 cb3_v4; float4 cb3_v5; float4 cb3_v6; float4 cb3_v7; float4 cb3_v8; float4 cb3_v9; float4 cb3_v10; float4 cb3_v11; float4 cb3_v12; float4 cb3_v13; float4 cb3_v14; float4 cb3_v15; float4 cb3_v16, cb3_v17; } Texture2D TexHDRColor : register (t0); Texture2D TexAvgLuminance : register (t1); struct VS_OUTPUT_POSTFX { float4 Position : SV_Position; }; float3 U2Func( float A, float B, float C, float D, float E, float F, float3 x ) { return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F)) - E/F; } float3 ToneMapU2Func( float A, float B, float C, float D, float E, float F, float3 color, float numMultiplier ) { float3 numerator = U2Func( A, B, C, D, E, F, color ); numerator = max( numerator, 0 ); numerator.rgb *= numMultiplier; float3 denominator = U2Func( A, B, C, D, E, F, 11.2 ); denominator = max( denominator, 0 ); return numerator / denominator; } float4 ToneMappingPS( VS_OUTPUT_POSTFX Input) : SV_Target0 { float avgLuminance = TexAvgLuminance.Load( int3(0, 0, 0) ); avgLuminance = clamp( avgLuminance, cb3_v4.y, cb3_v4.z ); avgLuminance = max( avgLuminance, 1e-4 ); float scaledWhitePoint = cb3_v16.x * 11.2; float luma = avgLuminance / scaledWhitePoint; luma = pow( luma, cb3_v16.z ); luma = luma * scaledWhitePoint; luma = cb3_v16.x / luma; float3 HDRColor = TexHDRColor.Load( uint3(Input.Position.xy, 0) ).rgb; float3 color = ToneMapU2Func( cb3_v7.x, cb3_v7.y, cb3_v7.z, cb3_v8.x, cb3_v8.y, cb3_v8.z, luma*HDRColor, cb3_v16.y); return float4(color, 1); }
рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ:
рджреЗрдЦрд╛!
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ TW3 рдЯреЛрди рд╕реБрдзрд╛рд░ рдХрд╛ рдХрд╛рдлреА рд╕рдЯреАрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдиреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!
рдореИрдВрдиреЗ рдХрд╣рд╛ "рдкрд░реНрдпрд╛рдкреНрдд" рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ
рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ ToneMapU2Func рдореЗрдВ рд╣рд░ рдХреНрдпреЛрдВ рд╢реВрдиреНрдп рдкрд░ рдЕрдзрд┐рдХрддрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред 0 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдЧрднрдЧ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рдлреНрд░реЗрдо рдореЗрдВ TW3 рдЯреЛрди рд╢реЗрдбрд░ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрдВрджрд░ рд╕реВрд░реНрдпрд╛рд╕реНрдд рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреНрдпреВрдирддрдо рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!)
рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, shader рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб:
ps_5_0 dcl_globalFlags refactoringAllowed dcl_constantbuffer cb3[18], immediateIndexed dcl_resource_texture2d (float,float,float,float) t0 dcl_resource_texture2d (float,float,float,float) t1 dcl_input_ps_siv v0.xy, position dcl_output o0.xyzw dcl_temps 5 0: ld_indexable(texture2d)(float,float,float,float) r0.x, l(0, 0, 0, 0), t1.xyzw 1: max r0.y, r0.x, cb3[9].y 2: max r0.x, r0.x, cb3[4].y 3: min r0.x, r0.x, cb3[4].z 4: min r0.y, r0.y, cb3[9].z 5: max r0.xy, r0.xyxx, l(0.000100, 0.000100, 0.000000, 0.000000) 6: mul r0.z, cb3[17].x, l(11.200000) 7: div r0.y, r0.y, r0.z 8: log r0.y, r0.y 9: mul r0.y, r0.y, cb3[17].z 10: exp r0.y, r0.y 11: mul r0.y, r0.z, r0.y 12: div r0.y, cb3[17].x, r0.y 13: ftou r1.xy, v0.xyxx 14: mov r1.zw, l(0, 0, 0, 0) 15: ld_indexable(texture2d)(float,float,float,float) r1.xyz, r1.xyzw, t0.xyzw 16: mul r0.yzw, r0.yyyy, r1.xxyz 17: mad r2.xyz, cb3[11].xxxx, r0.yzwy, cb3[11].yyyy 18: mul r3.xy, cb3[12].yzyy, cb3[12].xxxx 19: mad r2.xyz, r0.yzwy, r2.xyzx, r3.yyyy 20: mul r1.w, cb3[11].y, cb3[11].z 21: mad r4.xyz, cb3[11].xxxx, r0.yzwy, r1.wwww 22: mad r0.yzw, r0.yyzw, r4.xxyz, r3.xxxx 23: div r0.yzw, r0.yyzw, r2.xxyz 24: mad r1.w, cb3[11].x, l(11.200000), r1.w 25: mad r1.w, r1.w, l(11.200000), r3.x 26: div r2.x, cb3[12].y, cb3[12].z 27: add r0.yzw, r0.yyzw, -r2.xxxx 28: max r0.yzw, r0.yyzw, l(0, 0, 0, 0) 29: mul r0.yzw, r0.yyzw, cb3[17].yyyy 30: mad r2.y, cb3[11].x, l(11.200000), cb3[11].y 31: mad r2.y, r2.y, l(11.200000), r3.y 32: div r1.w, r1.w, r2.y 33: add r1.w, -r2.x, r1.w 34: max r1.w, r1.w, l(0) 35: div r0.yzw, r0.yyzw, r1.wwww 36: mul r1.w, cb3[16].x, l(11.200000) 37: div r0.x, r0.x, r1.w 38: log r0.x, r0.x 39: mul r0.x, r0.x, cb3[16].z 40: exp r0.x, r0.x 41: mul r0.x, r1.w, r0.x 42: div r0.x, cb3[16].x, r0.x 43: mul r1.xyz, r1.xyzx, r0.xxxx 44: mad r2.xyz, cb3[7].xxxx, r1.xyzx, cb3[7].yyyy 45: mul r3.xy, cb3[8].yzyy, cb3[8].xxxx 46: mad r2.xyz, r1.xyzx, r2.xyzx, r3.yyyy 47: mul r0.x, cb3[7].y, cb3[7].z 48: mad r4.xyz, cb3[7].xxxx, r1.xyzx, r0.xxxx 49: mad r1.xyz, r1.xyzx, r4.xyzx, r3.xxxx 50: div r1.xyz, r1.xyzx, r2.xyzx 51: mad r0.x, cb3[7].x, l(11.200000), r0.x 52: mad r0.x, r0.x, l(11.200000), r3.x 53: div r1.w, cb3[8].y, cb3[8].z 54: add r1.xyz, -r1.wwww, r1.xyzx 55: max r1.xyz, r1.xyzx, l(0, 0, 0, 0) 56: mul r1.xyz, r1.xyzx, cb3[16].yyyy 57: mad r2.x, cb3[7].x, l(11.200000), cb3[7].y 58: mad r2.x, r2.x, l(11.200000), r3.y 59: div r0.x, r0.x, r2.x 60: add r0.x, -r1.w, r0.x 61: max r0.x, r0.x, l(0) 62: div r1.xyz, r1.xyzx, r0.xxxx 63: add r0.xyz, r0.yzwy, -r1.xyzx 64: mad o0.xyz, cb3[13].xxxx, r0.xyzx, r1.xyzx 65: mov o0.w, l(1.000000) 66: ret
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рднрдпрднреАрдд рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ (рдПрдПрдл, рдорд┐рдирдЯ / рдЕрдзрд┐рдХрддрдо рдЪрдордХ ...) рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯреЛрдВ рдХреЗ рд╕рд╛рде Uncharted2 рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рдХреЙрд▓ рд╣реИрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрднреА рдРрд╕рд╛ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ред
рдФрд░ рдПрдЪрдПрд▓рдПрд╕рдПрд▓:
cbuffer cBuffer : register (b3) { float4 cb3_v0; float4 cb3_v1; float4 cb3_v2; float4 cb3_v3; float4 cb3_v4; float4 cb3_v5; float4 cb3_v6; float4 cb3_v7; float4 cb3_v8; float4 cb3_v9; float4 cb3_v10; float4 cb3_v11; float4 cb3_v12; float4 cb3_v13; float4 cb3_v14; float4 cb3_v15; float4 cb3_v16, cb3_v17; } Texture2D TexHDRColor : register (t0); Texture2D TexAvgLuminance : register (t1); float3 U2Func( float A, float B, float C, float D, float E, float F, float3 x ) { return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F)) - E/F; } float3 ToneMapU2Func( float A, float B, float C, float D, float E, float F, float3 color, float numMultiplier ) { float3 numerator = U2Func( A, B, C, D, E, F, color ); numerator = max( numerator, 0 ); numerator.rgb *= numMultiplier; float3 denominator = U2Func( A, B, C, D, E, F, 11.2 ); denominator = max( denominator, 0 ); return numerator / denominator; } struct VS_OUTPUT_POSTFX { float4 Position : SV_Position; }; float getExposure(float avgLuminance, float minLuminance, float maxLuminance, float middleGray, float powParam) { avgLuminance = clamp( avgLuminance, minLuminance, maxLuminance ); avgLuminance = max( avgLuminance, 1e-4 ); float scaledWhitePoint = middleGray * 11.2; float luma = avgLuminance / scaledWhitePoint; luma = pow( luma, powParam); luma = luma * scaledWhitePoint; float exposure = middleGray / luma; return exposure; } float4 ToneMappingPS( VS_OUTPUT_POSTFX Input) : SV_Target0 { float avgLuminance = TexAvgLuminance.Load( int3(0, 0, 0) ); float exposure1 = getExposure( avgLuminance, cb3_v9.y, cb3_v9.z, cb3_v17.x, cb3_v17.z); float exposure2 = getExposure( avgLuminance, cb3_v4.y, cb3_v4.z, cb3_v16.x, cb3_v16.z); float3 HDRColor = TexHDRColor.Load( uint3(Input.Position.xy, 0) ).rgb; float3 color1 = ToneMapU2Func( cb3_v11.x, cb3_v11.y, cb3_v11.z, cb3_v12.x, cb3_v12.y, cb3_v12.z, exposure1*HDRColor, cb3_v17.y); float3 color2 = ToneMapU2Func( cb3_v7.x, cb3_v7.y, cb3_v7.z, cb3_v8.x, cb3_v8.y, cb3_v8.z, exposure2*HDRColor, cb3_v16.y); float3 finalColor = lerp( color2, color1, cb3_v13.x ); return float4(finalColor, 1); }
рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯ рд╣реИрдВ, рд╣рдо рдЯреЛрди рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рджреЛ рд░рдВрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдорд╛рд░реНрдЯ рдирд┐рд░реНрдгрдп!
рднрд╛рдЧ 2: рдЖрдБрдЦ рдЕрдиреБрдХреВрд▓рди
рджреВрд╕рд░рд╛ рднрд╛рдЧ рдЬреНрдпрд╛рджрд╛ рд╕рд░рд▓ рд╣реЛрдЧрд╛ред
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ TW3 рдореЗрдВ рддрд╛рдирд╡рд╛рд▓рд╛ рд╕реБрдзрд╛рд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЖрдВрдЦ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ред рдФрд░ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдХреНрдпрд╛? рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдВрдЦ рдХреЗ рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдХреИрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рдЖрдВрдЦ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ: рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рдЕрдВрдзреЗрд░реЗ рдХрдорд░реЗ рдореЗрдВ рд╣реИрдВ (рдпрд╛рдж рд░рдЦреЗрдВ рдЬреАрд╡рди рдЕрдЬреАрдм рд╣реИ) рдпрд╛ рдПрдХ рдЧреБрдлрд╛ рдореЗрдВ, рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рдкреНрд░рдХрд╛рд╢ рд╣реИ, рд╡рд╣рд╛рдВ рдмрд╛рд╣рд░ рдЬрд╛рдПрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реЛрд╢рдиреА рдХрд╛ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╕реВрд░рдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдВрдзреЗрд░реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдпреЛрдВ рдХреЛ рдкрддрд▓рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд╢ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЗрдЯрд┐рдирд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗред рдЬрдм рдпрд╣ рд╣рд▓реНрдХрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рд╢рд┐рд╖реНрдп рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рд╣рдо рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдмрдВрдж рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рджрд░реНрдж" рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рддреБрд░рдиреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдВрдЦ рдХреЛ рдЪрдордХ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рдЖрдВрдЦ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВред
рдЬрдм рдЖрдВрдЦ рдЕрдиреБрдХреВрд▓рди рдХреА рдХрдореА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ,
рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ рдПрд╕рдбреАрдХреЗ рдХрд╛
рдПрдЪрдбреАрдЖрд░рдЯреЛрди рдореИрдкрд┐рдВрдЧрд╕реАрдПрд╕ 11 рд╣реИред рдордзреНрдпрдо рдЪрдордХ рдХреЗ рддреАрд╡реНрд░ рдкрд░рд┐рд╡рд░реНрддрди рдмрд▓реНрдХрд┐ рдЕрдкреНрд░рд┐рдп рдФрд░ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд╣реИрдВред
рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ! рд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд┐рдП, рд╣рдо рдиреЛрд╡рд┐рдЧреНрд░рд╛рдж рд╕реЗ рдПрдХ рд╣реА рдлреНрд░реЗрдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рдЕрдм рд╣рдо рдлреНрд░реЗрдо рдХреИрдкреНрдЪрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо RenderDoc рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗред рдЖрдВрдЦ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдЖрдорддреМрд░ рдкрд░ рддрд╛рдирд╡рд╛рд▓рд╛ рд╕реБрдзрд╛рд░ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдж рд╡рд┐рдЪрд░ 3 рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рдкрд┐рдХреНрд╕реЗрд▓ рд╢реИрдбрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦреЗрдВ:
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЗрдирдкреБрдЯ рд╕реНрд░реЛрдд рд╣реИрдВ - 2 рдмрдирд╛рд╡рдЯ, R32_FLOAT, 1x1 (рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓)ред рдмрдирд╛рд╡рдЯ 0 рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдлреНрд░реЗрдо рд╕реЗ рджреГрд╢реНрдп рдХреА рдФрд╕рдд рдЪрдордХ рд╣реЛрддреА рд╣реИред рдмрдирд╛рд╡рдЯ 1 рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рд╕реЗ рджреГрд╢реНрдп рдХреА рдФрд╕рдд рдЪрдордХ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЧрдгрдирд╛ рдЗрд╕ рдХрдВрдкрдХрдВрдкреА рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ - рдореИрдВрдиреЗ рдЗрд╕реЗ рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИ)ред
рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ - R32_FLOAT, 1x1ред рдЪрд▓реЛ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЛ рджреЗрдЦреЗрдВред
ps_5_0 dcl_globalFlags refactoringAllowed dcl_constantbuffer cb3[1], immediateIndexed dcl_sampler s0, mode_default dcl_sampler s1, mode_default dcl_resource_texture2d (float,float,float,float) t0 dcl_resource_texture2d (float,float,float,float) t1 dcl_output o0.xyzw dcl_temps 1 0: sample_l(texture2d)(float,float,float,float) r0.x, l(0, 0, 0, 0), t1.xyzw, s1, l(0) 1: sample_l(texture2d)(float,float,float,float) r0.y, l(0, 0, 0, 0), t0.yxzw, s0, l(0) 2: ge r0.z, r0.y, r0.x 3: add r0.x, -r0.y, r0.x 4: movc r0.z, r0.z, cb3[0].x, cb3[0].y 5: mad o0.xyzw, r0.zzzz, r0.xxxx, r0.yyyy 6: ret
рд╡рд╛рд╣, рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИ! рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 7 рд▓рд╛рдЗрдиреЗрдВред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВрдЧрд╛:
0) рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреА рдФрд╕рдд рдЪрдордХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
1) рдкрд┐рдЫрд▓реЗ рдлреНрд░реЗрдо рдХреА рдФрд╕рдд рдЪрдордХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
2) рдПрдХ рдЬрд╛рдВрдЪ рдХрд░реЗрдВ: рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдЪрдордХ рдкрд┐рдЫрд▓реЗ рдлреНрд░реЗрдо рдХреА рдЪрдордХ рд╕реЗ рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ?
рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдЪрдордХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЪрдордХ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред
3) рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ:
рдЕрдВрддрд░ = currentLum - рдкреВрд░реНрд╡рд╡рд░реНрддреАред4) рдпрд╣ рд╕рд╢рд░реНрдд рд╕реНрдерд╛рдирд╛рдВрддрд░рдг (movc) рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рдЧрддрд┐ рдХрд╛рд░рдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЪреЗрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд▓рд╛рдЗрди 2 рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдЪрд╛рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдЖрдк рдХрдо рдЪрдордХ рдФрд░ рдмрдврд╝рддреА рдЪрдордХ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдХреВрд▓рди рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдзреНрдпрдпрди рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдореЗрдВ, рджреЛрдиреЛрдВ рдореВрд▓реНрдп рд╕рдорд╛рди рд╣реИрдВ рдФрд░ 0.11 рд╕реЗ 0.3 рддрдХ рднрд┐рдиреНрди рд╣реИрдВред
5) рдЕрдиреБрдХреВрд▓рд┐рдд рдЪрдордХ рдХреА рдЕрдВрддрд┐рдо рдЧрдгрдирд╛: рд░реВрдкрд╛рдВрддрд░рд┐рдд-
рдЧрддрд┐ = рдЧрддрд┐-рд╕рдВрд╡рд╛рд╣рдХ * рдЕрдВрддрд░ + рдкреВрд░реНрд╡рд╡рд░реНрддреАред6) shader рдХрд╛ рдЕрдВрдд
рдпрд╣ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
// The Witcher 3 eye adaptation shader cbuffer cBuffer : register (b3) { float4 cb3_v0; } struct VS_OUTPUT_POSTFX { float4 Position : SV_Position; }; SamplerState samplerPointClamp : register (s0); SamplerState samplerPointClamp2 : register (s1); Texture2D TexPreviousAvgLuminance : register (t0); Texture2D TexCurrentAvgLuminance : register (t1); float4 TW3_EyeAdaptationPS(VS_OUTPUT_POSTFX Input) : SV_TARGET { // Get current and previous luminance. float currentAvgLuminance = TexCurrentAvgLuminance.SampleLevel( samplerPointClamp2, float2(0.0, 0.0), 0 ); float previousAvgLuminance = TexPreviousAvgLuminance.SampleLevel( samplerPointClamp, float2(0.0, 0.0), 0 ); // Difference between current and previous luminance. float difference = currentAvgLuminance - previousAvgLuminance; // Scale factor. Can be different for both falling down and rising up of luminance. // It affects speed of adaptation. // Small conditional test is performed here, so different speed can be set differently for both these cases. float adaptationSpeedFactor = (currentAvgLuminance <= previousAvgLuminance) ? cb3_v0.x : cb3_v0.y; // Calculate adapted luminance. float adaptedLuminance = adaptationSpeedFactor * difference + previousAvgLuminance; return adaptedLuminance; }
рдпреЗ рд▓рд╛рдЗрдиреЗрдВ рд╣рдореЗрдВ рд╕рдорд╛рди рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рджреЗрддреА рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓
рдлреНрд▓реЛрдЯ 4 рдХреЗ рд╕рд╛рде рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ
рдлреНрд▓реЛрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡
рджреВрдВрдЧрд╛ ред рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреА рдмрд░реНрдмрд╛рджреА рдХреА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ Witcher 3 рдЖрдВрдЦ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛?
рдкреБрдирд╢реНрдЪред
рдмрд╛рд▓реНрдбрд░ рдХрд╛рд░реНрд▓рд╕рди (рдЯреНрд╡рд┐рдЯрд░:
@baldurk ) рдХреЛ рд░реЗрдВрдбрд░рдбреЛрдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рднрд╛рдЧ 3: рд░рдВрдЧреАрди рд╡рд┐рдкрдерди
рдХреНрд░реЛрдорд┐рдпрдо рдЕрдкрдШрдЯрди рдПрдХ рдкреНрд░рднрд╛рд╡ рд╣реИ рдЬреЛ рдореБрдЦреНрдпрддрдГ рд╕рд╕реНрддреЗ рд▓реЗрдВрд╕ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдВрд╕ рдореЗрдВ рджреГрд╢реНрдп рдкреНрд░рдХрд╛рд╢ рдХреА рд╡рд┐рднрд┐рдиреНрди рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдкрд╡рд░реНрддрдХ рд╕реВрдЪрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рджреГрд╢реНрдп рд╡рд┐рдХреГрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд░ рдХреЛрдИ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЪреБрдбрд╝реИрд▓ 3 рдореЗрдВ рдпрд╣ рдкреНрд░рднрд╛рд╡ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЧреЗрдордкреНрд▓реЗ (рдореБрдЭреЗ, рдХрдо рд╕реЗ рдХрдо) рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдПрдХ рджреГрд╢реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд░рдВрдЧреАрди рд╡рд┐рдкрдерди рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛:
рд░рдВрдЧреАрди рд╡рд┐рдкрдерди рд╢рд╛рдорд┐рд▓ рд╣реИрдХреНрд░реЛрдореЗрдЯрд┐рдХ рдЕрдкрдШрдЯрди рдЕрдХреНрд╖рдордХреНрдпрд╛ рдЖрдкрдХреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ? рдореБрдЭреЗ рди рддреЛред рдЪрд▓рд┐рдП рдПрдХ рдФрд░ рд╕реАрди рдЖрдЬрдорд╛рддреЗ рд╣реИрдВ:
рд░рдВрдЧреАрди рд╡рд┐рдкрдерди рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕рдВрдХреЗрддрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдорд╛рдореВрд▓реА "рд▓рд╛рд▓" рд╡рд┐рд░реВрдкрдг рдХреА рд╕реВрдЪрдирд╛ рджреЗрдВредрд╣рд╛рдБ, рдмрд╣реБрдд рдмреЗрд╣рддрд░! рдпрд╣рд╛рдВ рдЕрдВрдзреЗрд░реЗ рдФрд░ рд╣рд▓реНрдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реИ, рдФрд░ рдХреЛрдиреЗ рдореЗрдВ рд╣рдореЗрдВ рдереЛрдбрд╝реА рд╡рд┐рдХреГрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдкреНрд░рднрд╛рд╡ рдмрд╣реБрдд рдХрдордЬреЛрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ: рдХреЛрдб!
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рд╕рд╛рде рд╕рд╣реА рдбреНрд░реЙ рдХреЙрд▓ рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рдВрдЧреАрди рд╡рд┐рдкрдерди рдмрдбрд╝реЗ "рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ" рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреНрд░реЛрдореИрдЯрд┐рдХ рдПрдмреНрд░реЗрд╢рди, рд╡рд┐рдЧреНрдирд┐рдЯрд┐рдВрдЧ рдФрд░ рдЧрд╛рдорд╛ рд╕реБрдзрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╕рдм рдПрдХ рдПрдХрд▓ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рдЕрдВрджрд░ рд╣реИред рдЪрд▓реЛ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
ps_5_0 dcl_globalFlags refactoringAllowed dcl_constantbuffer cb3[18], immediateIndexed dcl_sampler s1, mode_default dcl_resource_texture2d (float,float,float,float) t0 dcl_input_ps_siv v0.xy, position dcl_input_ps linear v1.zw dcl_output o0.xyzw dcl_temps 4 0: mul r0.xy, v0.xyxx, cb3[17].zwzz 1: mad r0.zw, v0.xxxy, cb3[17].zzzw, -cb3[17].xxxy 2: div r0.zw, r0.zzzw, cb3[17].xxxy 3: dp2 r1.x, r0.zwzz, r0.zwzz 4: sqrt r1.x, r1.x 5: add r1.y, r1.x, -cb3[16].y 6: mul_sat r1.y, r1.y, cb3[16].z 7: sample_l(texture2d)(float,float,float,float) r2.xyz, r0.xyxx, t0.xyzw, s1, l(0) 8: lt r1.z, l(0), r1.y 9: if_nz r1.z 10: mul r1.y, r1.y, r1.y 11: mul r1.y, r1.y, cb3[16].x 12: max r1.x, r1.x, l(0.000100) 13: div r1.x, r1.y, r1.x 14: mul r0.zw, r0.zzzw, r1.xxxx 15: mul r0.zw, r0.zzzw, cb3[17].zzzw 16: mad r0.xy, -r0.zwzz, l(2.000000, 2.000000, 0.000000, 0.000000), r0.xyxx 17: sample_l(texture2d)(float,float,float,float) r2.x, r0.xyxx, t0.xyzw, s1, l(0) 18: mad r0.xy, v0.xyxx, cb3[17].zwzz, -r0.zwzz 19: sample_l(texture2d)(float,float,float,float) r2.y, r0.xyxx, t0.xyzw, s1, l(0) 20: endif ...
рдФрд░ рдХрдлрд╝рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП:

рддреЛ, рдЖрдЗрдП рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, cb3_v17.xy рдЧреБрдгрд╛рддреНрдордХ рд╡рд┐рдкрдерди рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЯреЗрдХреНрд╕рд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ 2d рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреА рд╣реИрдВ (cb3_v17.zw = рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╕рд╛рдЗрдЬрд╝ рдХрд╛ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ) "рд╡рд░реНрдгрд┐рдХ рд╡рд┐рдкрдерди рдХреЗ рдХреЗрдВрджреНрд░" рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ, рдлрд┐рд░ рдЕрдиреНрдп рдЧрдгрдирд╛, рд╕рддреНрдпрд╛рдкрди рдФрд░ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВред ред рд░рдВрдЧреАрди рд╡рд┐рдкрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪреИрдирд▓реЛрдВ рдХреЛ рдЖрд░ рдФрд░ рдЬреА рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реНрдХреНрд░реАрди рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдХрд░реАрдм, рдкреНрд░рднрд╛рд╡ рдЬрд┐рддрдирд╛ рдордЬрдмреВрдд рд╣реЛрддрд╛ рд╣реИред рд▓рд╛рдЗрди 10 рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд┐рдХреНрд╕рд▓ рдХреЛ "рдХрд░реАрдм" рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╣рдо рд╡рд┐рдкрдерди рдХреЛ рдЕрддрд┐рд░рдВрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЕрд╣рд╕рд╛рд╕ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╣рд░реНрд╖ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╕рдВрд╢рдпрд╡рд╛рдж рдХреЗ рдПрдХ (рдареЛрд╕) рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде рдЪрд░ рдирд╛рдо рд▓реЗрдВред рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рднрд╛рд╡ рдЧрд╛рдорд╛ рд╕реБрдзрд╛рд░
рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
void ChromaticAberration( float2 uv, inout float3 color ) { // User-defined params float2 chromaticAberrationCenter = float2(0.5, 0.5); float chromaticAberrationCenterAvoidanceDistance = 0.2; float fA = 1.25; float fChromaticAbberationIntensity = 30; float fChromaticAberrationDistortionSize = 0.75; // Calculate vector float2 chromaticAberrationOffset = uv - chromaticAberrationCenter; chromaticAberrationOffset = chromaticAberrationOffset / chromaticAberrationCenter; float chromaticAberrationOffsetLength = length(chromaticAberrationOffset); // To avoid applying chromatic aberration in center, subtract small value from // just calculated length. float chromaticAberrationOffsetLengthFixed = chromaticAberrationOffsetLength - chromaticAberrationCenterAvoidanceDistance; float chromaticAberrationTexel = saturate(chromaticAberrationOffsetLengthFixed * fA); float fApplyChromaticAberration = (0.0 < chromaticAberrationTexel); if (fApplyChromaticAberration) { chromaticAberrationTexel *= chromaticAberrationTexel; chromaticAberrationTexel *= fChromaticAberrationDistortionSize; chromaticAberrationOffsetLength = max(chromaticAberrationOffsetLength, 1e-4); float fMultiplier = chromaticAberrationTexel / chromaticAberrationOffsetLength; chromaticAberrationOffset *= fMultiplier; chromaticAberrationOffset *= g_Viewport.zw; chromaticAberrationOffset *= fChromaticAbberationIntensity; float2 offsetUV = -chromaticAberrationOffset * 2 + uv; color.r = TexColorBuffer.SampleLevel(samplerLinearClamp, offsetUV, 0).r; offsetUV = uv - chromaticAberrationOffset; color.g = TexColorBuffer.SampleLevel(samplerLinearClamp, offsetUV, 0).g; } }
рдореИрдВрдиреЗ рдСрдлрд╕реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП "fChromaticAberrationIntensity" рдХреЛ рдЬреЛрдбрд╝рд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рднрд╛рд╡ рдХреА рддрд╛рдХрдд, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ (TW3 = 1.0)ред рддреАрд╡реНрд░рддрд╛ = 40:
рд╡рд╣ рд╕рдм рд╣реИ! рдЖрд╢рд╛ рд╣реИ рдЖрдкрдХреЛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛрдЧрд╛
рднрд╛рдЧ 4: рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ
Vignetting рдЦреЗрд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗ рдЖрдо рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рднрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡рд╣ рдлреЛрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВред рдереЛрдбрд╝рд╛ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХреЛрдиреЗ рдПрдХ рд╕реБрдВрджрд░ рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдЧреНрдиреЗрдЯрд┐рдВрдЧ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрдВрдЬрди 4 рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдж рд╡рд┐рдЪрд░ рдкрд░ рд╡рд╛рдкрд╕ 3. рд╡рд┐рдЧреНрдиреЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдлреНрд░реЗрдо рдХреЗ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рддреБрд▓рдирд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП
рдпрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред рддреБрд▓рдирд╛ рдХреЛ
Witcher 3 рдХреЗ рд▓рд┐рдП NVIDIA рдкреНрд░рджрд░реНрд╢рди рдЧрд╛рдЗрдб рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛
рд╣реИ ред
рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде "рдж рд╡рд┐рдЪрд░ 3" рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдЪрд╛рд▓реВ рд╣реБрдЖредрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ (рдЖрдХрд╛рд╢) рдХреЛ рдЫрд╡рд┐ рдХреЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдХреА рддрд░рд╣ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕ рдкрд░ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдгрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдж рд╡рд┐рдЪрд░ 3 рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг (рдЬреЛ 19 рдордИ, 2015 рдХреЛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдФрд░ рдж рд╡рд┐рдЪрд░ 3: рдмреНрд▓рдб рдПрдВрдб рд╡рд╛рдЗрди рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рдкреВрд░реНрд╡ рдореЗрдВ, "рдЙрд▓рдЯрд╛ рдврд╛рд▓" рдХреА рдЧрдгрдирд╛ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ, рдпрд╣ 256x256 2D рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ:
рдмрдирд╛рд╡рдЯ 256x256, "рд░рдХреНрдд рдФрд░ рд╢рд░рд╛рдм рдХреЗ рдкреВрд░рдХ" рдореЗрдВ "рд░рд┐рд╡рд░реНрд╕ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ "рдмреНрд▓рдб рдПрдВрдб рд╡рд╛рдЗрди" (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ, рдПрдХ рдорд╣рд╛рди рдЦреЗрд▓) рд╕реЗ shader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЦреЗрд▓реЛрдВ рдХреА рддрд░рд╣, рдбрд╛рдпрди 3 рд╡рд┐рдЧреНрдирд┐рдЯрд┐рдВрдЧ рдХреА рдЧрдгрдирд╛ рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
... 44: log r0.xyz, r0.xyzx 45: mul r0.xyz, r0.xyzx, l(0.454545, 0.454545, 0.454545, 0.000000) 46: exp r0.xyz, r0.xyzx 47: mul r1.xyz, r0.xyzx, cb3[9].xyzx 48: sample_indexable(texture2d)(float,float,float,float) r0.w, v1.zwzz, t2.yzwx, s2 49: log r2.xyz, r1.xyzx 50: mul r2.xyz, r2.xyzx, l(2.200000, 2.200000, 2.200000, 0.000000) 51: exp r2.xyz, r2.xyzx 52: dp3 r1.w, r2.xyzx, cb3[6].xyzx 53: add_sat r1.w, -r1.w, l(1.000000) 54: mul r1.w, r1.w, cb3[6].w 55: mul_sat r0.w, r0.w, r1.w 56: mad r0.xyz, -r0.xyzx, cb3[9].xyzx, cb3[7].xyzx 57: mad r0.xyz, r0.wwww, r0.xyzx, r1.xyzx ...
рджрд┐рд▓рдЪрд╕реНрдк! рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЧрд╛рдорд╛ (рд▓рд╛рдЗрди 46) рдФрд░ рд░реИрдЦрд┐рдХ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди (рд▓рд╛рдЗрди 51) рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 48 рд░реЗрдЦрд╛ рдкрд░, рд╣рдо "рдЙрд▓рдЯрд╛ рдврд╛рд▓" рдХреА рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред cb3 [9] .xyz рд╡рд┐рдЧреНрдирдЯрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдЬрд╛рдБрдЪ рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ, рдЗрд╕реЗ рдлрд╝реНрд▓реЛрдЯ 3 (1.0, 1.0, 1.0) рдорд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╕рдВрднрд╡рддрдГ рдлрд╝реЗрдб-рдЗрди / рдлреЗрдб-рдЖрдЙрдЯ рдкреНрд░рднрд╛рд╡реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдВрддрд┐рдо рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИред TW3 рдореЗрдВ рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреАрди рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:
- рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ (cb3 [6] .w) - рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХреА рддрд╛рдХрдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред 0 - рдХреЛрдИ рд╡рд┐рдЧреНрдирд┐рдЯрд┐рдВрдЧ рдирд╣реАрдВ, 1 - рдЕрдзрд┐рдХрддрдо рд╡рд┐рдЧреНрдирд┐рдЯрд┐рдВрдЧред рдореЗрд░реЗ рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмреЗрд╕ рдж рд╡рд┐рдЪрд░ 3 рдореЗрдВ рдпрд╣ рд▓рдЧрднрдЧ 1.0 рд╣реИ, рдЬрдмрдХрд┐ рд░рдХреНрдд рдФрд░ рд╢рд░рд╛рдм рдореЗрдВ рдпрд╣ рд▓рдЧрднрдЧ 0.15 рд╣реИред
- рд░рдВрдЧ (cb3 [7] .xyz) - TW3 рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХреА рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХрд╛ рд░рдВрдЧ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд▓рд╛ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ ... рдЖрдорддреМрд░ рдкрд░ рдЗрд╕рдореЗрдВ рдлреНрд▓реЛрдЯ 3 (3.0 / 255.0, 4.0 / 255.0, 5.0 / 255.0) рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореВрд▓реНрдп рд╣реЛрддреЗ рд╣реИрдВ - рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ 0.00392156 рдХреЗ рдЧреБрдгрдХ рд╣реЛрддреЗ рд╣реИрдВ - 1.0 рдпрд╛ 255.0
- рд╡реЗрдЯ (cb3 [6] .xyz) рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ "рдлреНрд▓реИрдЯ" рд╡рд┐рдЧрдиреЗрдЯреНрд╕ рджреЗрдЦреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдорд╛рд╕реНрдХрд▓реЗрдХрд┐рди рд╡рдЬрди (рд▓рд╛рдЗрди 52) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рднрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП TW3 рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдорд╛рд╕реНрдХ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИрд╡рдЬрди 1.0 рдХреЗ рдХрд░реАрдм рд╣реИред рд░рдХреНрдд рдФрд░ рд╡рд╛рдЗрди (рдЗрдВрджреНрд░рдзрдиреБрд╖ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рджреБрдИ рджреБрдирд┐рдпрд╛) рд╕реЗ рдПрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдлрд░ рдбреЗрдЯрд╛ рдХреЛ рджреЗрдЦреЗрдВ: рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдКрдкрд░ рдХреЗ рдЖрдХрд╛рд╢ рдХреЗ рдЙрдЬреНрдЬреНрд╡рд▓ рдкрд┐рдХреНрд╕рд▓ рдХреЛ рд╡рд┐рдЧреНрдиреЗрдЯрд┐рдВрдЧ рдиреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдХреЛрдбрдпрд╣рд╛рдВ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдкрд░ TW3 рд╡рд┐рдЧрдиреЗрдЯрд┐рдВрдЧ рдХрд╛ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдЧрд╛рдорд╛рдЯреЙрдЗрд▓рд┐рдпрд░ = рдкрд╛рд╡ (рд░рдВрдЧ, 2.2)
float3 Vignette_TW3( in float3 gammaColor, in float3 vignetteColor, in float3 vignetteWeights, in float vignetteOpacity, in Texture2D texVignette, in float2 texUV ) { // For coloring vignette float3 vignetteColorGammaSpace = -gammaColor + vignetteColor; // Calculate vignette amount based on color in *LINEAR* color space and vignette weights. float vignetteWeight = dot( GammaToLinear( gammaColor ), vignetteWeights ); // We need to keep vignette weight in [0-1] range vignetteWeight = saturate( 1.0 - vignetteWeight ); // Multiply by opacity vignetteWeight *= vignetteOpacity; // Obtain vignette mask (here is texture; you can also calculate your custom mask here) float sampledVignetteMask = texVignette.Sample( samplerLinearClamp, texUV ).x; // Final (inversed) vignette mask float finalInvVignetteMask = saturate( vignetteWeight * sampledVignetteMask ); // final composite in gamma space float3 Color = vignetteColorGammaSpace * finalInvVignetteMask + gammaColor.rgb; // * uncomment to debug vignette mask: // return 1.0 - finalInvVignetteMask; // Return final color return Color; }
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдореЗрд░реЗ HLSLexplorer рдХреЛ рднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ , рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ HLSL рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реАредрдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╕рдВрд╢рдпрд╡рд╛рдж рдХреА рдПрдХ рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдЪрд░ рдХреЗ рдирд╛рдо рд▓реЗ рд▓реЛ - TW3 рд╢реЗрдбреНрд╕ рдХреЛ D3DStripShader рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВред ); рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрдкрдиреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд┐ рд╢реЗрдбрд░ рдХреЛ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреНрд╖рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╡рд╣рди рдирд╣реАрдВ рд╣реИрдврд╛рд▓ рдЧрдгрдирд╛: рдмреЛрдирд╕рдореЗрдВ рдмрдЬрд╛рдп precalculated рдмрдирд╛рд╡рдЯ рдирдореВрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЗ, 2015 "рдЗрд╕ Witcher 3" рд░рд┐рд╡рд░реНрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдврд╛рд▓ рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: 35: add r2.xy, v1.zwzz, l(-0.500000, -0.500000, 0.000000, 0.000000) 36: dp2 r1.w, r2.xyxx, r2.xyxx 37: sqrt r1.w, r1.w 38: mad r1.w, r1.w, l(2.000000), l(-0.550000) 39: mul_sat r2.w, r1.w, l(1.219512) 40: mul r2.z, r2.w, r2.w 41: mul r2.xy, r2.zwzz, r2.zzzz 42: dp4 r1.w, l(-0.100000, -0.105000, 1.120000, 0.090000), r2.xyzw 43: min r1.w, r1.w, l(0.940000)
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред HLSL рдкрд░, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: float TheWitcher3_2015_Mask( in float2 uv ) { float distanceFromCenter = length( uv - float2(0.5, 0.5) ); float x = distanceFromCenter * 2.0 - 0.55; x = saturate( x * 1.219512 ); // 1.219512 = 100/82 float x2 = x * x; float x3 = x2 * x; float x4 = x2 * x2; float outX = dot( float4(x4, x3, x2, x), float4(-0.10, -0.105, 1.12, 0.09) ); outX = min( outX, 0.94 ); return outX; }
рдпрд╣реА рд╣реИ, рд╣рдо рдмрд╕ рдХреЗрдВрджреНрд░ рд╕реЗ рдХрдкрдбрд╝рд╛ рддрдХ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЬрд╛рджреВ рдХрд░рддреЗ рд╣реИрдВ (рдЧреБрдгрди, рд╕рдВрддреГрдкреНрдд ...), рдФрд░ рдлрд┐рд░ ... рдмрд╣реБрдкрдж рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ! рдмрд╣реБрдд рдЦреВрдмредрднрд╛рдЧ 5: рдирд╢рд╛ рдХрд╛ рдкреНрд░рднрд╛рд╡
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЦреЗрд▓ "рдж рд╡рд┐рдЪрд░ 3: рд╡рд╛рдЗрд▓реНрдб рд╣рдВрдЯ" рдирд╢реЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЦреЗрд▓рд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрдВ, рдЦрд░реАрджреЗрдВ рдФрд░ рдЦреЗрд▓реЗрдВ, рдПрдХ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦреЗрдВ:рд╢рд╛рдо:рд░рд╛рдд:рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рджреЛрд╣рд░реА рдФрд░ рдШреВрдорддреА рд╣реБрдИ рдЫрд╡рд┐ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдкреАрддреЗ рд╣реИрдВред рдЫрд╡рд┐ рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рджреВрд░, рд░реЛрдЯреЗрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЛ рдордЬрдмреВрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд░рд╛рдд рдХреЗ рд╕рд╛рде рджреВрд╕рд░рд╛ рд╡реАрдбрд┐рдпреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддрд╛рд░реЛрдВ рдкрд░ рдЗрд╕ рд░реЛрдЯреЗрд╢рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (8 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦреЗрдВ?)рдирд╢реЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЬреЛ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╝реВрдо рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рд╣реИред рдпрд╣ рдХреЗрдВрджреНрд░ рдХреЗ рдкрд╛рд╕ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИредрдпрд╣ рд╢рд╛рдпрдж рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ (рдкрд┐рдХреНрд╕реЗрд▓ shader) рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реНрдерд╛рди рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдирд╢рд╛ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рддрд╛рдирд▓ рд╕реБрдзрд╛рд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдФрд░ рдЧрддрд┐ рдзрдмреНрдмрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ("рдирд╢реЗ рдореЗрдВ" рдЫрд╡рд┐ рдЧрддрд┐ рдзреБрдВрдзрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рд╣реИ)редрдЦреЗрд▓ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: ps_5_0 dcl_globalFlags refactoringAllowed dcl_constantbuffer cb0[2], immediateIndexed dcl_constantbuffer cb3[3], immediateIndexed dcl_sampler s0, mode_default dcl_resource_texture2d (float,float,float,float) t0 dcl_input_ps_siv v1.xy, position dcl_output o0.xyzw dcl_temps 8 0: mad r0.x, cb3[0].y, l(-0.100000), l(1.000000) 1: mul r0.yz, cb3[1].xxyx, l(0.000000, 0.050000, 0.050000, 0.000000) 2: mad r1.xy, v1.xyxx, cb0[1].zwzz, -cb3[2].xyxx 3: dp2 r0.w, r1.xyxx, r1.xyxx 4: sqrt r1.z, r0.w 5: mul r0.w, r0.w, l(10.000000) 6: min r0.w, r0.w, l(1.000000) 7: mul r0.w, r0.w, cb3[0].y 8: mul r2.xyzw, r0.yzyz, r1.zzzz 9: mad r2.xyzw, r1.xyxy, r0.xxxx, -r2.xyzw 10: mul r3.xy, r0.xxxx, r1.xyxx 11: mad r3.xyzw, r0.yzyz, r1.zzzz, r3.xyxy 12: add r3.xyzw, r3.xyzw, cb3[2].xyxy 13: add r2.xyzw, r2.xyzw, cb3[2].xyxy 14: mul r0.x, r0.w, cb3[0].x 15: mul r0.x, r0.x, l(5.000000) 16: mul r4.xyzw, r0.xxxx, cb3[0].zwzw 17: mad r5.xyzw, r4.zwzw, l(1.000000, 0.000000, -1.000000, -0.000000), r2.xyzw 18: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r5.xyxx, t0.xyzw, s0 19: sample_indexable(texture2d)(float,float,float,float) r5.xyzw, r5.zwzz, t0.xyzw, s0 20: add r5.xyzw, r5.xyzw, r6.xyzw 21: mad r6.xyzw, r4.zwzw, l(0.707000, 0.707000, -0.707000, -0.707000), r2.xyzw 22: sample_indexable(texture2d)(float,float,float,float) r7.xyzw, r6.xyxx, t0.xyzw, s0 23: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r6.zwzz, t0.xyzw, s0 24: add r5.xyzw, r5.xyzw, r7.xyzw 25: add r5.xyzw, r6.xyzw, r5.xyzw 26: mad r6.xyzw, r4.zwzw, l(0.000000, 1.000000, -0.000000, -1.000000), r2.xyzw 27: mad r2.xyzw, r4.xyzw, l(-0.707000, 0.707000, 0.707000, -0.707000), r2.xyzw 28: sample_indexable(texture2d)(float,float,float,float) r7.xyzw, r6.xyxx, t0.xyzw, s0 29: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r6.zwzz, t0.xyzw, s0 30: add r5.xyzw, r5.xyzw, r7.xyzw 31: add r5.xyzw, r6.xyzw, r5.xyzw 32: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r2.xyxx, t0.xyzw, s0 33: sample_indexable(texture2d)(float,float,float,float) r2.xyzw, r2.zwzz, t0.xyzw, s0 34: add r5.xyzw, r5.xyzw, r6.xyzw 35: add r2.xyzw, r2.xyzw, r5.xyzw 36: mul r2.xyzw, r2.xyzw, l(0.062500, 0.062500, 0.062500, 0.062500) 37: mad r5.xyzw, r4.zwzw, l(1.000000, 0.000000, -1.000000, -0.000000), r3.zwzw 38: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r5.xyxx, t0.xyzw, s0 39: sample_indexable(texture2d)(float,float,float,float) r5.xyzw, r5.zwzz, t0.xyzw, s0 40: add r5.xyzw, r5.xyzw, r6.xyzw 41: mad r6.xyzw, r4.zwzw, l(0.707000, 0.707000, -0.707000, -0.707000), r3.zwzw 42: sample_indexable(texture2d)(float,float,float,float) r7.xyzw, r6.xyxx, t0.xyzw, s0 43: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r6.zwzz, t0.xyzw, s0 44: add r5.xyzw, r5.xyzw, r7.xyzw 45: add r5.xyzw, r6.xyzw, r5.xyzw 46: mad r6.xyzw, r4.zwzw, l(0.000000, 1.000000, -0.000000, -1.000000), r3.zwzw 47: mad r3.xyzw, r4.xyzw, l(-0.707000, 0.707000, 0.707000, -0.707000), r3.xyzw 48: sample_indexable(texture2d)(float,float,float,float) r4.xyzw, r6.xyxx, t0.xyzw, s0 49: sample_indexable(texture2d)(float,float,float,float) r6.xyzw, r6.zwzz, t0.xyzw, s0 50: add r4.xyzw, r4.xyzw, r5.xyzw 51: add r4.xyzw, r6.xyzw, r4.xyzw 52: sample_indexable(texture2d)(float,float,float,float) r5.xyzw, r3.xyxx, t0.xyzw, s0 53: sample_indexable(texture2d)(float,float,float,float) r3.xyzw, r3.zwzz, t0.xyzw, s0 54: add r4.xyzw, r4.xyzw, r5.xyzw 55: add r3.xyzw, r3.xyzw, r4.xyzw 56: mad r2.xyzw, r3.xyzw, l(0.062500, 0.062500, 0.062500, 0.062500), r2.xyzw 57: mul r0.x, cb3[0].y, l(8.000000) 58: mul r0.xy, r0.xxxx, cb3[0].zwzz 59: mad r0.z, cb3[1].y, l(0.020000), l(1.000000) 60: mul r1.zw, r0.zzzz, r1.xxxy 61: mad r1.xy, r1.xyxx, r0.zzzz, cb3[2].xyxx 62: mad r3.xy, r1.zwzz, r0.xyxx, r1.xyxx 63: mul r0.xy, r0.xyxx, r1.zwzz 64: mad r0.xy, r0.xyxx, l(2.000000, 2.000000, 0.000000, 0.000000), r1.xyxx 65: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r1.xyxx, t0.xyzw, s0 66: sample_indexable(texture2d)(float,float,float,float) r4.xyzw, r0.xyxx, t0.xyzw, s0 67: sample_indexable(texture2d)(float,float,float,float) r3.xyzw, r3.xyxx, t0.xyzw, s0 68: add r1.xyzw, r1.xyzw, r3.xyzw 69: add r1.xyzw, r4.xyzw, r1.xyzw 70: mad r2.xyzw, -r1.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333), r2.xyzw 71: mul r1.xyzw, r1.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333) 72: mul r0.xyzw, r0.wwww, r2.xyzw 73: mad o0.xyzw, cb3[0].yyyy, r0.xyzw, r1.xyzw 74: ret
рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд░рдВрддрд░ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:cb0_v0.x -> рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп (рд╕реЗрдХрдВрдб рдореЗрдВ)cb0_v1.xyzw - рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдЖрдХрд╛рд░ (рдЙрд░реНрдл "рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд░") рдХреЗрдкрд╛рд░рд╕реНрдкрд░рд┐рдХ: cb3_v0.x - рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдкрд░, рд╣рдореЗрд╢рд╛ 1.0 рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИредcb3_v0.y - рдирд╢рд╛ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреА рднрдпрд╛рд╡рд╣рддрд╛ред рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкреВрд░реА рддрд╛рдХрдд рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдзреАрд░реЗ-рдзреАрд░реЗ 0.0 рд╕реЗ 1.0 рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИредcv3_v1.xy - рдкрд┐рдХреНрд╕реЗрд▓ рдСрдлрд╝рд╕реЗрдЯреНрд╕ (рдиреАрдЪреЗ рдЗрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХ)ред рдпрд╣ рдПрдХ рдкрд╛рдк / рдмреНрд░рд╣реНрдорд╛рдВрдб рдЬреЛрдбрд╝реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк shader рдореЗрдВ sincos (рд╕рдордп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредcb3_v2.xy рдкреНрд░рднрд╛рд╡ рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдлреНрд▓реЛрдЯ 2 (0.5, 0.5)редрдпрд╣рд╛рдВ рд╣рдо рдпрд╣ рд╕рдордЭрдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рд╢реЗрдбрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛редрд╣рдо рдкрд╣рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ: ps_5_0 0: mad r0.x, cb3[0].y, l(-0.100000), l(1.000000) 1: mul r0.yz, cb3[1].xxyx, l(0.000000, 0.050000, 0.050000, 0.000000) 2: mad r1.xy, v1.xyxx, cb0[1].zwzz, -cb3[2].xyxx 3: dp2 r0.w, r1.xyxx, r1.xyxx 4: sqrt r1.z, r0.w
рдореИрдВ рд▓рд╛рдЗрди 0 "рдЬрд╝реВрдо рдЕрдиреБрдкрд╛рдд" рдХрд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЖрдк рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпреЛрдВред рдЗрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж (рдкрдВрдХреНрддрд┐ 1), рд╣рдо "рд░реЛрдЯреЗрд╢рди рд╡рд┐рд╕реНрдерд╛рдкрди" рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЗрдирдкреБрдЯ рдкрд╛рдк / рдХреЙрд╕ рдбреЗрдЯрд╛ рдкреЗрдпрд░ рд╣реИ рдЬреЛ 0.05 рдЧреБрдгрд╛ рд╣реИредрд▓рд╛рдЗрдиреЗрдВ 2-4: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЛ рдкреНрд░рднрд╛рд╡ рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдмрдирд╛рд╡рдЯ рдХреЗ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрдХ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рджреВрд░реА рдХреЗ рд╡рд░реНрдЧ (3) рдФрд░ рд╕рд░рд▓ рджреВрд░реА (4) (рдХреЗрдВрджреНрд░ рд╕реЗ рдЯреЗрдХреНрд╕реЗрд▓ рддрдХ) рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВрдЬрд╝реВрдо рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ
рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ: 8: mul r2.xyzw, r0.yzyz, r1.zzzz 9: mad r2.xyzw, r1.xyxy, r0.xxxx, -r2.xyzw 10: mul r3.xy, r0.xxxx, r1.xyxx 11: mad r3.xyzw, r0.yzyz, r1.zzzz, r3.xyxy 12: add r3.xyzw, r3.xyzw, cb3[2].xyxy 13: add r2.xyzw, r2.xyzw, cb3[2].xyxy
рдЪреВрдВрдХрд┐ рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреИрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдлреНрд▓реЛрдЯ рдХреА рдХреЗрд╡рд▓ рдПрдХ рдЬреЛрдбрд╝реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, r0.yz "рд░реЛрдЯреЗрд╢рди рдСрдлрд╝рд╕реЗрдЯ" рд╣реИрдВ, r1.z рдХреЗрдВрджреНрд░ рд╕реЗ рдЯреЗрдХреНрд╕реЗрд▓ рдХреА рджреВрд░реА рд╣реИ, r1.xy рдХреЗрдВрджреНрд░ рд╕реЗ рдЯреЗрдХреНрд╕реЗрд▓ рддрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ, r0.x "рдЬрд╝реВрдо рдХрд╛рд░рдХ" рд╣реИредрдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ zoomFactor = 1.0, рдпрд╛рдиреА рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: 8: mul r2.xyzw, r0.yzyz, r1.zzzz 9: mad r2.xyzw, r1.xyxy, r0.xxxx, -r2.xyzw 13: add r2.xyzw, r2.xyzw, cb3[2].xyxy r2.xy = (texel - center) * zoomFactor - rotationOffsets * distanceFromCenter + center;
рд▓реЗрдХрд┐рди ZoomFactor = 1.0: r2.xy = texel - center - rotationOffsets * distanceFromCenter + center; r2.xy = texel - rotationOffsets * distanceFromCenter;
рдЗрд╕реА рддрд░рд╣ r3.xy рдХреЗ рд▓рд┐рдП: 10: mul r3.xy, r0.xxxx, r1.xyxx 11: mad r3.xyzw, r0.yzyz, r1.zzzz, r3.xyxy 12: add r3.xyzw, r3.xyzw, cb3[2].xyxy r3.xy = rotationOffsets * distanceFromCenter + zoomFactor * (texel - center) + center
рд▓реЗрдХрд┐рди ZoomFactor = 1.0: рдорд╣рд╛рдиред рдпрд╣реА рд╣реИ, рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд░реНрддрдорд╛рди рдмрдирд╛рд╡рдЯ (рдЯреЗрдХреНрд╕рд▓), рд░реЛрдЯреЗрд╢рди рдСрдлрд╝рд╕реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╝реВрдордлрд╝реИрдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рд▓рд╛рдЗрди 0. рджреЗрдЦреЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, zoomFactor = 1.0 - 0.1 * drunkAmountред рдЕрдзрд┐рдХрддрдо рдирд╢реЗ рдХреЗ рд▓рд┐рдП, рдЬрд╝реВрдордлрд╝реИрдХреНрдЯрд░ рдХрд╛ рдорд╛рди 0.9 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрд╝реВрдо рдХреЗ рд╕рд╛рде рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдЕрдм рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:r3.xy = rotationOffsets * distanceFromCenter + texel - center + center r3.xy = texel + rotationOffsets * distanceFromCenter
baseTexcoordsA = 0.9 * texel + 0.1 * center + rotationOffsets * distanceFromCenter baseTexcoordsB = 0.9 * texel + 0.1 * center - rotationOffsets * distanceFromCenter
рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реЛрдЧреА: рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдХреЗрдВрджреНрд░ рдХреЗ рдмреАрдЪ рдХреБрдЫ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рд░реЗрдЦреАрдп рдкреНрд░рдХреНрд╖реЗрдк рд╣реИред рдпрд╣ рдПрдХ "рдЬрд╝реВрдо-рдЗрди" рдЫрд╡рд┐ рд╣реИред рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣рд╛рдВ Shadertoy рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВредрдмрдирд╛рд╡рдЯ рдСрдлрд╕реЗрдЯ
рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛: 2: mad r1.xy, v1.xyxx, cb0[1].zwzz, -cb3[2].xyxx 3: dp2 r0.w, r1.xyxx, r1.xyxx 5: mul r0.w, r0.w, l(10.000000) 6: min r0.w, r0.w, l(1.000000) 7: mul r0.w, r0.w, cb3[0].y 14: mul r0.x, r0.w, cb3[0].x 15: mul r0.x, r0.x, l(5.000000) // texcoords offset intensity 16: mul r4.xyzw, r0.xxxx, cb3[0].zwzw // texcoords offset
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдврд╛рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЪрд▓реЛ рдЗрд╕реЗ "рд╡рд┐рд╕реНрдерд╛рдкрди рддреАрд╡реНрд░рддрд╛ рдореБрдЦреМрдЯрд╛" рдХрд╣рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреЛ рдЕрд░реНрде рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ r0.w рдореЗрдВ рд╣реИ (рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ) рдФрд░ рджреВрд╕рд░рд╛ r0.x (рдкрдВрдХреНрддрд┐ 15) рдореЗрдВ 5 рдЧреБрдирд╛ рдордЬрдмреВрдд рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреЗрдХреНрд╕рд▓ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдмрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИредрд░реЛрдЯреЗрд╢рди-рд╕рдВрдмрдВрдзреА рдирдореВрдирд╛рдХрд░рдгрдЕрдЧрд▓рд╛, рдмрдирд╛рд╡рдЯ рдХреЗ рдирдореВрдиреЗ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 8 рдирдореВрдиреЛрдВ рдХреА 2 рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ "рдкрдХреНрд╖" рдХреЗ рд▓рд┐рдПред HLSL рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: static const float2 pointsAroundPixel[8] = { float2(1.0, 0.0), float2(-1.0, 0.0), float2(0.707, 0.707), float2(-0.707, -0.707), float2(0.0, 1.0), float2(0.0, -1.0), float2(-0.707, 0.707), float2(0.707, -0.707) }; float4 colorA = 0; float4 colorB = 0; int i=0; [unroll] for (i = 0; i < 8; i++) { colorA += TexColorBuffer.Sample( samplerLinearClamp, baseTexcoordsA + texcoordsOffset * pointsAroundPixel[i] ); } colorA /= 16.0; [unroll] for (i = 0; i < 8; i++) { colorB += TexColorBuffer.Sample( samplerLinearClamp, baseTexcoordsB + texcoordsOffset * pointsAroundPixel[i] ); } colorB /= 16.0; float4 rotationPart = colorA + colorB;
рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдмреЗрд╕рдЯреИрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ / рдмреА рдХреЛ рдпреВрдирд┐рдЯ рд╕рд░реНрдХрд▓ рдкрд░ рдкрдбрд╝реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдлрд╕реЗрдЯ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд "рдмрдирд╛рд╡рдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рддреАрд╡реНрд░рддрд╛ рдХреА рддреАрд╡реНрд░рддрд╛" рд╕реЗ рдХрдИ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИред рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рджреВрд░, рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╡реГрддреНрдд рдХрд╛ рддреНрд░рд┐рдЬреНрдпрд╛ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ 8 рдмрд╛рд░ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рддрд╛рд░реЛрдВ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред PointsAroundPixel рдорд╛рди (45 рдбрд┐рдЧреНрд░реА рдХреЗ рдЧреБрдгрдХ):рд╕рд┐рдВрдЧрд▓ рд╕рд░реНрдХрд▓рдЬреВрдо рд╕рдВрдмрдВрдзрд┐рдд рдирдореВрдирд╛, рдж рд╡рд┐рдЪрд░ 3 рдореЗрдВ рдирд╢реЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд╝реВрдо рдЗрди рдФрд░ рдЬрд╝реВрдо рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЬрд╝реВрдо рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ: 56: mad r2.xyzw, r3.xyzw, l(0.062500, 0.062500, 0.062500, 0.062500), r2.xyzw // the rotation part is stored in r2 register 57: mul r0.x, cb3[0].y, l(8.000000) 58: mul r0.xy, r0.xxxx, cb3[0].zwzz 59: mad r0.z, cb3[1].y, l(0.020000), l(1.000000) 60: mul r1.zw, r0.zzzz, r1.xxxy 61: mad r1.xy, r1.xyxx, r0.zzzz, cb3[2].xyxx 62: mad r3.xy, r1.zwzz, r0.xyxx, r1.xyxx 63: mul r0.xy, r0.xyxx, r1.zwzz 64: mad r0.xy, r0.xyxx, l(2.000000, 2.000000, 0.000000, 0.000000), r1.xyxx 65: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, r1.xyxx, t0.xyzw, s0 66: sample_indexable(texture2d)(float,float,float,float) r4.xyzw, r0.xyxx, t0.xyzw, s0 67: sample_indexable(texture2d)(float,float,float,float) r3.xyzw, r3.xyxx, t0.xyzw, s0 68: add r1.xyzw, r1.xyzw, r3.xyzw 69: add r1.xyzw, r4.xyzw, r1.xyzw
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдирд╛рд╡рдЯ рдХреЙрд▓ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред рдЖрдЗрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЙрдирд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ: float zoomInOutScalePixels = drunkEffectAmount * 8.0; // line 57 float2 zoomInOutScaleNormalizedScreenCoordinates = zoomInOutScalePixels * texelSize.xy; // line 58 float zoomInOutAmplitude = 1.0 + 0.02*cos(time); // line 59 float2 zoomInOutfromCenterToTexel = zoomInOutAmplitude * fromCenterToTexel; // line 60
рдЗрдирдкреБрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рд╣рдо рдЯреЗрдХреНрд╕рд▓реНрд╕ рдореЗрдВ рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 8.0 * рдЯреЗрдХреНрд╕рд▓ рдЖрдХрд╛рд░), рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдмреЗрд╕ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдпрд╛рдо рдХреЗрд╡рд▓ рдЬрд╝реВрдо рдХреА рднрд╛рд╡рдирд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП 0.98 рдФрд░ 1.02 рдХреЗ рдмреАрдЪ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдШреБрдорд╛рд╡ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЬрд╝реВрдордлрд╝реИрдХреНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИредрдЪрд▓рд┐рдП рдкрд╣рд▓реА рдЬреЛрдбрд╝реА рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ - r1.xy (рдкрдВрдХреНрддрд┐ 61) r1.xy = fromCenterToTexel * amplitude + center r1.xy = (TextureUV - Center) * amplitude + Center // you can insert here zoomInOutfromCenterToTexel r1.xy = TextureUV * amplitude - Center * amplitude + Center r1.xy = TextureUV * amplitude + Center * 1.0 - Center * amplitude r1.xy = TextureUV * amplitude + Center * (1.0 - amplitude) r1.xy = lerp( TextureUV, Center, amplitude);
рд╡рд╣ рд╣реИ: float2 zoomInOutBaseTextureUV = lerp(TextureUV, Center, amplitude)
рдЪрд▓реЛ рджреВрд╕рд░реА рдЬреЛрдбрд╝реА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ - r3.xy (рдкрдВрдХреНрддрд┐ 62) r3.xy = (amplitude * fromCenterToTexel) * zoomInOutScaleNormalizedScreenCoordinates + zoomInOutBaseTextureUV
рд╡рд╣ рд╣реИ: float2 zoomInOutAddTextureUV0 = zoomInOutBaseTextureUV + zoomInOutfromCenterToTexel*zoomInOutScaleNormalizedScreenCoordinates;
рдЖрдЗрдП рддреАрд╕рд░реА рдЬреЛрдбрд╝реА рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ - r0.xy (рд▓рд╛рдЗрдиреЗрдВ 63-64) r0.xy = zoomInOutScaleNormalizedScreenCoordinates * (amplitude * fromCenterToTexel) * 2.0 + zoomInOutBaseTextureUV
рд╡рд╣ рд╣реИ: float2 zoomInOutAddTextureUV1 = zoomInOutBaseTextureUV + 2.0*zoomInOutfromCenterToTexel*zoomInOutScaleNormalizedScreenCoordinates
рд╕рднреА рддреАрди рдмрдирд╛рд╡рдЯ рдкреНрд░рд╢реНрди рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рд░рдЬрд┐рд╕реНрдЯрд░ r1 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдПрдХ рд╕реАрдорд┐рдд рдкрддреЗ рд╡рд╛рд▓реЗ рдирдореВрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредрдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рдерд░рдЦрдирд╛ рддреЛ, рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ r2 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдФрд░ r1 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рддреАрди рдЧреБрдирд╛ рдЬреВрдо рдЕрдиреБрд░реЛрдз рд╣реИрдВред рдЖрдЗрдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ: 70: mad r2.xyzw, -r1.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333), r2.xyzw 71: mul r1.xyzw, r1.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333) 72: mul r0.xyzw, r0.wwww, r2.xyzw 73: mad o0.xyzw, cb3[0].yyyy, r0.xyzw, r1.xyzw 74: ret
рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдирдкреБрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: r0.w рдХреЛ рд▓рд╛рдЗрди 7 рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░рд╛ рддреАрд╡реНрд░рддрд╛ рдорд╛рд╕реНрдХ рд╣реИ, рдФрд░ cb3 [0]ред рдпрд╣ рдирд╢реЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкрд░рд┐рдорд╛рдг рд╣реИредрдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╛рд╢рд╡рд┐рдХ рдмрд▓ рдерд╛: float4 finalColor = intensityMask * (rotationPart - zoomingPart); finalColor = drunkIntensity * finalColor + zoomingPart; return finalColor;
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛ, рдХреЛрдИ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢реЗрдбреНрд╕ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ ред рдореИрдВрдиреЗ рдХрд╛рдЧрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЗрдВрд╕рд┐рд▓ рд▓реА рдФрд░ рдпрд╣ рд╕реВрддреНрд░ рд▓рд┐рдЦрд╛: finalColor = effectAmount * [intensityMask * (rotationPart - zoomPart)] + zoomPart finalColor = effectAmount * intensityMask * rotationPart - effectAmount * intensityMask * zoomPart + zooomPart
рдЯреА рдХрд╣рд╛рдБ = effectAmount * intensityMaskрддреЛ, рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ: finalColor = t * rotationPart - t * zoomPart + zoomPart finalColor = t * rotationPart + zoomPart - t * zoomPart finalColor = t * rotationPart + (1.0 - t) * zoomPart finalColor = lerp( zoomingPart, rotationPart, t )
рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдЖрддреЗ рд╣реИрдВ: finalColor = lerp(zoomingPart, rotationPart, intensityMask * drunkIntensity);
рд╣рд╛рдВ, рд▓реЗрдЦ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдВрдд рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП! рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рд╕реАрдЦрд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рднреА рдХрд░реЗрдВрдЧреЗ!рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреВрд░реНрдг рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ HLSLexplorer рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ , рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореВрд▓ shader рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рддреНрдпрдХреНрд╖ рдПрдХ-рд╕реЗ-рдПрдХ рдкрддреНрд░рд╛рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЕрдВрддрд░ рдЗрддрдиреЗ рдЫреЛрдЯреЗ (рдПрдХ рдкрдВрдХреНрддрд┐ рдХрдо) рд╣реИрдВ рдХрд┐ рдореИрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!