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

рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рд╣реИ ред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдмрд╛рд░рд┐рд╢ рдХреЗ рджреМрд░рд╛рди рддреАрдЦреЗрдкрди, рдФрд╕рдд рдЪрдордХ, рдЪрд╛рдБрдж рдЪрд░рдгреЛрдВ рдФрд░ рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рднрд╛рдЧ 6. рддреЗрдЬ рдХрд░реЛ


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

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

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

рдЫрд╡рд┐

рд╡рд┐рдХрд▓реНрдк "рдХрдо" - рддрдХ

рдЫрд╡рд┐

рд╡рд┐рдХрд▓реНрдк "рдХрдо" - рдХреЗ рдмрд╛рдж


рдЙрдЪреНрдЪ рд╡рд┐рдХрд▓реНрдк - рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП


рд╡рд┐рдХрд▓реНрдк "рдЙрдЪреНрдЪ" - рдХреЗ рдмрд╛рдж

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

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


рдЗрдирдкреБрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╢рд╛рд░реНрдкрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд▓рд░ рдмрдлрд░ t0 (LDR рдХреЗ рдмрд╛рдж рдЯреЛрди рдХрд░реЗрдХреНрд╢рди рдФрд░ рд▓реЗрдВрд╕ рдлреНрд▓реЗрдпрд░реНрд╕) рдФрд░ рдбреЗрдкреНрде рдмрдлрд░ t1 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред

рдЪрд▓реЛ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb3[3], immediateIndexed
dcl_constantbuffer cb12[23], 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_siv v0.xy, position
dcl_output o0.xyzw
dcl_temps 7
0: ftoi r0.xy, v0.xyxx
1: mov r0.zw, l(0, 0, 0, 0)
2: ld_indexable(texture2d)(float,float,float,float) r0.x, r0.xyzw, t1.xyzw
3: mad r0.x, r0.x, cb12[22].x, cb12[22].y
4: mad r0.y, r0.x, cb12[21].x, cb12[21].y
5: max r0.y, r0.y, l(0.000100)
6: div r0.y, l(1.000000, 1.000000, 1.000000, 1.000000), r0.y
7: mad_sat r0.y, r0.y, cb3[1].z, cb3[1].w
8: add r0.z, -cb3[1].x, cb3[1].y
9: mad r0.y, r0.y, r0.z, cb3[1].x
10: add r0.y, r0.y, l(1.000000)
11: ge r0.x, r0.x, l(1.000000)
12: movc r0.x, r0.x, l(0), l(1.000000)
13: mul r0.z, r0.x, r0.y
14: round_z r1.xy, v0.xyxx
15: add r1.xy, r1.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000)
16: div r1.xy, r1.xyxx, cb3[0].zwzz
17: sample_l(texture2d)(float,float,float,float) r2.xyz, r1.xyxx, t0.xyzw, s0, l(0)
18: lt r0.z, l(0), r0.z
19: if_nz r0.z
20: div r3.xy, l(0.500000, 0.500000, 0.000000, 0.000000), cb3[0].zwzz
21: add r0.zw, r1.xxxy, -r3.xxxy
22: sample_l(texture2d)(float,float,float,float) r4.xyz, r0.zwzz, t0.xyzw, s0, l(0)
23: mov r3.zw, -r3.xxxy
24: add r5.xyzw, r1.xyxy, r3.zyxw
25: sample_l(texture2d)(float,float,float,float) r6.xyz, r5.xyxx, t0.xyzw, s0, l(0)
26: add r4.xyz, r4.xyzx, r6.xyzx
27: sample_l(texture2d)(float,float,float,float) r5.xyz, r5.zwzz, t0.xyzw, s0, l(0)
28: add r4.xyz, r4.xyzx, r5.xyzx
29: add r0.zw, r1.xxxy, r3.xxxy
30: sample_l(texture2d)(float,float,float,float) r1.xyz, r0.zwzz, t0.xyzw, s0, l(0)
31: add r1.xyz, r1.xyzx, r4.xyzx
32: mul r3.xyz, r1.xyzx, l(0.250000, 0.250000, 0.250000, 0.000000)
33: mad r1.xyz, -r1.xyzx, l(0.250000, 0.250000, 0.250000, 0.000000), r2.xyzx
34: max r0.z, abs(r1.z), abs(r1.y)
35: max r0.z, r0.z, abs(r1.x)
36: mad_sat r0.z, r0.z, cb3[2].x, cb3[2].y
37: mad r0.x, r0.y, r0.x, l(-1.000000)
38: mad r0.x, r0.z, r0.x, l(1.000000)
39: dp3 r0.y, l(0.212600, 0.715200, 0.072200, 0.000000), r2.xyzx
40: dp3 r0.z, l(0.212600, 0.715200, 0.072200, 0.000000), r3.xyzx
41: max r0.w, r0.y, l(0.000100)
42: div r1.xyz, r2.xyzx, r0.wwww
43: add r0.y, -r0.z, r0.y
44: mad r0.x, r0.x, r0.y, r0.z
45: max r0.x, r0.x, l(0)
46: mul r2.xyz, r0.xxxx, r1.xyzx
47: endif
48: mov o0.xyz, r2.xyzx
49: mov o0.w, l(1.000000)
50: ret


рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА 50 рд▓рд╛рдЗрдиреЗрдВ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВред рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред

рд╢рд╛рд░реНрдк рд╡реИрд▓реНрдпреВ рдЬрдирд░реЗрд╢рди


рдкрд╣рд▓рд╛ рдХрджрдо рдЧрд╣рд░рд╛рдИ рдмрдлрд░ (рдкрдВрдХреНрддрд┐ 1) рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ "рдж рд╡рд┐рдЪрд░ 3" рдПрдХ рдФрдВрдзрд╛ рдЧрд╣рд░рд╛рдИ (1.0 - рдХрд░реАрдм, 0.0 - рджреВрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдмрд┐рдирд╛ рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдВрдзрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рд▓реЗрдЦ рджреЗрдЦреЗрдВ )ред

рд▓рд╛рдЗрдиреЗрдВ 3-6 рдЗрд╕ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЧрд╣рд░рд╛рдИ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ [1.0 - 0.0] [рдирд┐рдХрдЯ-рджреВрд░] рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде (рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕рдкрд░реНрд╕рд┐рд╡реЗрдлрд┐рдПрд╡ рд╕реНрдЯреЗрдЬ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред рд╕реНрдерд┐рд░ рдмрдлрд░ рд╕реЗ рдорд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


рдорд╛рди реж.реи рдХреЗ "рдкрд╛рд╕" рдФрд░ "рд╕реБрджреВрд░" релрежрежреж рдХреЗ рдорд╛рди рдХреЗ рдмрд╛рдж, рд╣рдо cb12_v21.xy рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

cb12_v21.y = 1.0 / near
cb12_v21.x = - (1.0 / near) + (1.0 / near) * (near / far)


TW3 рдХреЛрдб рдореЗрдВ рдХреЛрдб рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред

"рджреГрд╢реНрдпрддрд╛ рдХреЗ рдкрд┐рд░рд╛рдорд┐рдб рдХреА рдЧрд╣рд░рд╛рдИ" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓рд╛рдЗрди 7 рдкреНрд░рдХреНрд╖реЗрдк рдЧреБрдгрд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдорд╛рдиреЗ / рд╡рд┐рд░реВрдкрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рд╣рдо рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрддреГрдкреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ [0-1])ред


cb3_v1.xy рдФрд░ cb3_v2.xy - рдпрд╣ рдЫреЛрдЯреА рдФрд░ рд▓рдВрдмреА рджреВрд░реА рдкрд░ рддреАрдХреНрд╖реНрдг рдкреНрд░рднрд╛рд╡ рдХреА рдЪрдордХ рд╣реИред рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рддреАрдХреНрд╖реНрдгрддрд╛ рд╕реЗ рдмреБрд▓рд╛рдПрдВ рдФрд░ рддреЗрдЬ рдХрд░реЗрдВред рдФрд░ рдпрд╣ "рдХрдо" рдФрд░ "рдЙрдЪреНрдЪ" рдХреЗ рдмреАрдЪ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рд╣реИ, рдЬреЛ рдХрд┐ рдж рд╡рд┐рдЪрд░ 3 рдореЗрдВ рдЗрд╕ рдЖрд╢рдп рдХрд╛ рд╣реИред

рдЕрдм рдкрд░рд┐рдгрд╛рдореА рдЕрдиреБрдкрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд▓рд╛рдЗрдиреНрд╕ 8-9 рдмрд╕ lerp(sharpenNear, sharpenFar, interpolationCoeff) ред рдпрд╣ рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рдЧреЗрд░рд╛рд▓реНрдЯ рдХреЗ рдкрд╛рд╕ рдФрд░ рдЙрд╕рд╕реЗ рджреВрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрдордХ рдорд┐рд▓рддреА рд╣реИред рдПрдХ рдмрд╛рд░ рджреЗрдЦ рд▓реЛ:


рд╢рд╛рдпрдж рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА (2.177151) рдХреЗ рдмрдЧрд▓ рдореЗрдВ рддреЗрдЬ рдЪрдордХ рдХреА рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХреНрд╖реЗрдк рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рднрд╛рд╡ рдЪрдордХ рдмрд╣реБрдд рджреВрд░ (1.91303) рд╣реИред рдЗрд╕ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж, рд╣рдо 1.0 рдХреЛ рдЪрдордХ (рдкрдВрдХреНрддрд┐ 10) рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдСрдкрд░реЗрд╢рди lerp рдиреЗ рд╣рдореЗрдВ 0.0 рджрд┐рдпрд╛ред 1.0 рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ 1.0 рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдкреИрдирд╛рдкрди рдХрд░рддреЗ рд╕рдордп рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдкрдврд╝реЗрдВред

рддреЗрдЬ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЖрдХрд╛рд╢ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд╢рд░реНрдд рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

// sharpen
float fSkyboxTest = (fDepth >= 1.0) ? 0 : 1;


рдж рд╡рд┐рдЪрд░ 3 рдореЗрдВ, рдЖрдХрд╛рд╢ рдХреА рдкрд┐рдХреНрд╕реЗрд▓ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдорд╛рди 1.0 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдмрд╛рдЗрдирд░реА рдлрд╝рд┐рд▓реНрдЯрд░" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд░рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред

рдЕрдм рд╣рдо "рд╕реНрдХрд╛рдИ рдлрд┐рд▓реНрдЯрд░" рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдЪрдордХ рдХреЛ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рдпрд╣ рдЧреБрдгрди рдкрдВрдХреНрддрд┐ 13 рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╢реЗрдбрд░ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

// sharpen
float fSharpenAmount = fSharpenIntensity * fSkyboxTest;


рдкрд┐рдХреНрд╕реЗрд▓ рдирдореВрдирд╛ рдХреЗрдВрджреНрд░


SV_Position рдХрд╛ рдПрдХ рдкрд╣рд▓реВ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛: рдПрдХ рдЖрдзрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдСрдлрд╕реЗрдЯ ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдКрдкрд░реА рдмрд╛рдПрдБ рдХреЛрдиреЗ (0, 0) рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ SV_Position.xy рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0, 0) рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди (0.5, 0.5) рд╣реИред рд╡рд╛рд╣!

рдпрд╣рд╛рдВ рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рдирдореВрдирд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдП 14-16 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

// .
// "" SV_Position.xy.
float2 uvCenter = trunc( Input.Position.xy );

// ,
uvCenter += float2(0.5, 0.5);
uvCenter /= g_Viewport.xy


рдФрд░ рдмрд╛рдж рдореЗрдВ, рд╣рдо рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ "рдпреВрд╡реАрдХреЗрдВрдЯрд░" рд╕реЗ рдЗрдирдкреБрдЯ рд░рдВрдЧ рдХреА рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдирдореВрдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо "рд╕рд╛рдорд╛рдиреНрдп" рд╡рд┐рдзрд┐ (SV_Position.xy / ViewportSize.xy) рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

рддреЗрдЬ рдХрд░рдирд╛ рдпрд╛ рди рдХрд░рдирд╛


рдкреИрдирд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрдгрдп fSharpenAmount рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

//
float3 colorCenter = TexColorBuffer.SampleLevel( samplerLinearClamp, uvCenter, 0 ).rgb;

//
float3 finalColor = colorCenter;

if ( fSharpenAmount > 0 )
{
// sharpening...
}

return float4( finalColor, 1 );


рдкреИрдирд╛


рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИ:

- рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдХреЛрдиреЛрдВ рдкрд░ рдЪрд╛рд░ рдмрд╛рд░ рдЗрдирдкреБрдЯ рд░рдВрдЧ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рдирдореВрдиреЗ,

- рдирдореВрдиреЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдФрд╕рдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ,

- "рдХреЗрдВрджреНрд░" рдФрд░ "рдХреЛрдиреЗ рдПрд╡рд░реЗрдЬ" рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:

- рдЕрдВрддрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдирд┐рд░рдкреЗрдХреНрд╖ рдШрдЯрдХ рдкрд╛рддрд╛ рд╣реИ,

- рдЕрдзрд┐рдХрддрдо рдХреЛ рд╕рд╣реА рдХрд░рддрд╛ рд╣реИред рдкреЗрдЯред рдкреИрдорд╛рдиреЗ + рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдШрдЯрдХ,

- рдЕрдзрд┐рдХрддрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреА рдорд╛рддреНрд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреЗрдЯред рдЕрдВрдЧ

- "CenterColor" рдФрд░ "averageColor" рдХреЗ рд▓рд┐рдП рдЪрдордХ рдореВрд▓реНрдп (рд▓реВрдорд╛) рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ,

- рд░рдВрдЧрдХрд░реНрдореА рдХреЛ рдЙрд╕рдХреЗ рд▓реВрдорд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ,

- рдкреНрд░рднрд╛рд╡ рдХреА рднрдпрд╛рд╡рд╣рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдП, рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рд▓реВрдорд╛ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ,

- рдирдП рд▓реВрдорд╛ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд▓рд░рдХреЗрдВрдЯрд░ рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВред

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

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

рдпрд╣ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдЫрд╡рд┐ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдХрд▓рд╛рдХрд╛рд░ рдХрд╛ рдХреМрд╢рд▓ рд╕реНрддрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИ ):


Shader рдореЗрдВ рд╕рднреА рдкрдврд╝рддреЗ рд╣реИрдВ рдмрд┐рд▓рд┐рдирд┐рдпрд░ рд╕реИрдВрдкрд▓рд┐рдВрдЧ (D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT)ред

рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдг рдкрд░ рдХреЗрдВрджреНрд░ рд╕реЗ рдСрдлрд╕реЗрдЯ (0.5,, 0.5) рд╣реИ, рдЬреЛ рдХреЛрдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕реЗ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЖрдЗрдП рджреЗрдЦреЗрдВ:

float2 uvCorner;
float2 uvOffset = float2( 0.5, 0.5 ) / g_Viewport.xy; // remember about division!

float3 colorCorners = 0;

//
// -0,5, -0.5
uvCorner = uvCenter - uvOffset;
colorCorners += TexColorBuffer.SampleLevel( samplerLinearClamp, uvCorner, 0 ).rgb;

//
// +0.5, -0.5
uvCorner = uvCenter + float2(uvOffset.x, -uvOffset.y);
colorCorners += TexColorBuffer.SampleLevel( samplerLinearClamp, uvCorner, 0 ).rgb;

//
// -0.5, +0.5
uvCorner = uvCenter + float2(-uvOffset.x, uvOffset.y);
colorCorners += TexColorBuffer.SampleLevel( samplerLinearClamp, uvCorner, 0 ).rgb;

//
// +0.5, +0.5
uvCorner = uvCenter + uvOffset;
colorCorners += TexColorBuffer.SampleLevel( samplerLinearClamp, uvCorner, 0 ).rgb;


рддреЛ, рдЕрдм рд╕рднреА рдЪрд╛рд░ рдирдореВрдиреЛрдВ рдХреЛ "colorCorners" рдЪрд░ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:

//
float3 averageColorCorners = colorCorners / 4.0;

//
float3 diffColor = colorCenter - averageColorCorners;

// . . RGB-
float fDiffColorMaxComponent = max( abs(diffColor.x), max( abs(diffColor.y), abs(diffColor.z) ) );

//
float fDiffColorMaxComponentScaled = saturate( fDiffColorMaxComponent * sharpenLumScale + sharpenLumBias );

// .
// "1.0" - fSharpenIntensity 1.0.
float fPixelSharpenAmount = lerp(1.0, fSharpenAmount, fDiffColorMaxComponentScaled);

// "" .
float lumaCenter = dot( LUMINANCE_RGB, finalColor );
float lumaCornersAverage = dot( LUMINANCE_RGB, averageColorCorners );

// "centerColor"
float3 fColorBalanced = colorCenter / max( lumaCenter, 1e-4 );

//
float fPixelLuminance = lerp(lumaCornersAverage, lumaCenter, fPixelSharpenAmount);

//
finalColor = fColorBalanced * max(fPixelLuminance, 0.0);
}

return float4(finalColor, 1.0);


рдЕрдзрд┐рдХрддрдо рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдПрдЬ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдкреЗрдЯред рдЕрдВрддрд░ рдШрдЯрдХред рд╕реНрдорд╛рд░реНрдЯ рдЪрд╛рд▓! рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рджреЗрдЦреЗрдВ:


рдЕрдВрддрд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдирд┐рд░рдкреЗрдХреНрд╖ рдШрдЯрдХ рдХрд╛ рджреГрд╢реНрдпред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рддреИрдпрд╛рд░ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд╢реЗрдбрд░ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдмрд╣реБрдд рдЧрд░реАрдм рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдЖрдк рдореЗрд░реЗ HLSLexplorer рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдЧреЗрдо рдореЗрдВ рд╕рдорд╛рди рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ!

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: The Witcher 3 sharpness shader рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ fPixelSharpenAmount 1.0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ! рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ ...)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рднрд╛рд╡ рдХреА рдЪрдордХ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рдирд┐рдХрдЯ / рджреВрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЪрдордХ рд╣реИред рдЗрд╕ рдЦреЗрд▓ рдореЗрдВ, рд╡реЗ рдирд┐рд░рдВрддрд░ рдирд╣реАрдВ рд╣реИрдВ; рдореИрдВрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рд╣реИрдВ:

рд╕реНрдХреЗрд▓рд┐рдЧ:

sharpenNearsharpenFarsharpenDistanceScalesharpenDistanceBiassharpenLumScalesharpenLumBias
рдХрдо
рдЙрдЪреНрдЪ2.01.80.025
-0.25
-резрей.рейрей,рейрейрей
1.33333

рдХрд╛рдпрд░ рдореЛрд░реЗрди:

sharpenNear
sharpenFar
sharpenDistanceScale
sharpenDistanceBias
sharpenLumScale
sharpenLumBias
рдХрдо
.релрен,ренрелрез
.рейрез,рейрежрей
.режрем,ремремрел
-.рейрей,реирелрем
-1.0
2.0
рдЙрдЪреНрдЪ
реи.резрен,ренрелрез
рез.репрез,рейрежрей
.режрем,ремремрел
-.рейрей,реирелрем
-1.0
2.0

рднрд╛рдЧ 7. рдФрд╕рдд рдЪрдордХ


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

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

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

рдЪрдордХ рд╡рд┐рддрд░рдг


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


рдЖрдЗрдП рдЗрд╕ рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рджреЗрдЦреЗрдВред рдЙрд╕реЗ рджреЛ рдмрдирд╛рд╡рдЯ рдЪрд╛рд╣рд┐рдП:

1) рдПрдЪрдбреАрдЖрд░ рдХрд▓рд░ рдмрдлрд░, рдЬрд┐рд╕рдХрд╛ рд╕реНрдХреЗрд▓ 1/4 x 1/4 рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1920x1080 рд╕реЗ 480x27070),

2) рдлреБрд▓рд╕реНрдХреНрд░реАрди рдбреЗрдкреНрде рдмрдлрд░


1/4 x 1/4 HDR рд░рдВрдЧ рдмрдлрд░ред рдЯреНрд░рд┐рдХреА рдЯреНрд░рд┐рдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдмрдлрд░ рдПрдХ рдмрдбрд╝реЗ рдмрдлрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдмрдлрд░реНрд╕ тАЛтАЛрдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред


рдлреБрд▓рд╕реНрдХреНрд░реАрди рдбреЗрдкреНрде рдмрдлрд░

рдХрд▓рд░ рдмрдлрд░ рдХреЛ рдЬрд╝реВрдо рдЖрдЙрдЯ рдХреНрдпреЛрдВ рдХрд░реЗрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдЗрд╕ рдкрд╛рд╕ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрд┐рдд рдмрдлрд░ рд╣реИред 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ 256 рддрддреНрд╡ рдкреНрд░рддреНрдпреЗрдХред

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

рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдФрд╕рдд рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рд╕рдВрд░рдЪрд┐рдд рдмрдлрд░ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ClearUnorderedAccessViewUint рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ shader рдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ (рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдкрд╣рд▓рд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ shader рд╣реИ!)

cs_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[3], immediateIndexed
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t1
dcl_uav_structured u0, 4
dcl_input vThreadGroupID.x
dcl_input vThreadIDInGroup.x
dcl_temps 6
dcl_tgsm_structured g0, 4, 256
dcl_thread_group 64, 1, 1
0: store_structured g0.x, vThreadIDInGroup.x, l(0), l(0)
1: iadd r0.xyz, vThreadIDInGroup.xxxx, l(64, 128, 192, 0)
2: store_structured g0.x, r0.x, l(0), l(0)
3: store_structured g0.x, r0.y, l(0), l(0)
4: store_structured g0.x, r0.z, l(0), l(0)
5: sync_g_t
6: ftoi r1.x, cb0[2].z
7: mov r2.y, vThreadGroupID.x
8: mov r2.zw, l(0, 0, 0, 0)
9: mov r3.zw, l(0, 0, 0, 0)
10: mov r4.yw, l(0, 0, 0, 0)
11: mov r1.y, l(0)
12: loop
13: utof r1.z, r1.y
14: ge r1.z, r1.z, cb0[0].x
15: breakc_nz r1.z
16: iadd r2.x, r1.y, vThreadIDInGroup.x
17: utof r1.z, r2.x
18: lt r1.z, r1.z, cb0[0].x
19: if_nz r1.z
20: ld_indexable(texture2d)(float,float,float,float) r5.xyz, r2.xyzw, t0.xyzw
21: dp3 r1.z, r5.xyzx, l(0.212600, 0.715200, 0.072200, 0.000000)
22: imul null, r3.xy, r1.xxxx, r2.xyxx
23: ld_indexable(texture2d)(float,float,float,float) r1.w, r3.xyzw, t1.yzwx
24: eq r1.w, r1.w, cb0[2].w
25: and r1.w, r1.w, cb0[2].y
26: add r2.x, -r1.z, cb0[2].x
27: mad r1.z, r1.w, r2.x, r1.z
28: add r1.z, r1.z, l(1.000000)
29: log r1.z, r1.z
30: mul r1.z, r1.z, l(88.722839)
31: ftou r1.z, r1.z
32: umin r4.x, r1.z, l(255)
33: atomic_iadd g0, r4.xyxx, l(1)
34: endif
35: iadd r1.y, r1.y, l(64)
36: endloop
37: sync_g_t
38: ld_structured r1.x, vThreadIDInGroup.x, l(0), g0.xxxx
39: mov r4.z, vThreadIDInGroup.x
40: atomic_iadd u0, r4.zwzz, r1.x
41: ld_structured r1.x, r0.x, l(0), g0.xxxx
42: mov r0.w, l(0)
43: atomic_iadd u0, r0.xwxx, r1.x
44: ld_structured r0.x, r0.y, l(0), g0.xxxx
45: atomic_iadd u0, r0.ywyy, r0.x
46: ld_structured r0.x, r0.z, l(0), g0.xxxx
47: atomic_iadd u0, r0.zwzz, r0.x
48: ret


рдФрд░ рдПрдХ рдирд┐рд░рдВрддрд░ рдмрдлрд░:


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

рдбрд┐рд╕реНрдкреИрдЪ (270, 1, 1) - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо 270 рдереНрд░реЗрдб рд╕рдореВрд╣ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рд╣рдо рд░рдВрдЧ рдмрдлрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдзрд╛рдЧреЗ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЪрд▓рд╛рддреЗ рд╣реИрдВред


рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рд╕рдореВрд╣ HDR рд░рдВрдЧ рдмрдлрд╝рд░ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ

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

рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рд╕рдореВрд╣ рдореЗрдВ X рджрд┐рд╢рд╛ рдореЗрдВ 64 рдереНрд░реЗрдбреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (dcl_thread_group 64, 1, 1), рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА, 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде 256 рддрддреНрд╡ (dcl_tgsm_structured g0, 4, 256)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ shader рдореЗрдВ рд╣рдо SV_GroupThreadID (vThreadIDInGroup.x) [0-63] рдФрд░ SV_GroupID (vThreadGroupID.x) [0-269] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

1) рд╣рдо рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдХреБрд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рддрд┐ рддрддреНрд╡ 256 рддрддреНрд╡ рдФрд░ 64 рдереНрд░реЗрдбреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реВрдк рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

// - .
// 64 , 4 .
[unroll] for (uint idx=0; idx < 4; idx++)
{
const uint offset = threadID + idx*64;
shared_data[ offset ] = 0;
}


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

3) рдЕрдм рд╣рдо рдПрдХ рд▓реВрдк рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

// cb0_v0.x - . 1920x1080 1920/4 = 480;
float ViewportSizeX = cb0_v0.x;
[loop] for ( uint PositionX = 0; PositionX < ViewportSizeX; PositionX += 64 )
{
...


рдпрд╣ 64 рдХреЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╣реИ (рдХреНрдпрд╛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпреЛрдВ?)ред

рдЕрдЧрд▓рд╛ рдХрджрдо рд▓реЛрдб рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред

рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред

Y рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП, рд╣рдо SV_GroupID.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ 270 рдереНрд░реЗрдб рд╕рдореВрд╣ рд▓реЙрдиреНрдЪ рдХрд┐рдП рд╣реИрдВред

рдПрдХреНрд╕ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП, рд╣рдо ... рд╡рд░реНрддрдорд╛рди рд╕рдореВрд╣ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ! рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдореЗрдВ 64 рдзрд╛рдЧреЗ рд╣реИрдВ, рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рдзрд╛рдЧрд╛ рд╕рдореВрд╣ (0, 0, 0) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

- рдзрд╛рд░рд╛ (0, 0, 0) рдкрд┐рдХреНрд╕рд▓ (0, 0), (64, 0), (128, 0), (192, 0), (256, 0), (320, 0), (384) рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧреАред 0), (448,0)ред

- рдереНрд░реЗрдб (1, 0, 0) рдкрд┐рдХреНрд╕рд▓ (1, 0), (65, 0), (129, 0), (193, 0), (257, 0), (321, 0), (385,) рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ред 0), (449, 0) ...

- рдзрд╛рд░рд╛ (63, 0, 0) рдкрд┐рдХреНрд╕рд▓ (63, 0), (127, 0), (191, 0), (255, 0), (319, 0), (383, 0), (447) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреАред 0)

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд╣рдореЗрдВ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд░рдВрдЧ рдмрдлрд░ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд▓реЛрдб рди рдХрд░реЗрдВ:

// X. Y GroupID.
uint CurrentPixelPositionX = PositionX + threadID;
uint CurrentPixelPositionY = groupID;
if ( CurrentPixelPositionX < ViewportSizeX )
{
// HDR- .
// HDR- , .
uint2 colorPos = uint2(CurrentPixelPositionX, CurrentPixelPositionY);
float3 color = texture0.Load( int3(colorPos, 0) ).rgb;
float luma = dot(color, LUMA_RGB);


рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ? рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ!

рдореИрдВрдиреЗ рдЪрдордХ (рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдХреА рд▓рд╛рдЗрди 21) рдХреА рднреА рдЧрдгрдирд╛ рдХреАред

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

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдкреВрд░реНрдг рд╕рдВрдХрд▓реНрдк рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рдмрдлрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ - рдмрд╕ рдХреБрдЫ рд╕реНрдерд┐рд░ (cb0_v2.z) рджреНрд╡рд╛рд░рд╛ рд░рдВрдЧ рдЬрдорд╛ рдХрд░реЗрдВред рд╣рдордиреЗ рдЪрд╛рд░ рдмрд╛рд░ рдПрдЪрдбреАрдЖрд░ рдХрд▓рд░ рдмрдлрд░ рдбрд╛рдЙрди рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП рдореВрд▓реНрдп 4 рд╣реИ!

const int iDepthTextureScale = (int) cb0_v2.z;
uint2 depthPos = iDepthTextureScale * colorPos;
float depth = texture1.Load( int3(depthPos, 0) ).x;


рдЕрдм рддрдХ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ! рд▓реЗрдХрд┐рди ... рд╣рдо 24-25 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ ...

24: eq r2.x, r2.x, cb0[2].w
25: and r2.x, r2.x, cb0[2].y


So. рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдорд╛рдирддрд╛ рдХреА рддреБрд▓рдирд╛ рд╣реИ , рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо r2.x рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдареАрдХ рдмрд╛рдж рдЬрд╛рддрд╛ рд╣реИ ... рдХреНрдпрд╛? рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдПрдВрдб ?? рдЧрдВрднреАрд░рддрд╛ рд╕реЗ? рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдорд╛рди рдХреЗ рд▓рд┐рдП? рдпреЗ рдХреНрдпрд╛ ???

'Eq + рдФрд░' рд╕рдорд╕реНрдпрд╛

рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ред рдореИрдВ рднреА рдЕрдЬреАрдм asint / asfloat рд╕рдВрдпреЛрдЬрди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА ...

рдФрд░ рдЕрдЧрд░ рдЖрдк рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдлреНрд▓реЛрдЯ-рдлреНрд▓реЛрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред

float DummyPS() : SV_Target0
{
float test = (cb0_v0.x == cb0_v0.y);
return test;
}


рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

0: eq r0.x, cb0[0].y, cb0[0].x
1: and o0.x, r0.x, l(0x3f800000)
2: ret


рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╣реИ рдирд╛? рдореБрдЭреЗ рдпрд╣рд╛рдВ "рдФрд░" рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред

0x3f800000 рд╕рд┐рд░реНрдл 1.0f рд╣реИ ... рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо 1.0 рдФрд░ 0.0 рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЕрдиреНрдпрдерд╛ рдпрджрд┐ рддреБрд▓рдирд╛ рд╕рдлрд▓ рд╣реЛрддреА рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо 1.0 рдХреЛ рдХреБрдЫ рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде "рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд" рдХрд░реЗрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

float DummyPS() : SV_Target0
{
float test = (cb0_v0.x == cb0_v0.y) ? cb0_v0.z : 0.0;
return test;
}


рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

0: eq r0.x, cb0[0].y, cb0[0].x
1: and o0.x, r0.x, cb0[0].z
2: ret


рд╣рд╛! рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдпрд╣ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЬрд╛рджреВ рдорд╛рддреНрд░ рд╣реИред рдиреЛрдЯ: рдпрджрд┐ рдЖрдк 0.0 рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ movc рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рдЖрдЗрдП рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбрд░ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЕрдЧрд▓рд╛ рдХрджрдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЧрд╣рд░рд╛рдИ cb0_v2.w рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ 0.0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ - рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдПрдХ рджреВрд░ рдХреЗ рд╡рд┐рдорд╛рди (рдЖрдХрд╛рд╢ рдореЗрдВ) рдкрд░ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдХреБрдЫ рдорд╛рди рджреЗрддреЗ рд╣реИрдВ, рд▓рдЧрднрдЧ 0.5 (рдореИрдВрдиреЗ рдХрдИ рдлрд╝реНрд░реЗрдореЛрдВ рдкрд░ рдЬрд╛рдВрдЪ рдХреА)ред

рдЗрд╕ рдЧрдгрдирд╛ рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдВрдЧ рдХреА рдЪрдордХ рдФрд░ "рдЖрдХрд╛рд╢" рдХреА рдЪрдордХ (cb0_v2.x рдорд╛рди, рдЬреЛ рдкреНрд░рд╛рдпрдГ 0.0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдФрд╕рдд рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдЖрдХрд╛рд╢ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдорд╣рддреНрд╡ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╣реБрдд рдЪрддреБрд░ рд╡рд┐рдЪрд╛рд░ред

// , ( ). , ,
// .
float value = (depth == cb0_v2.w) ? cb0_v2.y : 0.0;

// 'value' 0.0, lerp 'luma'. 'value'
// ( 0.50), luma . (cb0_v2.x 0.0).
float lumaOk = lerp( luma, cb0_v2.x, value );


рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ lumaOk рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рддрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рд╣рдо рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ lumaOk 0.0 рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд▓реЙрдЧ (0) рдХрд╛ рдорд╛рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо 1.0 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧ (1) = 0.0 рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо 256 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЗрд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рд▓рдШреБрдЧрдгрдХ рдХреЛ 128 рддрдХ рдорд╛рдкрддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╣реЛрд╢рд┐рдпрд╛рд░!

рдФрд░ рдпрд╣ рдпрд╣рд╛рдБ рд╕реЗ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рди 88.722839 рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ 128 * (2) ред

рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд▓реЙрдЧрд░рд┐рдердо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

HLSL рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ: рд▓реЙрдЧ , рдФрд░ рдЗрд╕рдХрд╛ рдЖрдзрд╛рд░ 2 рд╣реИред

// , lumaOk 0.0.
// log(0) undefined
// log(1) = 0.
//
lumaOk = log(lumaOk + 1.0);

// 128
lumaOk *= 128;


рдЕрдВрдд рдореЗрдВ, рд╣рдо рд▓рдШреБрдЧрдгрдХреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдЪрдордХ рд╕реЗ рд╕реЗрд▓ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд▓ рдореЗрдВ 1 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

// . Uint, 256 ,
// , .
uint uLuma = (uint) lumaOk;
uLuma = min(uLuma, 255);

// 1 .
InterlockedAdd( shared_data[uLuma], 1 );


рдЕрдЧрд▓рд╛ рдЪрд░рдг рдлрд┐рд░ рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд░реЛрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдФрд░ рдЕрдВрддрд┐рдо рдЪрд░рдг рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдмрдлрд░ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕реА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

// ,
GroupMemoryBarrierWithGroupSync();

// .
[unroll] for (uint idx = 0; idx < 4; idx++)
{
const uint offset = threadID + idx*64;

uint data = shared_data[offset];
InterlockedAdd( g_buffer[offset], data );
}


рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдореЗрдВ рдереНрд░реЗрдб рд╕рдореВрд╣ рдореЗрдВ рд╕рднреА 64 рдереНрд░реЗрдбреНрд╕ рднрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рдореЗрдВ 4 рдорд╛рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЪрд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдмрдлрд╝рд░ рдореЗрдВ рд╕рднреА рдорд╛рдиреЛрдВ рдХрд╛ рдпреЛрдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ! (480x270 = 129,600 рдкрд░)ред рдпрд╣реА рд╣реИ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрдордХ рдореВрд▓реНрдп рд╣реИред

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

рд╡рд╣ рд╕рдм рд╣реИ! рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЗрд╕ Witcher 3 рдЪрдордХ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдЗрд╕ рднрд╛рдЧ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛ред рд╕реАрдбреА рдкреНрд░рдЬреЗрдХрдЯ рд░реЗрдб рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдмрдзрд╛рдИ!

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

рдФрд╕рдд рдЪрдордХ рдЧрдгрдирд╛


рдпрд╣ "рдж рд╡рд┐рдЪрд░ 3: рд╡рд╛рдЗрд▓реНрдб рд╣рдВрдЯ" рдореЗрдВ рдордзреНрдпрдо рдЪрдордХ рдЧрдгрдирд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╣реИред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдПрдХ рдФрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдЬрд╛рдПрдВ, рдЪрд▓реЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЛрд╣рд░рд╛рдПрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛: рд╣рдордиреЗ рдПрдЪрдбреАрдЖрд░ рд░рдВрдЧ рдмрдлрд░ рдХреЗ рд╕рд╛рде 1 / 4x1 / 4 рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред рдкрд╣рд▓реА рдкрд╛рд╕ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдЪрдордХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо (256 рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХрд╛ рд╕рдВрд░рдЪрд┐рдд рдмрдлрд░) рдорд┐рд▓рд╛ред рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЪрдордХ рдХреЗ рд▓рд┐рдП рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХреА, рдЗрд╕реЗ 256 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рд╕рдВрд░рдЪрд┐рдд рдмрдлрд░ рдХреЗ рд╕рдВрдЧрдд рдореВрд▓реНрдп рдХреЛ 1 рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдмрдврд╝рд╛ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЗрди 256 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рднреА рдорд╛рдиреЛрдВ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред


рдкрд╣рд▓реЗ рдкрд╛рд╕ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред 256 рддрддреНрд╡ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдлреБрд▓-рд╕реНрдХреНрд░реАрди рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ 1920x1080 рд╣реИред рдЬрд╝реВрдо рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реЗ рдкрд╛рд╕ рдореЗрдВ 480x270 рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмрдлрд░ рдореЗрдВ рд╕рднреА 256 рдорд╛рдиреЛрдВ рдХрд╛ рдпреЛрдЧ 480 * 270 = 129 600 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

рдЗрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ: рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред

рдЗрд╕ рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдбрд┐рд╕реНрдкреИрдЪ (1, 1, 1))ред

рдЖрдЗрдП рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ shader рдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

cs_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[1], immediateIndexed
dcl_uav_structured u0, 4
dcl_uav_typed_texture2d (float,float,float,float) u1
dcl_input vThreadIDInGroup.x
dcl_temps 4
dcl_tgsm_structured g0, 4, 256
dcl_thread_group 64, 1, 1
0: ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r0.x, vThreadIDInGroup.x, l(0), u0.xxxx
1: store_structured g0.x, vThreadIDInGroup.x, l(0), r0.x
2: iadd r0.xyz, vThreadIDInGroup.xxxx, l(64, 128, 192, 0)
3: ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r0.w, r0.x, l(0), u0.xxxx
4: store_structured g0.x, r0.x, l(0), r0.w
5: ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r0.x, r0.y, l(0), u0.xxxx
6: store_structured g0.x, r0.y, l(0), r0.x
7: ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r0.x, r0.z, l(0), u0.xxxx
8: store_structured g0.x, r0.z, l(0), r0.x
9: sync_g_t
10: if_z vThreadIDInGroup.x
11: mul r0.x, cb0[0].y, cb0[0].x
12: ftou r0.x, r0.x
13: utof r0.y, r0.x
14: mul r0.yz, r0.yyyy, cb0[0].zzwz
15: ftoi r0.yz, r0.yyzy
16: iadd r0.x, r0.x, l(-1)
17: imax r0.y, r0.y, l(0)
18: imin r0.y, r0.x, r0.y
19: imax r0.z, r0.y, r0.z
20: imin r0.x, r0.x, r0.z
21: mov r1.z, l(-1)
22: mov r2.xyz, l(0, 0, 0, 0)
23: loop
24: breakc_nz r2.x
25: ld_structured r0.z, r2.z, l(0), g0.xxxx
26: iadd r3.x, r0.z, r2.y
27: ilt r0.z, r0.y, r3.x
28: iadd r3.y, r2.z, l(1)
29: mov r1.xy, r2.yzyy
30: mov r3.z, r2.x
31: movc r2.xyz, r0.zzzz, r1.zxyz, r3.zxyz
32: endloop
33: mov r0.w, l(-1)
34: mov r1.yz, r2.yyzy
35: mov r1.xw, l(0, 0, 0, 0)
36: loop
37: breakc_nz r1.x
38: ld_structured r2.x, r1.z, l(0), g0.xxxx
39: iadd r1.y, r1.y, r2.x
40: utof r2.x, r2.x
41: utof r2.w, r1.z
42: add r2.w, r2.w, l(0.500000)
43: mul r2.w, r2.w, l(0.011271)
44: exp r2.w, r2.w
45: add r2.w, r2.w, l(-1.000000)
46: mad r3.z, r2.x, r2.w, r1.w
47: ilt r2.x, r0.x, r1.y
48: iadd r2.w, -r2.y, r1.y
49: itof r2.w, r2.w
50: div r0.z, r3.z, r2.w
51: iadd r3.y, r1.z, l(1)
52: mov r0.y, r1.z
53: mov r3.w, r1.x
54: movc r1.xzw, r2.xxxx, r0.wwyz, r3.wwyz
55: endloop
56: store_uav_typed u1.xyzw, l(0, 0, 0, 0), r1.wwww
57: endif
58: ret


рдПрдХ рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╣реИ:


рдЖрдЗрдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: рджреЛ рдпреВрдПрд╡реА рд╕рдВрд▓рдЧреНрди рд╣реИрдВ (u0: рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдЗрдирдкреБрдЯ рдмрдлрд░ рдФрд░ u1: 1x1 R32_FLOAT рдкреНрд░рд╛рд░реВрдк рдХреА рдЖрдЙрдЯрдкреБрдЯ рдмрдирд╛рд╡рдЯ)ред рд╣рдо рдпрд╣ рднреА рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддрд┐ рд╕рдореВрд╣ 64 рдзрд╛рдЧреЗ рдФрд░ 4-рдмрд╛рдЗрдЯ рд╕рд╛рдЭрд╛ рд╕рдореВрд╣ рдореЗрдореЛрд░реА рдХреЗ 256 рддрддреНрд╡ рд╣реИрдВред

рд╣рдо рдЗрдирдкреБрдЯ рдмрдлрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЛ рднрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 64 рдзрд╛рдЧреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

// - .
// 64 , 4
// .
[unroll] for (uint idx=0; idx < 4; idx++)
{
const uint offset = threadID + idx*64;
shared_data[ offset ] = g_buffer[offset];
}
// , ,
// .
GroupMemoryBarrierWithGroupSync();


рд╕рднреА рдЧрдгрдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдиреНрдп рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдлрд░ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

"рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ" рд╕реНрдЯреНрд░реАрдо рдореЗрдВ 0. рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреНрдпреЛрдВ рд╣реИ? рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЕрдВрддрд░рд╛рд▓ [0-63] рд╕реЗ рдХрд┐рд╕реА рднреА рдзрд╛рд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 0 рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдкреВрд░реНрдгрд╛рдВрдХ-рдкреВрд░реНрдгрд╛рдВрдХ рддреБрд▓рдирд╛ ( рдпрд╛рдиреА рдирд┐рд░реНрджреЗрд╢) рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рдВрдХреЗрдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрдВрдХреНрддрд┐ 11 рдореЗрдВ, рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреМрдбрд╝рд╛рдИ * рдХреА рдКрдБрдЪрд╛рдИ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ [0.0f-1.0f], рдЬреЛ рдЕрдВрддрд░рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЖрдЧреЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ 0 <= Start <= End <= totalPixels - 1 :

// 0.
[branch] if (threadID == 0)
{
//
uint totalPixels = cb0_v0.x * cb0_v0.y;

// (, , ),
// .
int pixelsToConsiderStart = totalPixels * cb0_v0.z;
int pixelsToConsiderEnd = totalPixels * cb0_v0.w;

int pixelsMinusOne = totalPixels - 1;

pixelsToConsiderStart = clamp( pixelsToConsiderStart, 0, pixelsMinusOne );
pixelsToConsiderEnd = clamp( pixelsToConsiderEnd, pixelsToConsiderStart, pixelsMinusOne );


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдиреАрдЪреЗ рджреЛ рдЪрдХреНрд░ рд╣реИрдВред рдЙрдирдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ (рдпрд╛ рдЙрдирдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде) рдпрд╣ рд╣реИ рдХрд┐ рдЫреЛрд░реЛрдВ рдХреЗ рдЫреЛрд░ рдкрд░ рдЕрдЬреАрдм рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдкрдВрдХреНрддрд┐ 21 рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред "-1" рдХреНрдпреЛрдВ рд╣реИ? рдореИрдВ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдиреАрдЪреЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред

рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдХрд╛ рдХрд╛рд░реНрдп PixToConsiderStart рдХреЛ рддреНрдпрд╛рдЧрдирд╛ рдФрд░ рд╣рдореЗрдВ рдмрдлрд░ рд╕реЗрд▓ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рджреЗрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ PixToConsiderStart +1 рдореМрдЬреВрдж рд╣реИ (рд╕рд╛рде рд╣реА рдкрд┐рдЫрд▓реЗ рдХрдХреНрд╖реЛрдВ рдореЗрдВ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛)ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ PixToConsiderStart рд▓рдЧрднрдЧ 30,000 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ рдмрдлрд░ рдореЗрдВ рд╕реЗрд▓ рдореЗрдВ "рд╢реВрдиреНрдп" рдореЗрдВ 37,000 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИрдВ (рдпрд╣ рд░рд╛рдд рдореЗрдВ рдЧреЗрдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓рдЧрднрдЧ 30001 рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдЪрдордХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реЗрд▓ "рд╢реВрдиреНрдп" рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рддреБрд░рдВрдд рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╢реБрд░реБрдЖрддреА рдЗрдВрдбреЗрдХреНрд╕ '0' рдФрд░ рдЬреАрд░реЛ рдбрд┐рд╕реНрдХреНрд▓реЛрдЬреНрдб рдкрд┐рдХреНрд╕рд▓ рдорд┐рд▓рддрд╛ рд╣реИред

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

//
int numProcessedPixels = 0;

// [0-255]
int lumaValue = 0;

//
bool bExitLoop = false;

// - "pixelsToConsiderStart" .
// lumaValue, .
[loop]
while (!bExitLoop)
{
// .
uint numPixels = shared_data[lumaValue];

// , lumaValue
int tempSum = numProcessedPixels + numPixels;

// , pixelsToConsiderStart, .
// , lumaValue.
// , pixelsToConsiderStart - "" , , .
[flatten]
if (tempSum > pixelsToConsiderStart)
{
bExitLoop = true;
}
else
{
numProcessedPixels = tempSum;
lumaValue++;
}
}


рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐ 21 рд╕реЗ рд░рд╣рд╕реНрдпрдордп рд╕рдВрдЦреНрдпрд╛ "-1" рд▓реВрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ (рдореИрдВрдиреЗ рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рдмрд╛рдж рд▓рдЧрднрдЧ рдЗрд╕реЗ рдЦреЛрдЬ рд▓рд┐рдпрд╛ рдерд╛)ред

LumaValue рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдФрд░ рд╕реНрд╡рдпрдВ LumaValue рд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреВрд╕рд░реЗ рдЪрдХреНрд░ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╣рдо рдкрд╣рд▓реЗ рд▓реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП lumaValue рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

float finalAvgLuminance = 0.0f;

//
uint numProcessedPixelStart = numProcessedPixels;

// - .
// , , lumaValue.
// [0-255], , , ,
// pixelsToConsiderEnd.
// .
bExitLoop = false;
[loop]
while (!bExitLoop)
{
// .
uint numPixels = shared_data[lumaValue];

//
numProcessedPixels += numPixels;

// , [0-255] (uint)
uint encodedLumaUint = lumaValue;

//
float numberOfPixelsWithCurrentLuma = numPixels;

// , [0-255] (float)
float encodedLumaFloat = encodedLumaUint;


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдордиреЗ рдЕрдВрддрд░рд╛рд▓ [0.0f-255.f] рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рдЪрдордХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред

рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЖрдкрдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЪрд░рдг рдХреА рдЧрдгрдирд╛ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рджреЛрд╣рд░рд╛рд╡:

float luma = dot( hdrPixelColor, float3(0.2126, 0.7152, 0.0722) );
...
float outLuma;

// log(0) undef, log(1) = 0
outLuma = luma + 1.0;

//
outLuma = log( outLuma );

// 128, log(1) * 128 = 0, log(2,71828) * 128 = 128, log(7,38905) * 128 = 256
outLuma = outLuma * 128

// uint
uint outLumaUint = min( (uint) outLuma, 255);


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

// 0.5f ( , )
float fDecodedLuma = encodedLumaFloat + 0.5;

// :

// 128
fDecodedLuma /= 128.0;

// exp(x), log(x)
fDecodedLuma = exp(fDecodedLuma);

// 1.0
fDecodedLuma -= 1.0;


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

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

рдпрд╣рд╛рдБ рдмрд╛рдХреА рд▓реВрдк (рдФрд░ shader) рд╣реИ: рдкреВрд░рд╛ shader рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдпрд╣ рдореЗрд░реЗ HLSLexplorer рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИ , рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдореИрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдж рд╡рд┐рдЪрд░ 3 (рдФрд░ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рднрд╛рд╡ рднреА!) рдореЗрдВ рдФрд╕рдд рдЪрдордХ рдЧрдгрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ред рдФрд╕рдд рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЗрд╕ рд╢реЗрдбрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдореБрдЦреНрдп рдХрд╛рд░рдг: 1) рдЪрдХреНрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдЕрдЬреАрдм "рд▓рдВрдмрд┐рдд" рдЪреЗрдХ, рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛ред 2) рд░реЗрдВрдбрд░рдбреЛрдХ (vред 1.2) рдореЗрдВ рдЗрд╕ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдбрд░ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ред

//
float fCurrentLumaContribution = numberOfPixelsWithCurrentLuma * fDecodedLuma;

// () .
float tempTotalContribution = fCurrentLumaContribution + finalAvgLuminance;


[flatten]
if (numProcessedPixels > pixelsToConsiderEnd )
{
//
bExitLoop = true;

// , .
//
int diff = numProcessedPixels - numProcessedPixelStart;

//
finalAvgLuminance = tempTotalContribution / float(diff);
}
else
{
// lumaValue
finalAvgLuminance = tempTotalContribution;
lumaValue++;
}
}

//
g_avgLuminance[uint2(0,0)] = finalAvgLuminance;










рдСрдкрд░реЗрд╢рди "ld_structured_indexable" рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ 0 рд╕реЗ рдкрдврд╝рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реА рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдЪрдХреНрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред

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


рд▓рдбрд╝рд╛рдИ рдХрд╛ рдирддреАрдЬрд╛ред рдмрд╛рдИрдВ рдУрд░ рдореЗрд░рд╛ shader рд╣реИ, рджрд╛рдИрдВ рдУрд░ рдореВрд▓ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рд╣реИред

рднрд╛рдЧ 8. рдЪрдВрджреНрд░рдорд╛ рдФрд░ рдЙрд╕рдХреЗ рдЪрд░рдг


рд▓реЗрдЦ рдХреЗ рдЖрдард╡реЗрдВ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдж рд╡рд┐рдЪрд░ 3 (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд░рдХреНрдд рдФрд░ рд╢рд░рд╛рдм рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ) рд╕реЗ рдЪрдВрджреНрд░рдорд╛ рдХреА рдЫрд╛рдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВред

рдЪрд╛рдБрдж рд░рд╛рдд рдХреЗ рдЖрдХрд╛рд╢ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рд░рд╛рдд рдореЗрдВ TW3 рдореЗрдВ рдЪрд▓рдирд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдирдВрдж рдерд╛ред

рдЬрд░рд╛ рдЗрд╕ рджреГрд╢реНрдп рдХреЛ рджреЗрдЦреЗрдВ!


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

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЪрдВрджреНрд░рдорд╛ рджреВрд░рджрд░рд╛рдЬ рдХреЗ рд╡рд┐рдорд╛рди, рдЦреЗрддреЛрдВ рдФрд░ MinDepth MaxDepth рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╣рд┐рдд D3D11_VIEWPORT рдореВрд▓реНрдп 0.0 (рдПрдХ рд╣реА рдЪрд╛рд▓ рд╣реИ рдХрд┐ рдЖрдХрд╛рд╢ рдЧреБрдВрдмрдж рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рд╕реМрдВрдкрд╛ред рдЖрдХрд╛рд╢ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЪрдВрджреНрд░рдорд╛ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЧреЛрд▓рд╛ рдЪрд╛рдБрдж рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЦреИрд░, рд╕рдм рдХреБрдЫ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдк рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкрд┐рдХреНрд╕реЗрд▓ shader рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдмреНрд▓рдб рдФрд░ рд╡рд╛рдЗрди рд╕реЗ рдПрдХ рд╢реЗрдбрд░ рдЪреБрдирд╛ рд╣реИ - рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрдирд╛рд╡рдЯ рдХреЛ рдирдореВрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред cb0 [0] .w рдХрд╛ рдЙрдкрдпреЛрдЧ X рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдлрд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рд░рд▓ рдЪрд╛рд▓ рд╕реЗ рд╣рдо рдЪрдВрджреНрд░рдорд╛ рдХреЗ рдШреВрд░реНрдгрди рдХреЛ рдЕрдкрдиреА рдзреБрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[1], immediateIndexed
dcl_constantbuffer cb2[3], immediateIndexed
dcl_constantbuffer cb12[267], immediateIndexed
dcl_sampler s0, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_input_ps linear v1.w
dcl_input_ps linear v2.xyzw
dcl_input_ps linear v3.xy
dcl_input_ps linear v4.xy
dcl_output o0.xyzw
dcl_temps 3
0: mov r0.x, -cb0[0].w
1: mov r0.y, l(0)
2: add r0.xy, r0.xyxx, v2.xyxx
3: sample_indexable(texture2d)(float,float,float,float) r0.xyzw, r0.xyxx, t0.xyzw, s0
4: add r0.xyz, r0.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)
5: log r0.w, r0.w
6: mul r0.w, r0.w, l(2.200000)
7: exp r0.w, r0.w
8: add r0.xyz, r0.xyzx, r0.xyzx
9: dp3 r1.x, r0.xyzx, r0.xyzx
10: rsq r1.x, r1.x
11: mul r0.xyz, r0.xyzx, r1.xxxx
12: mul r1.xy, r0.yyyy, v3.xyxx
13: mad r0.xy, v4.xyxx, r0.xxxx, r1.xyxx
14: mad r0.xy, v2.zwzz, r0.zzzz, r0.xyxx
15: mad r0.z, cb0[0].y, l(0.033864), cb0[0].w
16: mul r0.z, r0.z, l(6.283185)
17: sincos r1.x, r2.x, r0.z
18: mov r2.y, r1.x
19: dp2_sat r0.x, r0.xyxx, r2.xyxx
20: mul r0.xyz, r0.xxxx, cb12[266].xyzx
21: mul r0.xyz, r0.xyzx, r0.wwww
22: mul r0.xyz, r0.xyzx, cb2[2].xyzx
23: add_sat r0.w, -v1.w, l(1.000000)
24: mul r0.w, r0.w, cb2[2].w
25: mul o0.xyz, r0.wwww, r0.xyzx
26: mov o0.w, l(0)
27: ret









рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

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


рдПрдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдЪрдВрджреНрд░рдорд╛ рдХреА рд╕рддрд╣ рдХрд╛ рд░рдВрдЧ рд╣реИред


рдмрдирд╛рд╡рдЯ рдЖрд░рдЬреАрдмреА рдЪреИрдирд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рд╣реИрдВред

рд╕рд╣реА рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо RGBA рдЪреИрдирд▓реЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдФрд░ рд╕рддрд╣ рдХреЗ рд░рдВрдЧ рдХреЗ рдЧрд╛рдорд╛ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдПрдХ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рд╢реЗрдбрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзреНрдпрдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХреНрд╕рд╡рд╛рдИ рдШрдЯрдХреЛрдВ рдореЗрдВред (рдж рд╡рд┐рдЪрд░ 3 рдореЗрдВ, рдЬреЗрдб рдЕрдХреНрд╖ рдКрдкрд░ рд╣реИ, рдФрд░ рдмрдирд╛рд╡рдЯ рдХрд╛ рдкреВрд░рд╛ рдЬреЗрдб-рдЪреИрдирд▓ 1.0 рд╣реИ)ред рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЕрдм рдпрд╣ рдЗрд╕ shader рдХреЗ рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИред 15-16 рдХреА рддрд░реНрдЬ рдкрд░ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ : рдпрд╣ рд░рд╣рд╕реНрдпрдордп 0.033864 рдХреНрдпрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд▓рдЧрднрдЧ 29.53 рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╕рдорд╛рди рдорд╣реАрдиреЗ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

float4 MoonPS(in InputStruct IN) : SV_Target0
{
// Texcoords
float2 uvOffsets = float2(-cb0_v0.w, 0.0);

// texcoords
float2 uv = IN.param2.xy + uvOffsets;

//
float4 sampledTexture = texture0.Sample( sampler0, uv);

// - -
float moonColorTex = pow(sampledTexture.a, 2.2 );

// [0,1] [-1,1].
// : sampledTexture.xyz * 2.0 - 1.0
float3 sampledNormal = normalize((sampledTexture.xyz - 0.5) * 2);




//
float3 Tangent = IN.param4.xyz;
float3 Normal = float3(IN.param2.zw, IN.param3.w);
float3 Bitangent = IN.param3.xyz;

// TBN
float3x3 TBN = float3x3(Tangent, Bitangent, Normal);

// XY
// TBN float3x2: 3 , 2
float2 vNormal = mul(sampledNormal, (float3x2)TBN).xy;




15: mad r0.z, cb0[0].y, l(0.033864), cb0[0].w
16: mul r0.z, r0.z, l(6.283185)


рджрд┐рдиреЛрдВ рдореЗрдВ! рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ!

рд╣рдо рдордЬрд╝рдмреВрддреА рд╕реЗ рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ cb0 [0]ред рдпрд╣ рдЙрди рджрд┐рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдЧреЗрдордкреНрд▓реЗ рдХреЗ рджреМрд░рд╛рди рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдЪрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдирд╛рд╡рдЯ рдХреЗ рдПрдХреНрд╕-рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдСрдлрд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ 2 * рдкрд╛рдИ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдлрд┐рд░ sincos рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдПрдХ рдФрд░ 2d рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред

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

// .
// days/29.53 + bias.
float phase = cb0_v0.y * (1.0 / SYNODIC_MONTH_LENGTH) + cb0_v0.w;

// 2*PI. , 29.53
// sin/cos.
phase *= TWOPI;

// .
float outSin = 0.0;
float outCos = 0.0;
sincos(phase, outSin, outCos);

//
float lunarPhase = saturate( dot(vNormal, float2(outCos, outSin)) );






рдЕрдВрддрд┐рдо рдЪрд░рдг рдЕрдВрддрд┐рдо рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдгрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд░рдирд╛ рд╣реИред рдЖрдк рд╢рд╛рдпрдж рдпрд╣ рдирд╣реАрдВ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╢реЗрдбрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП 0.0 рдХрд╛ рдЕрд▓реНрдлрд╛ рдорд╛рди рдХреНрдпреЛрдВ рднреЗрдЬрддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЪрдВрджреНрд░рдорд╛ рдХреЛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

// .

// cb12_v266.xyz , .
// (1.54, 2.82, 4.13)
float3 moonSurfaceGlowColor = cb12_v266.xyz;

float3 moonColor = lunarPhase * moonSurfaceGlowColor;
moonColor = moonColorTex * moonColor;

// cb_v2.xyz - , , , (1.0, 1.0, 1.0)
moonColor *= cb2_v2.xyz;

// , , . - .
// , ,
// .
float paramHorizon = saturate(1.0 - IN.param1.w);
paramHorizon *= cb2_v2.w;

moonColor *= paramHorizon;

//
return float4(moonColor, 0.0);





рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ (рдЖрдХрд╛рд╢) рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╢реЗрдбрд░ рдХрд╛рд▓рд╛ рд▓реМрдЯрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдПрдХ рдкреВрд░реНрдг shader рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕рдореЗрдВ рдмрдбрд╝реЗ рдирд┐рд░рдВрддрд░ рдмрдлрд╝рд░реНрд╕ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореВрд▓ shader рдХреЗ рдмрдЬрд╛рдп RenderDoc рдореЗрдВ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдмрд╕ "MoonPS" рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ "EditedShaderPS")ред

рдФрд░ рдЖрдЦрд┐рд░реА: рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

рдмрд╛рдИрдВ рдУрд░ рдореЗрд░рд╛ shader рд╣реИ, рджрд╛рдИрдВ рдУрд░ рдЦреЗрд▓ рд╕реЗ рдореВрд▓ shader рд╣реИред

рдЕрдВрддрд░ рдиреНрдпреВрдирддрдо рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ shader рдХреЛ рдмрд╣рд▓рд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдерд╛ред

рднрд╛рдЧ 9. рдЬреА-рдмрдлрд░


рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ The Witcher 3 рдореЗрдВ gbuffer рдХреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реВрдБрдЧрд╛ред

рд╣рдо рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдЖрд╕реНрдердЧрд┐рдд рдЫрд╛рдпрд╛рдВрдХрди рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

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

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

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

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

рдЗрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдж рд╡рд┐рдЪрд░ 3: рдмреНрд▓рдб рдПрдВрдб рд╡рд╛рдЗрди рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлреНрд░реЗрдо рджреЗрдЦреЗрдВ:


Toussent

Basic GBuffer рдХреЗ рдХрдИ рд╣реЛрдЯрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ DXGI_FORMAT_R8G8B8A8_UNORM рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рддреАрди рдкреВрд░реНрдг-рд╕реНрдХреНрд░реАрди рд░реЗрдВрдбрд░ рд▓рдХреНрд╖реНрдп рдФрд░ DXGI -FORMAT_D24_UNORM_S8_UINT рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ + рд╕реНрдЯреИрдВрд╕рд┐рд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдпрд╣рд╛рдБ рдЙрдирдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИрдВ:


рд░реЗрдВрдбрд░ рдЯрд╛рд░рдЧреЗрдЯ 0 - рдЖрд░рдЬреАрдмреА рдЪреИрдирд▓, рд╕рддрд╣ рдХрд╛ рд░рдВрдЧ


рд░реЗрдВрдбрд░ рдЯрд╛рд░рдЧреЗрдЯ 0 - рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХреНрдпрд╛ рд╣реИред


рд░реЗрдВрдбрд░ рдЯрд╛рд░рдЧреЗрдЯ 1 - RGB рдЪреИрдирд▓ред рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡реИрдХреНрдЯрд░ [0-1] рдпрд╣рд╛рдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╣реИрдВред


рд░реЗрдВрдбрд░ рдЯрд╛рд░рдЧреЗрдЯ 1 - рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ред рдкрд░рд╛рд╡рд░реНрддрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ!


рд░реЗрдВрдбрд░ рдЯрд╛рд░рдЧреЗрдЯ 2 - RGB рдЪреИрдирд▓ред рд▓рдЧ рд░рд╣рд╛ рд╣реИ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдХрд▓рд░!

рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ, рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХрд╛рд▓рд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред


рдмрдлрд╝рд░ рдХреА рдЧрд╣рд░рд╛рдИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрд▓реНрдЯреЗ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд╡рдЪрд╛, рд╡рдирд╕реНрдкрддрд┐, рдЖрджрд┐)

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

рдкреЛрд╕реНрдЯ рдХреЗ "рдореБрдЦреНрдп" рднрд╛рдЧ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрди рджреВрдВрдЧрд╛:

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



1) рдХреЗрд╡рд▓ рдмрдлрд░ рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЧрд╣рд░рд╛рдИ / рд╕реНрдЯреИрдВрд╕рд┐рд▓ рдмрдлрд░ рд╣реИред

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

рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, RenderTarget1 рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ "рд╕рдмрд╕реЗ рджреВрд░ рдХреЗ рд╡рд┐рдорд╛рди рдкрд░ рдзреБрдВрдзрд▓реЗ"):


рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдХреВрд▓рди рд╣реИред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдмрдХ: рдЖрдкрдХреЛ ClearRenderTargetView рдХреЙрд▓ рдкрд░ рд╕рдВрд╕рд╛рдзрди рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

2) рдЙрд▓рдЯрд╛ рдЧрд╣рд░рд╛рдИ - рдпрд╣ рд╢рд╛рдВрдд рд╣реИ

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

рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛:

рдП) рд╣рдо "0" рд▓рд┐рдЦрдХрд░ рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ "1"ред

рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "1" рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЧрд╣рд░рд╛рдИ рд╕реЗ рдлрд╝реНрд▓рд┐рдк рдХреЗ рдмрд╛рдж, рдирдпрд╛ "рджреВрд░" рдорд╛рди 0 рд╣реЛ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЦ) рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдирд┐рдХрдЯ рдФрд░ рджреВрд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░реЗрдВред

рд╕реА)

рдУрдкрди рдЪреЗрдХ рдХреЛ "рдХрдо" рд╕реЗ "рдЕрдзрд┐рдХ" рдореЗрдВ рдмрджрд▓реЗрдВред рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд▓рд┐рдП, рдереЛрдбрд╝рд╛ рдФрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд▓реЗрдЦ рджреЗрдЦреЗрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

3) рд╣рдо рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред

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

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


рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ GBuffer рдХреЛ рд╕рддрд╣ рдбреЗрдЯрд╛ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИред

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

рдмреЗрд╢рдХ, рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд╕реБрдВрджрд░ рдмреИрд░рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:


рд╣рдорд╛рд░реЗ рд╡реАрд░ рдкреНрд░рддрд┐ рдмреИрд░рд▓!

рдХреГрдкрдпрд╛ рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВ:


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

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬреНрдпрд╛рдорд┐рддрд┐ рдЗрдирдкреБрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:

рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рд╕реНрдерд┐рддрд┐, рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕, рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ shader: рдПрдХ shader рдореЗрдВ рдХрдИ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ shader рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдореБрдЦ рднрд╛рдЧ рдХрд╛ рдЕрд▓рдЧ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ред

ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb4[3], immediateIndexed
dcl_sampler s0, mode_default
dcl_sampler s13, mode_default
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_resource_texture2d (float,float,float,float) t13
dcl_input_ps linear v0.zw
dcl_input_ps linear v1.xyzw
dcl_input_ps linear v2.xyz
dcl_input_ps linear v3.xyz
dcl_input_ps_sgv v4.x, isfrontface
dcl_output o0.xyzw
dcl_output o1.xyzw
dcl_output o2.xyzw
dcl_temps 3
0: sample_indexable(texture2d)(float,float,float,float) r0.xyzw, v1.xyxx, t1.xyzw, s0
1: sample_indexable(texture2d)(float,float,float,float) r1.xyz, v1.xyxx, t0.xyzw, s0
2: add r1.w, r1.y, r1.x
3: add r1.w, r1.z, r1.w
4: mul r2.x, r1.w, l(0.333300)
5: add r2.y, l(-1.000000), cb4[1].x
6: mul r2.y, r2.y, l(0.500000)
7: mov_sat r2.z, r2.y
8: mad r1.w, r1.w, l(-0.666600), l(1.000000)
9: mad r1.w, r2.z, r1.w, r2.x
10: mul r2.xzw, r1.xxyz, cb4[0].xxyz
11: mul_sat r2.xzw, r2.xxzw, l(1.500000, 0.000000, 1.500000, 1.500000)
12: mul_sat r1.w, abs(r2.y), r1.w
13: add r2.xyz, -r1.xyzx, r2.xzwx
14: mad r1.xyz, r1.wwww, r2.xyzx, r1.xyzx
15: max r1.w, r1.z, r1.y
16: max r1.w, r1.w, r1.x
17: lt r1.w, l(0.220000), r1.w
18: movc r1.w, r1.w, l(-0.300000), l(-0.150000)
19: mad r1.w, v0.z, r1.w, l(1.000000)
20: mul o0.xyz, r1.wwww, r1.xyzx
21: add r0.xyz, r0.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)
22: add r0.xyz, r0.xyzx, r0.xyzx
23: mov r1.x, v0.w
24: mov r1.yz, v1.zzwz
25: mul r1.xyz, r0.yyyy, r1.xyzx
26: mad r1.xyz, v3.xyzx, r0.xxxx, r1.xyzx
27: mad r0.xyz, v2.xyzx, r0.zzzz, r1.xyzx
28: uge r1.x, l(0), v4.x
29: if_nz r1.x
30: dp3 r1.x, v2.xyzx, r0.xyzx
31: mul r1.xyz, r1.xxxx, v2.xyzx
32: mad r0.xyz, -r1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), r0.xyzx
33: endif
34: sample_indexable(texture2d)(float,float,float,float) r1.xyz, v1.xyxx, t2.xyzw, s0
35: max r1.w, r1.z, r1.y
36: max r1.w, r1.w, r1.x
37: lt r1.w, l(0.200000), r1.w
38: movc r2.xyz, r1.wwww, r1.xyzx, l(0.120000, 0.120000, 0.120000, 0.000000)
39: add r2.xyz, -r1.xyzx, r2.xyzx
40: mad o2.xyz, v0.zzzz, r2.xyzx, r1.xyzx
41: lt r1.x, r0.w, l(0.330000)
42: mul r1.y, r0.w, l(0.950000)
43: movc r1.x, r1.x, r1.y, l(0.330000)
44: add r1.x, -r0.w, r1.x
45: mad o1.w, v0.z, r1.x, r0.w
46: dp3 r0.w, r0.xyzx, r0.xyzx
47: rsq r0.w, r0.w
48: mul r0.xyz, r0.wwww, r0.xyzx
49: max r0.w, abs(r0.y), abs(r0.x)
50: max r0.w, r0.w, abs(r0.z)
51: lt r1.xy, abs(r0.zyzz), r0.wwww
52: movc r1.yz, r1.yyyy, abs(r0.zzyz), abs(r0.zzxz)
53: movc r1.xy, r1.xxxx, r1.yzyy, abs(r0.yxyy)
54: lt r1.z, r1.y, r1.x
55: movc r1.xy, r1.zzzz, r1.xyxx, r1.yxyy
56: div r1.z, r1.y, r1.x
57: div r0.xyz, r0.xyzx, r0.wwww
58: sample_l(texture2d)(float,float,float,float) r0.w, r1.xzxx, t13.yzwx, s13, l(0)
59: mul r0.xyz, r0.wwww, r0.xyzx
60: mad o1.xyz, r0.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)
61: mov o0.w, cb4[2].x
62: mov o2.w, l(0)
63: ret




рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ - рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ:


albedo


рд╣рдо рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕рд┐рд░реНрдл "OutputColor.rgb = Texture.Sample (uv) .rgb" рдирд╣реАрдВ

рд╣реИ RGB рд░рдВрдЧ рдмрдирд╛рд╡рдЯ (рдкрдВрдХреНрддрд┐ 1) рдХреЗ рдирдореВрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЧрд▓реА 14 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ "рд╕рдВрддреГрдкреНрддрд┐ рдХрдореА рдмрдлрд░" рдХрд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЖрдкрдХреЛ рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдХреЛрдб рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ: рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рдмрдирд╛рд╡рдЯ рдХреЗ рдореВрд▓ рд░рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕реА "рднреМрддрд┐рдХ cbuffer" рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред cb4_v1.x рдХрд╛ рдорд╛рди 1.0 рд╣реИ, рдЬреЛ 0.0 рдХрд╛ рдорд╛рд╕реНрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рд▓реЗрд░рдк рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЗрдирдкреБрдЯ рд░рдВрдЧ рджреЗрддрд╛ рд╣реИ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдЕрдкрд╡рд╛рдж рд╣реИрдВред рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ desaturationFactor 4.0 рд╣реИ (рдпрд╣ 1.0 рд╕реЗ рдХрдо рдХрднреА рдирд╣реАрдВ рд╣реИ), рдФрд░ desaturatedColor

float3 albedoColorFilter( in float3 color, in float desaturationFactor, in float3 desaturationValue )
{
float sumColorComponents = color.r + color.g + color.b;

float averageColorComponentValue = 0.3333 * sumColorComponents;
float oneMinusAverageColorComponentValue = 1.0 - averageColorComponentValue;

float factor = 0.5 * (desaturationFactor - 1.0);

float avgColorComponent = lerp(averageColorComponentValue, oneMinusAverageColorComponentValue, saturate(factor));
float3 desaturatedColor = saturate(color * desaturationValue * 1.5);

float mask = saturate( avgColorComponent * abs(factor) );

float3 finalColor = lerp( color, desaturatedColor, mask );
return finalColor;
}




рд╕рд╛рдордЧреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (0.2, 0.3, 0.4); рдХреЛрдИ рд╕рдЦреНрдд рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИрдВред рдмреЗрд╢рдХ, рдореИрдВ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ DX11 рдврд╛рдВрдЪреЗ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдФрд░ рдпрд╣рд╛рдВ рдРрд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рднреА desaturatedColor рдорд╛рди рдлреНрд▓реЛрдЯ 3 (0.25, 0.3, 0.45) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ


desaturationFactor = 1.0 (рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ)


desaturationFactor = 2.0


desaturationFactor = 3.0


desaturationFactor = 4.0

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

рд▓рд╛рдЗрдиреЗрдВ 15-20 рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИрдВ : v0.z рд╢реАрд░реНрд╖ рдЫрд╛рдпрд╛рдХрд░реНрддрд╛ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдФрд░ рд╡реЗ рд╢реВрдиреНрдп рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛, рдХреНрдпреЛрдВрдХрд┐ v0.z рдмрд╛рдж рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреБрдгрд╛рдВрдХ рд╣реИ, рдФрд░ рдкреВрд░рд╛ рдХреЛрдб рдереЛрдбрд╝рд╛ рдХрдорд┐рдВрдЧ рдЕрд▓реНрдмреЗрдбреЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ v0.z 0 рд╣реИ, рд░рдВрдЧ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИред HLSL: RT0.a рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рд▓реА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ shader рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдкрд╛рд░рднрд╛рд╕реА? рд╣рдо рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддреБрдд рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

15: max r1.w, r1.z, r1.y
16: max r1.w, r1.w, r1.x
17: lt r1.w, l(0.220000), r1.w
18: movc r1.w, r1.w, l(-0.300000), l(-0.150000)
19: mad r1.w, v0.z, r1.w, l(1.000000)
20: mul o0.xyz, r1.wwww, r1.xyzx






/* ALBEDO */
// (?)
float3 albedoColor = albedoColorFilter( colorTex, cb4_v1.x, cb4_v0.rgb );
float albedoMaxComponent = getMaxComponent( albedoColor );

// ,
// "paramZ" 0
float paramZ = Input.out0.z; // , 0

// , 0.70 0.85
// lerp, .
float param = (albedoMaxComponent > 0.22) ? 0.70 : 0.85;
float mulParam = lerp(1, param, paramZ);

//
pout.RT0.rgb = albedoColor * mulParam;
pout.RT0.a = cb4_v2.x;






normals


рдЖрдЗрдП рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдмрд╛рдВрдзреЗрдВрдЧреЗ: рдЕрднреА рддрдХ, рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред 28-33 рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ: рд╣рдо рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рд╕рд╣реА рд╣реИред рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХреНрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкрд┐рдХреНрд╕реЗрд▓ shader SV_IsFrontFace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

/* */
float3 sampledNormal = ((normalTex.xyz - 0.5) * 2);

// TBN
float3 Tangent = Input.TangentW.xyz;
float3 Normal = Input.NormalW.xyz;
float3 Bitangent;
Bitangent.x = Input.out0.w;
Bitangent.yz = Input.out1.zw;

// ; , , normal-tbn
// 'mad' 'mov'
Bitangent = saturate(Bitangent);

float3x3 TBN = float3x3(Tangent, Bitangent, Normal);
float3 normal = mul( sampledNormal, TBN );






28: uge r1.x, l(0), v4.x
29: if_nz r1.x
30: dp3 r1.x, v2.xyzx, r0.xyzx
31: mul r1.xyz, r1.xxxx, v2.xyzx
32: mad r0.xyz, -r1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), r0.xyzx
33: endif




[branch] if (bIsFrontFace <= 0)
{
float cosTheta = dot(Input.NormalW, normal);
float3 invNormal = cosTheta * Input.NormalW;
normal = normal - 2*invNormal;
}






рдпрд╣ рдХреНрдпрд╛ рд╣реИрдкреНрд░рд▓реЗрдЦрди рдорджрдж рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ (рдореИрдВ "msdn" рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди ...):

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

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

рдпрд╣рд╛рдБ рдПрдХ рддреБрд▓рдирд╛ рд╣реИ: рджреЛрдиреЛрдВ рджреГрд╢реНрдп рдХреЗ рдлреНрд░реЗрдо рдХреЗ рд░рдВрдЧ рдЗрд╕ рдЪрд╛рд▓ рдХреЗ рд╕рд╛рде / рдмрдВрдж, рд╕рд╛рде рд╣реА рд╕рд╛рде gbuffer рдХреА рдмрдирд╛рд╡рдЯ [0-1] рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд╛рд▓ / рдмрдВрдж:


рдмрд┐рдирд╛ рдЫрд▓ рдХреЗ рджреГрд╢реНрдп рдХрд╛ рд░рдВрдЧ


рд╕реНрдЯрдВрдЯ рдХреЗ рд╕рд╛рде рд░рдВрдЧ рджреГрд╢реНрдп


рд╕рд╛рдорд╛рдиреНрдп [0-1] рдХреЛрдИ рдЪрд╛рд▓ рдирд╣реАрдВ


рдПрдХ рдЪрд╛рд▓ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп [0-1]

рдХреНрдпрд╛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ GBuffer рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рд▓рдХреНрд╖реНрдп R8G8B8A8_UNORM рдкреНрд░рд╛рд░реВрдк рд╣реИ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддрд┐ рдШрдЯрдХ 256 рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?

Gbuffer рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдПрдХ рдЬреНрдЮрд╛рдд рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░рд┐рдпрд╛рдВ рд╣реИрдВ ред

рд╢рд╛рдпрдж рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рдкреВрд░реЗ рдорд╛рд░реНрдЧ рдореЗрдВ рд╕реНрд▓реЙрдЯ 13 рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдирд╛рд╡рдЯ рд╣реИ ...:



рд╣рд╛!The Witcher 3 рдПрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ " рдмреЗрд╕реНрдЯ рдлрд┐рдЯ рдиреЙрд░реНрдореНрд╕ " рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ (рдкреНрд░рд╕реНрддреБрддрд┐ рджреЗрдЦреЗрдВ)ред рдЗрд╕рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрд░рд╛рдпрдЯреЗрдХ рджреНрд╡рд╛рд░рд╛ 2009-2010 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЪреВрдВрдХрд┐ рдХреНрд░рд╛рдпреНрд╡реЗрдирдЗрди рдХрд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ, рдмреАрдПрдлрдПрди рднреА рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ ред

BFN рдорд╛рдирджрдВрдбреЛрдВ рдХреА рдмрдирд╛рд╡рдЯ рдХреЛ "рджрд╛рдиреЗрджрд╛рд░" рд░реВрдк рджреЗрддрд╛ рд╣реИред

рдмреАрдПрдлрдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд░рд╛рд▓ [-1; 1] рд╕реЗ [0, 1] рддрдХ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВред

рд╕реНрдкреЗрдХреНрдпреБрд▓рд░


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

34: sample_indexable(texture2d)(float,float,float,float) r1.xyz, v1.xyxx, t2.xyzw, s0
35: max r1.w, r1.z, r1.y
36: max r1.w, r1.w, r1.x
37: lt r1.w, l(0.200000), r1.w
38: movc r2.xyz, r1.wwww, r1.xyzx, l(0.120000, 0.120000, 0.120000, 0.000000)
39: add r2.xyz, -r1.xyzx, r2.xyzx
40: mad o2.xyz, v0.zzzz, r2.xyzx, r1.xyzx








/* SPECULAR */
float3 specularTex = texture2.Sample( samplerAnisoWrap, Texcoords ).rgb;

// , Albedo. . ,
// - "".
// paramZ 0,
// .
float specularMaxComponent = getMaxComponent( specularTex );
float3 specB = (specularMaxComponent > 0.2) ? specularTex : float3(0.12, 0.12, 0.12);
float3 finalSpec = lerp(specularTex, specB, paramZ);
pout.RT2.xyz = finalSpec;


рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ


рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдирд╛рдо рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдХреЗ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рд╣реИ:


рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдмрдирд╛рд╡рдЯ "рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛"ред

рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб: рд╣рдорд╛рд░реЗ рдкреБрд░рд╛рдиреЗ рдорд┐рддреНрд░ рдХреЛ рдирдорд╕реНрддреЗ рдХрд╣реЗрдВ - v0.z! рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЕрд▓реНрдмреЗрдбреЛ рдФрд░ рд╕реНрдкреЗрдХреБрд▓рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ:

41: lt r1.x, r0.w, l(0.330000)
42: mul r1.y, r0.w, l(0.950000)
43: movc r1.x, r1.x, r1.y, l(0.330000)
44: add r1.x, -r0.w, r1.x
45: mad o1.w, v0.z, r1.x, r0.w




/* REFLECTIVITY */
float reflectivity = normalTex.a;
float reflectivity2 = (reflectivity < 0.33) ? (reflectivity * 0.95) : 0.33;

float finalReflectivity = lerp(reflectivity, reflectivity2, paramZ);
pout.RT1.a = finalReflectivity;


рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛!рдпрд╣ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЕрдВрдд рд╣реИред

рдпрд╣рд╛рдБ рдореВрд▓ (рджрд╛рдПрдВ) рдХреЗ рд╕рд╛рде рдореЗрд░реЗ shader (рдмрд╛рдПрдВ) рдХреА рддреБрд▓рдирд╛ рд╣реИ:


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

рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░: рдЕрд▓рдмреЗрдбреЛ + рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк


рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЕрдм рдХреЗрд╡рд▓ рдПрд▓реНрдмреЗрдбреЛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде, рдмрд┐рдирд╛ рд╕реНрдкреЗрдХреБрд▓рд░ рдмрдирд╛рд╡рдЯ рдХреЗред рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реИ: рдЗрд╕ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рдП) рд▓рд╛рдЗрдиреЗрдВ 1, 19 : рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ v0.z рдХреЛ cb4 [0] .x рд╕реЗ рдирд┐рд░рдВрддрд░ рдмрдлрд░ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрддреНрдкрд╛рдж рдХреЗрд╡рд▓ рд▓рд╛рдЗрди 19 рдкрд░ рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдЕрд▓реНрдмреЗрдбреЛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП, v0.z рдХреЗ "рд╕рд╛рдорд╛рдиреНрдп" рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред b) рд▓рд╛рдЗрдиреЗрдВ 54-55 : o2.w рдЕрдм рдЗрд╕ рд╢рд░реНрдд рдХреЗ рддрд╣рдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ рдХрд┐ (cb4 [7] .x> 0.0) рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ "рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ - рдФрд░" рдЪрдордХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдХреА рдЧрдгрдирд╛ рд╕реЗ рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕реА) рд▓рд╛рдЗрдиреЗрдВ 34-42 : рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдЧрдгрдирд╛ред

ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb4[8], immediateIndexed
dcl_sampler s0, mode_default
dcl_sampler s13, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t1
dcl_resource_texture2d (float,float,float,float) t13
dcl_input_ps linear v0.zw
dcl_input_ps linear v1.xyzw
dcl_input_ps linear v2.xyz
dcl_input_ps linear v3.xyz
dcl_input_ps_sgv v4.x, isfrontface
dcl_output o0.xyzw
dcl_output o1.xyzw
dcl_output o2.xyzw
dcl_temps 4
0: mul r0.x, v0.z, cb4[0].x
1: sample_indexable(texture2d)(float,float,float,float) r1.xyzw, v1.xyxx, t1.xyzw, s0
2: sample_indexable(texture2d)(float,float,float,float) r0.yzw, v1.xyxx, t0.wxyz, s0
3: add r2.x, r0.z, r0.y
4: add r2.x, r0.w, r2.x
5: add r2.z, l(-1.000000), cb4[2].x
6: mul r2.yz, r2.xxzx, l(0.000000, 0.333300, 0.500000, 0.000000)
7: mov_sat r2.w, r2.z
8: mad r2.x, r2.x, l(-0.666600), l(1.000000)
9: mad r2.x, r2.w, r2.x, r2.y
10: mul r3.xyz, r0.yzwy, cb4[1].xyzx
11: mul_sat r3.xyz, r3.xyzx, l(1.500000, 1.500000, 1.500000, 0.000000)
12: mul_sat r2.x, abs(r2.z), r2.x
13: add r2.yzw, -r0.yyzw, r3.xxyz
14: mad r0.yzw, r2.xxxx, r2.yyzw, r0.yyzw
15: max r2.x, r0.w, r0.z
16: max r2.x, r0.y, r2.x
17: lt r2.x, l(0.220000), r2.x
18: movc r2.x, r2.x, l(-0.300000), l(-0.150000)
19: mad r0.x, r0.x, r2.x, l(1.000000)
20: mul o0.xyz, r0.xxxx, r0.yzwy
21: add r0.xyz, r1.xyzx, l(-0.500000, -0.500000, -0.500000, 0.000000)
22: add r0.xyz, r0.xyzx, r0.xyzx
23: mov r1.x, v0.w
24: mov r1.yz, v1.zzwz
25: mul r1.xyz, r0.yyyy, r1.xyzx
26: mad r0.xyw, v3.xyxz, r0.xxxx, r1.xyxz
27: mad r0.xyz, v2.xyzx, r0.zzzz, r0.xywx
28: uge r0.w, l(0), v4.x
29: if_nz r0.w
30: dp3 r0.w, v2.xyzx, r0.xyzx
31: mul r1.xyz, r0.wwww, v2.xyzx
32: mad r0.xyz, -r1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), r0.xyzx
33: endif
34: add r0.w, -r1.w, l(1.000000)
35: log r1.xyz, cb4[3].xyzx
36: mul r1.xyz, r1.xyzx, l(2.200000, 2.200000, 2.200000, 0.000000)
37: exp r1.xyz, r1.xyzx
38: mad r0.w, r0.w, cb4[4].x, cb4[5].x
39: mul_sat r1.xyz, r0.wwww, r1.xyzx
40: log r1.xyz, r1.xyzx
41: mul r1.xyz, r1.xyzx, l(0.454545, 0.454545, 0.454545, 0.000000)
42: exp r1.xyz, r1.xyzx
43: max r0.w, r1.z, r1.y
44: max r0.w, r0.w, r1.x
45: lt r0.w, l(0.200000), r0.w
46: movc r2.xyz, r0.wwww, r1.xyzx, l(0.120000, 0.120000, 0.120000, 0.000000)
47: add r2.xyz, -r1.xyzx, r2.xyzx
48: mad o2.xyz, v0.zzzz, r2.xyzx, r1.xyzx
49: lt r0.w, r1.w, l(0.330000)
50: mul r1.x, r1.w, l(0.950000)
51: movc r0.w, r0.w, r1.x, l(0.330000)
52: add r0.w, -r1.w, r0.w
53: mad o1.w, v0.z, r0.w, r1.w
54: lt r0.w, l(0), cb4[7].x
55: and o2.w, r0.w, l(0.064706)
56: dp3 r0.w, r0.xyzx, r0.xyzx
57: rsq r0.w, r0.w
58: mul r0.xyz, r0.wwww, r0.xyzx
59: max r0.w, abs(r0.y), abs(r0.x)
60: max r0.w, r0.w, abs(r0.z)
61: lt r1.xy, abs(r0.zyzz), r0.wwww
62: movc r1.yz, r1.yyyy, abs(r0.zzyz), abs(r0.zzxz)
63: movc r1.xy, r1.xxxx, r1.yzyy, abs(r0.yxyy)
64: lt r1.z, r1.y, r1.x
65: movc r1.xy, r1.zzzz, r1.xyxx, r1.yxyy
66: div r1.z, r1.y, r1.x
67: div r0.xyz, r0.xyzx, r0.wwww
68: sample_l(texture2d)(float,float,float,float) r0.w, r1.xzxx, t13.yzwx, s13, l(0)
69: mul r0.xyz, r0.wwww, r0.xyzx
70: mad o1.xyz, r0.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)
71: mov o0.w, cb4[6].x
72: ret










pout.RT2.w = (cb4_v7.x > 0.0) ? (16.5/255.0) : 0.0;



рдпрд╣рд╛рдВ рдХреЛрдИ рднреА рд╕реНрдкреЗрдХреБрд▓рд░ рдЯреЗрдХреНрд╕рдЪрд░ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рджреЗрдЦреЗрдВ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдпрд╣рд╛рдБ (1 - рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдХреНрд╖рдорддрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдореЗрдВ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдореИрдВ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ рдмрдлрд░ рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЗрди рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рд░рдВрдЧ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реЗрд╖ shader рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддрд░рд╣ рд╣реА рд╣реИред WinMerge рдореЗрдВ 72 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╢рдмреНрдж рд▓реЗрдВ: рдореЗрд░рд╛ рдХреЛрдб рдореВрд▓ рдХреЗ рд╕рдорд╛рди рд╣реА рдирд┐рдХрд▓рд╛ред рдпрд╛ рдЖрдк рдореЗрд░реЗ HLSLexplorer рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ!

34: add r0.w, -r1.w, l(1.000000)
35: log r1.xyz, cb4[3].xyzx
36: mul r1.xyz, r1.xyzx, l(2.200000, 2.200000, 2.200000, 0.000000)
37: exp r1.xyz, r1.xyzx
38: mad r0.w, r0.w, cb4[4].x, cb4[5].x
39: mul_sat r1.xyz, r0.wwww, r1.xyzx
40: log r1.xyz, r1.xyzx
41: mul r1.xyz, r1.xyzx, l(0.454545, 0.454545, 0.454545, 0.000000)
42: exp r1.xyz, r1.xyzx




float oneMinusReflectivity = 1.0 - normalTex.a;
float3 specularTex = pow(cb4_v3.rgb, 2.2);
oneMinusReflectivity = oneMinusReflectivity * cb4_v4.x + cb4_v5.x;
specularTex = saturate(specularTex * oneMinusReflectivity);
specularTex = pow(specularTex, 1.0/2.2);

// ...
float specularMaxComponent = getMaxComponent( specularTex );
...








рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛


... рдФрд░ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдФрд░ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЬреЛ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ рд╡рд╣ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ gbuffer рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ The Witcher 3 рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдб рдХреЗ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдП, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрди рднреА рджрд┐рдП рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдердЧрд┐рдд рдЫрд╛рдпрд╛рдВрдХрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

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

рд╡рд┐рдХрд▓реНрдк 1 - рд╕реНрдкреЗрдХреБрд▓рд░ рдЯреЗрдХреНрд╕рдЪрд░ рдХреЗ рд╕рд╛рде

рд╡рд┐рдХрд▓реНрдк 2 - рд╕реНрдкреЗрдХреНрдпреБрд▓рд░ рдЯреЗрдХреНрд╕рдЪрд░ рдХреЗ рдмрд┐рдирд╛

рднрд╛рдЧ 10. рджреВрд░реА рдореЗрдВ рдмрд╛рд░рд┐рд╢ рдХреЗ рдкрд░реНрджреЗ


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


рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рдШрдЯрдирд╛ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрддреНрд╕реБрдХ рдерд╛ рдХрд┐ рд╕реАрдбреА рдкреНрд░реЙрдЬреЗрдХреНрдЯ рд░реЗрдб рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЪрд▓реЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ!

рдмрд╛рд░рд┐рд╢ рдХреЗ рдкрд░реНрджреЗ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдпрд╣рд╛рдВ рджреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджрд┐рдП рдЧрдП рд╣реИрдВ:


рдмрд╛рд░рд┐рд╢ рдХреЗ рдкрд░реНрджреЗ рддрдХ


рдмрд╛рд░рд┐рд╢ рдХреЗ рдкрд░реНрджреЗ рдХреЗ рдмрд╛рдж

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


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


рд╕реНрдерд╛рдиреАрдп рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рд╕рд┐рд▓реЗрдВрдбрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд╛рди

рдореЗрдВ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИ - рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рд╕реАрдорд╛ рдореЗрдВ рд╣реИ (0.0 / 1.0)ред

рдЗрд╕ рдбреНрд░реЙ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рд╕рд░реНрдХрд┐рдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ...


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбрд░реНрд╕ рдФрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕_рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдоред

рдЯреЗрдХреНрд╕рдХреЛрд░реНрдб рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ: рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рдЖрдзрд╛рд░реЛрдВ рдХрд╛ рдпреВ рдЕрдВрддрд░рд╛рд▓ [0.02777 - 1.02734] рдореЗрдВ рд╣реИред рдирд┐рдЪрд▓реЗ рдЖрдзрд╛рд░ рдкрд░ V 1.0 рд╣реИ, рдФрд░ рдКрдкрд░реА - 0.0 рдкрд░ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдЗрд╕ рдЬрд╛рд▓ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

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




рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рд╣рдо рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЫреБрдкрд╛рддрд╛ рд╣реИ! рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ: рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдлреНрд░реЗрдо рдореЗрдВ рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: (-116.5338, 234.8695, 2.09) рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рд╕рд┐рд▓реЗрдВрдбрд░ рдХреЛ рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рд╣реИ (TW3- рдЬреЗрдб рдЕрдХреНрд╖ рдХрд╛ рдирд┐рд░реНрджреЗрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдЗрд╕реЗ рдХреИрдорд░рд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ , рдФрд░ рдореБрдбрд╝рд╛ред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдХрд┐ рд╕рд┐рд▓реЗрдгреНрдбрд░ рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж рд╕рд┐рд▓реЗрдВрдбрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

XMMATRIX mat( -227.7472, 159.8043, 374.0736, -116.4951,
-194.7577, -173.3836, -494.4982, 238.6908,
-14.16466, -185.4743, 784.564, -1.45565,
0.0, 0.0, 0.0, 1.0 );

mat = XMMatrixTranspose( mat );

XMVECTOR vScale;
XMVECTOR vRotateQuat;
XMVECTOR vTranslation;
XMMatrixDecompose( &vScale, &vRotateQuat, &vTranslation, mat );

// ...
XMMATRIX matRotate = XMMatrixRotationQuaternion( vRotateQuat );




vRotateQuat: (0.0924987569, -0.314900011, 0.883411944, -0.334462732)

vScale: (299.999969, 300.000000, 1000.00012)

vTranslation: (-116.495102, 238.690796, -1.45564997)









рд╡рд░реНрдЯрд┐рдХрд▓ рд╢реЗрдбрд░ рджреНрд╡рд╛рд░рд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рдж рд╕рд┐рд▓реЗрдВрдбрд░ред рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рджреГрд╢реНрдпрддрд╛ рдХреЗ рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИред

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░


рдЗрдирдкреБрдЯ рдЬреНрдпрд╛рдорд┐рддрд┐ рдФрд░ рд╡рд░реНрдЯреЗрдХрд░ рд╢реЗрдбрд░ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдХрдбрд╝рд╛рдИ рд╕реЗ рдирд┐рд░реНрднрд░ рд╣реИрдВред

рдЖрдЗрдП, рд╡рд░реНрдЯрд┐рдХрд▓ рд╢реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ: рд╕рд░рд▓ рдкрд╛рд╕рд┐рдВрдЧ рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ (рд▓рд╛рдЗрди 0) рдФрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕_рдУрдбреА_рдкрд░рд╛рдо (рд▓рд╛рдЗрди 8) рдХреЗ рд╕рд╛рде, рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рджреЛ рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: SV_Position (рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ) рдФрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреА рдКрдВрдЪрд╛рдИ (рдШрдЯрдХ .z)ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд╛рди [0-1] рд░реЗрдВрдЬ рдореЗрдВ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реНрд╡ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдорд╛рдиреЗ рдФрд░ рд╡рд┐рдЪрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реНрдорд╛рд░реНрдЯ рдЪрд╛рд▓! рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдХреЗрд▓ = рдлреНрд▓реЛрдЯ 3 (4, 4, 2), рдФрд░ рдмрд╛рдпрд╕ = рдлреНрд▓реЛрдЯ 3 (-2, -1, -1)ред < рдЬреЛ рдкреИрдЯрд░реНрди 9 рдФрд░ 28 рдХреЗ рдмреАрдЪ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╡рд╣ рджреЛ рдкрдВрдХреНрддрд┐-рдкреНрд░рдореБрдЦ рдкрд░рд┐рдкрдХреНрд╡рддрд╛рдУрдВ рдХрд╛ рдЧреБрдгрди рд╣реИред рдЖрдЗрдП, рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдкрд░ рддреИрдпрд╛рд░ рд╡рд░реНрдХрдЯ рд╢реЗрдЕрд░ рдХреЛ рджреЗрдЦреЗрдВ:

vs_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb1[7], immediateIndexed
dcl_constantbuffer cb2[6], immediateIndexed
dcl_input v0.xyz
dcl_input v1.xy
dcl_input v4.xyzw
dcl_input v5.xyzw
dcl_input v6.xyzw
dcl_input v7.xyzw
dcl_output o0.xyz
dcl_output o1.xyzw
dcl_output_siv o2.xyzw, position
dcl_temps 2
0: mov o0.xy, v1.xyxx
1: mul r0.xyzw, v5.xyzw, cb1[6].yyyy
2: mad r0.xyzw, v4.xyzw, cb1[6].xxxx, r0.xyzw
3: mad r0.xyzw, v6.xyzw, cb1[6].zzzz, r0.xyzw
4: mad r0.xyzw, cb1[6].wwww, l(0.000000, 0.000000, 0.000000, 1.000000), r0.xyzw
5: mad r1.xyz, v0.xyzx, cb2[4].xyzx, cb2[5].xyzx
6: mov r1.w, l(1.000000)
7: dp4 o0.z, r1.xyzw, r0.xyzw
8: mov o1.xyzw, v7.xyzw
9: mul r0.xyzw, v5.xyzw, cb1[0].yyyy
10: mad r0.xyzw, v4.xyzw, cb1[0].xxxx, r0.xyzw
11: mad r0.xyzw, v6.xyzw, cb1[0].zzzz, r0.xyzw
12: mad r0.xyzw, cb1[0].wwww, l(0.000000, 0.000000, 0.000000, 1.000000), r0.xyzw
13: dp4 o2.x, r1.xyzw, r0.xyzw
14: mul r0.xyzw, v5.xyzw, cb1[1].yyyy
15: mad r0.xyzw, v4.xyzw, cb1[1].xxxx, r0.xyzw
16: mad r0.xyzw, v6.xyzw, cb1[1].zzzz, r0.xyzw
17: mad r0.xyzw, cb1[1].wwww, l(0.000000, 0.000000, 0.000000, 1.000000), r0.xyzw
18: dp4 o2.y, r1.xyzw, r0.xyzw
19: mul r0.xyzw, v5.xyzw, cb1[2].yyyy
20: mad r0.xyzw, v4.xyzw, cb1[2].xxxx, r0.xyzw
21: mad r0.xyzw, v6.xyzw, cb1[2].zzzz, r0.xyzw
22: mad r0.xyzw, cb1[2].wwww, l(0.000000, 0.000000, 0.000000, 1.000000), r0.xyzw
23: dp4 o2.z, r1.xyzw, r0.xyzw
24: mul r0.xyzw, v5.xyzw, cb1[3].yyyy
25: mad r0.xyzw, v4.xyzw, cb1[3].xxxx, r0.xyzw
26: mad r0.xyzw, v6.xyzw, cb1[3].zzzz, r0.xyzw
27: mad r0.xyzw, cb1[3].wwww, l(0.000000, 0.000000, 0.000000, 1.000000), r0.xyzw
28: dp4 o2.w, r1.xyzw, r0.xyzw
29: ret












cbuffer cbPerFrame : register (b1)
{
row_major float4x4 g_viewProjMatrix;
row_major float4x4 g_rainShaftsViewProjMatrix;
}

cbuffer cbPerObject : register (b2)
{
float4x4 g_mtxWorld;
float4 g_modelScale;
float4 g_modelBias;
}

struct VS_INPUT
{
float3 PositionW : POSITION;
float2 Texcoord : TEXCOORD;
float3 NormalW : NORMAL;
float3 TangentW : TANGENT;
float4 InstanceTransform0 : INSTANCE_TRANSFORM0;
float4 InstanceTransform1 : INSTANCE_TRANSFORM1;
float4 InstanceTransform2 : INSTANCE_TRANSFORM2;
float4 InstanceLODParams : INSTANCE_LOD_PARAMS;
};

struct VS_OUTPUT
{
float3 TexcoordAndZ : Texcoord0;

float4 LODParams : LODParams;
float4 PositionH : SV_Position;
};

VS_OUTPUT RainShaftsVS( VS_INPUT Input )
{
VS_OUTPUT Output = (VS_OUTPUT)0;

//
Output.TexcoordAndZ.xy = Input.Texcoord;
Output.LODParams = Input.InstanceLODParams;

//
float3 meshScale = g_modelScale.xyz; // float3( 4, 4, 2 );
float3 meshBias = g_modelBias.xyz; // float3( -2, -2, -1 );
float3 PositionL = Input.PositionW * meshScale + meshBias;

// instanceWorld float4s:
float4x4 matInstanceWorld = float4x4(Input.InstanceTransform0, Input.InstanceTransform1,
Input.InstanceTransform2 , float4(0, 0, 0, 1) );

// (.z)
float4x4 matWorldInstanceLod = mul( g_rainShaftsViewProjMatrix, matInstanceWorld );
Output.TexcoordAndZ.z = mul( float4(PositionL, 1.0), transpose(matWorldInstanceLod) ).z;

// SV_Posiiton
float4x4 matModelViewProjection = mul(g_viewProjMatrix, matInstanceWorld );
Output.PositionH = mul( float4(PositionL, 1.0), transpose(matModelViewProjection) );

return Output;
}


рдореЗрд░реЗ shader рдХреА рддреБрд▓рдирд╛ (рдмрд╛рдПрдВ) рдФрд░ рдореВрд▓ (рджрд╛рдПрдВ):


рдорддрднреЗрдж рдЧрдгрдирд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╢реЗрдбрд░ рдХреЛ рдлреНрд░реЗрдо рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдЕрднреА рднреА рдареАрдХ рдерд╛!

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


рдЕрдВрдд рдореЗрдВ!рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

рджреЛ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╢реЛрд░ рдмрдирд╛рд╡рдЯ рдФрд░ рдЧрд╣рд░рд╛рдИ рдмрдлрд░:



рдирд┐рд░рдВрддрд░ рдмрдлрд╝рд░ рд╕реЗ рдорд╛рди:





рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб:

ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[8], immediateIndexed
dcl_constantbuffer cb2[3], immediateIndexed
dcl_constantbuffer cb12[23], immediateIndexed
dcl_constantbuffer cb4[8], immediateIndexed
dcl_sampler s0, mode_default
dcl_sampler s15, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t15
dcl_input_ps linear v0.xyz
dcl_input_ps linear v1.w
dcl_input_ps_siv v2.xy, position
dcl_output o0.xyzw
dcl_temps 1
0: mul r0.xy, cb0[0].xxxx, cb4[5].xyxx
1: mad r0.xy, v0.xyxx, cb4[4].xyxx, r0.xyxx
2: sample_indexable(texture2d)(float,float,float,float) r0.x, r0.xyxx, t0.xyzw, s0
3: add r0.y, -cb4[2].x, cb4[3].x
4: mad_sat r0.x, r0.x, r0.y, cb4[2].x
5: mul r0.x, r0.x, v0.y
6: mul r0.x, r0.x, v1.w
7: mul r0.x, r0.x, cb4[1].x
8: mul r0.yz, v2.xxyx, cb0[1].zzwz
9: sample_l(texture2d)(float,float,float,float) r0.y, r0.yzyy, t15.yxzw, s15, l(0)
10: mad r0.y, r0.y, cb12[22].x, cb12[22].y
11: mad r0.y, r0.y, cb12[21].x, cb12[21].y
12: max r0.y, r0.y, l(0.000100)
13: div r0.y, l(1.000000, 1.000000, 1.000000, 1.000000), r0.y
14: add r0.y, r0.y, -v0.z
15: mul_sat r0.y, r0.y, cb4[6].x
16: mul_sat r0.x, r0.y, r0.x
17: mad r0.y, cb0[7].y, r0.x, -r0.x
18: mad r0.x, cb4[7].x, r0.y, r0.x
19: mul r0.xyz, r0.xxxx, cb4[0].xyzx
20: log r0.xyz, r0.xyzx
21: mul r0.xyz, r0.xyzx, l(2.200000, 2.200000, 2.200000, 0.000000)
22: exp r0.xyz, r0.xyzx
23: mul r0.xyz, r0.xyzx, cb2[2].xyzx
24: mul o0.xyz, r0.xyzx, cb2[2].wwww
25: mov o0.w, l(0)
26: ret


рд╡рд╛рд╣!рдХрд╛рдлреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо cbuffer (cb0 [0] .x) рдФрд░ рд╕реНрдХреЗрд▓ / рдСрдлрд╕реЗрдЯ рд╕реЗ рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрдЯреЗрдб UVs рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЯреЗрдХреНрд╕рдХреЛрд░реНрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реЛрд░ рдмрдирд╛рд╡рдЯ (рд▓рд╛рдЗрди 2) рд╕реЗ рдирдореВрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрдирд╛рд╡рдЯ рд╕реЗ рд╢реЛрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ (рдЖрдорддреМрд░ рдкрд░ 0 рдФрд░ 1) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВред

рддрдм рд╣рдо рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдирд╛рд╡рдЯ V рдХреЗ рд╕рдордиреНрд╡рдп рджреНрд╡рд╛рд░рд╛ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рдордиреНрд╡рдп V 1 рд╕реЗ 0 рддрдХ рдЬрд╛рддрд╛ рд╣реИ?) - рдкрдВрдХреНрддрд┐ 5.

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ "рдЪрдордХ рдореБрдЦреМрдЯрд╛" рдХреА рдЧрдгрдирд╛ рдХреА - рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреВрд░ рдХреА рд╡рд╕реНрддреБрдПрдВ (рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрддрдВрдн, рдкрд╣рд╛рдбрд╝ ...) рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИрдВред рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд▓реЗрдВрдбрд░ рдЧрд╣рд░рд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ - рд╕рд┐рд▓реЗрдВрдбрд░ рджреВрд░ рддрд▓ рдкрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдКрдкрд░ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИ:


рдЧрд╣рд░рд╛рдИ рдкрд░реАрдХреНрд╖рдг

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

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

farObjectsMask = saturate( (FrustumDepth - CylinderWorldSpaceHeight) * 0.001 );

(0.001 рдХреЛ рдмрдлрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдЬреЛ рд╣рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рд╕реНрдХ рджреЗрддрд╛ рд╣реИ:


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

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

рдЬрдм рджреЛрдиреЛрдВ рдореБрдЦреМрдЯреЗ рдХреЛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:


рдЗрд╕ рдЕрдВрддрд┐рдо рдорд╛рд╕реНрдХ (рд▓рд╛рдЗрди 16) рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдФрд░ рдкреНрд░рдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ (рдХрдо рд╕реЗ рдХрдо рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдорд╛рдорд▓реЗ рдореЗрдВ) рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░реНрджреЗ (рд▓рд╛рдЗрди 19) рдХреЗ рд░рдВрдЧ рд╕реЗ рдЕрдВрддрд┐рдо рдорд╛рд╕реНрдХ рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ, рдЧрд╛рдорд╛ рд╕реБрдзрд╛рд░ (рд▓рд╛рдЗрдиреЗрдВ 20) рдХрд░реЗрдВ -22) рдФрд░ рдЕрдВрддрд┐рдо рдЧреБрдгрди (23-24)ред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рд╢реВрдиреНрдп рдЕрд▓реНрдлрд╛ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд░рдВрдЧ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд╛рд╕ рдкрд░ рдорд┐рд╢реНрд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

FinalColor = SourceColor * 1.0 + (1.0 - SourceAlpha) * DestColor

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

SourceColor рдкрд┐рдХреНрд╕реЗрд▓ shader рд╕реЗ RGB рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдФрд░ DestColor рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд╡рд░реНрддрдорд╛рди RGB рд░рдВрдЧ рд╣реИ ред рдЪреВрдВрдХрд┐ SourceAlpha рд╣рдореЗрд╢рд╛ 0.0 рдХреЗ рдмрд░рд╛рдмрд░, рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХрд░рдг рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ: FinalColor = SourceColor + DestColorред

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

рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рдПрдЪрдПрд▓рдПрд╕рдПрд▓ рдХреЛрдб рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдордЭрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛: рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбрд░ рдореВрд▓ рдХреЗ рд╕рдорд╛рди рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓реЗрдЦ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реЛрдЧрд╛ред рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

struct VS_OUTPUT
{
float3 TexcoordAndWorldspaceHeight : Texcoord0;
float4 LODParams : LODParams; // float4(1,1,1,1)
float4 PositionH : SV_Position;
};

float getFrustumDepth( in float depth )
{
// from [1-0] to [0-1]
float d = depth * cb12_v22.x + cb12_v22.y;

// special coefficents
d = d * cb12_v21.x + cb12_v21.y;

// return frustum depth
return 1.0 / max(d, 1e-4);
}

float4 EditedShaderPS( in VS_OUTPUT Input ) : SV_Target0
{
// * Input from Vertex Shader
float2 InputUV = Input.TexcoordAndWorldspaceHeight.xy;
float WorldHeight = Input.TexcoordAndWorldspaceHeight.z;
float LODParam = Input.LODParams.w;

// * Inputs
float elapsedTime = cb0_v0.x;
float2 uvAnimation = cb4_v5.xy;
float2 uvScale = cb4_v4.xy;
float minValue = cb4_v2.x; // 0.0
float maxValue = cb4_v3.x; // 1.0
float3 shaftsColor = cb4_v0.rgb; // RGB( 147, 162, 173 )

float3 finalColorFilter = cb2_v2.rgb; // float3( 1.175, 1.296, 1.342 );
float finalEffectIntensity = cb2_v2.w;

float2 invViewportSize = cb0_v1.zw;

float depthScale = cb4_v6.x; // 0.001

// sample noise
float2 uvOffsets = elapsedTime * uvAnimation;
float2 uv = InputUV * uvScale + uvOffsets;
float disturb = texture0.Sample( sampler0, uv ).x;

// * Intensity mask
float intensity = saturate( lerp(minValue, maxValue, disturb) );
intensity *= InputUV.y; // transition from (0, 1)
intensity *= LODParam; // usually 1.0
intensity *= cb4_v1.x; // 1.0

// Sample depth
float2 ScreenUV = Input.PositionH.xy * invViewportSize;
float hardwareDepth = texture15.SampleLevel( sampler15, ScreenUV, 0 ).x;
float frustumDepth = getFrustumDepth( hardwareDepth );


// * Calculate mask covering distant objects behind cylinder.

// Seems that the input really is world-space height (.z component, see vertex shader)
float depth = frustumDepth - WorldHeight;
float distantObjectsMask = saturate( depth * depthScale );

// * calculate final mask
float finalEffectMask = saturate( intensity * distantObjectsMask );

// cb0_v7.y and cb4_v7.x are set to 1.0 so I didn't bother with naming them :)
float paramX = finalEffectMask;
float paramY = cb0_v7.y * finalEffectMask;
float effectAmount = lerp(paramX, paramY, cb4_v7.x);

// color of shafts comes from contant buffer
float3 effectColor = effectAmount * shaftsColor;

// gamma correction
effectColor = pow(effectColor, 2.2);

// final multiplications
effectColor *= finalColorFilter;
effectColor *= finalEffectIntensity;

// return with zero alpha 'cause the blending used here is:
// SourceColor * 1.0 + (1.0 - SrcAlpha) * DestColor
return float4( effectColor, 0.0 );
}




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


All Articles