XNA рдбреНрд░рд╛: рдПрдХ рд╢реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреАрди рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд▓рд┐рдЦреЗрдВ

рд╣рдмреНрд░рд╡рдЪрдо рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╣рдмрд░ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдерд╛: рдЕрдзреНрдпрдпрди, рд╕рддреНрд░ рдЖ рд░рд╣рд╛ рд╣реИ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВред рдЖрдЬ рдореИрдВ рддреАрди рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ XNA рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ (рд╡рд┐рд▓рдВрдмрд┐рдд рдкреНрд░рдХрд╛рд╢) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛, рдЬрдмрдХрд┐ рд╣рдо Reach рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдФрд░ Shader рдореЙрдбрд▓ 2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА shaders рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдЫреБрдЖ: рдпрд╣рд╛рдБ ред рдмрд╛рдХреА рдХрдЯреМрддреА, рд╡реАрдбрд┐рдпреЛ рдФрд░ рдбреЗрдореЛ рдХреЗ рддрд╣рдд рд╣реИред







рдЗрд╕ рднрд╛рдЧ рдореЗрдВ:

рд╕рд┐рджреНрдзрд╛рдВрдд


рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреАрди рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреНрдпреЛрдВ? рд╢реЗрдбрд░реНрд╕ рдХреА рд╕реАрдорд╛рдПрдВ рд╣реИрдВ: рд╢реЗрдбрд░ рдореЙрдбрд▓ 2.0 рдореЗрдВ , рдПрдХ рд╣реА рд╢реЗрдбрд░ рдкрд╛рд╕ рдореЗрдВ 64 рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкрд╛рд╕ рдореЗрдВ рддреАрди рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рд╢реЗрдбрд░ рдореЙрдбрд▓ 3.0 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ 512 рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓рдЧрднрдЧ ~ 30 рд╕реНрд░реЛрдд рдкреНрд░рддрд┐ рдкрд╛рд╕ред рд▓реЗрдХрд┐рди рдореЙрдбрд▓ 3.0 рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЫрд┐рдкрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ 10-рдЙрдкрдпреБрдХреНрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЦреБрдж рдХреЛ рддреАрди рд╕реНрд░реЛрддреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдЬреЛ рдХрдИ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдбреНрд░рд╛рдЗрдВрдЧ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рддреАрди рд╕реНрд░реЛрдд рдХреЗрд╡рд▓ рдПрдХ shader рдХреА рд╕реАрдорд╛ рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ)ред

рд╡реИрд╕реЗ, shader рдореЙрдбрд▓ рдХреА рддреБрд▓рдирд╛:



рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рджреВрд╕рд░реЗ рдореЙрдбрд▓ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбреНрд╕ рдХреА рд╕реАрдорд╛рдПрдБ рдЫрдБрдЯрдиреА рд▓рдЧрддреА рд╣реИрдВред

рдЕрдм рдПрдХ рдФрд░ рдЕрдЬреАрдм рд╢рдмреНрдж рджреЗрдЦреЗрдВ: " рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ ( рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ )ред"

рд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢

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

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

рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЬреЛ рдЖрд╕реНрдердЧрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╕рдордЭ рд▓рд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдореИрдкрд┐рдВрдЧ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░рдг

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

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЬреАрдд рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдФрд░ рдлрд┐рд░ рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп рджрд┐рдЦрддрд╛ рд╣реИ:


рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП (рд╕рд╛рдорд╛рдиреНрдп рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛) рджрд┐рдЦрддрд╛ рд╣реИ:


рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░рд╛ рджреГрд╢реНрдп рдкреНрд░рдХрд╛рд╢ (рд╕рд╛рдорд╛рдиреНрдп рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рджрд┐рдЦрддрд╛ рд╣реИ:


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

рдмрдирд╛рд╡рдЯ рдЦреБрдж ( рд░рдВрдЧ рдирдХреНрд╢рд╛ ):



рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рд╡рдЯ ( рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ ):



рджреВрд╕рд░реА рдмрдирд╛рд╡рдЯ рдкрд░, рдЖрдкрдХреЛ рддреБрд░рдВрдд рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реИ, рд╡рд┐рд╕реНрдерд╛рдкрди shader рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдпрд╛рдж рд░рдЦреЗрдВ? рд╡рд╣рд╛рдБ рд╣рдо R, G рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдореЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдБ, рд╣рдо R, G, B, рдЕрд░реНрдерд╛рддреН рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдорд╛рдирджрдВрдбреЛрдВ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрд░ = рдПрдХреНрд╕, рдЬреА = рд╡рд╛рдИ, рдмреА = рдЬреЗрдбред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЗрдбрд░ рдореЗрдВ, рд╣рдо рдкреНрд░рдХрд╛рд╢, рд╕рд░рд▓, рд╕рд╣реА рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?

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

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

рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдордЭ рд▓реЗрддреЗ рд╣реИрдВ, рдЖрдЗрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдЕрднреНрдпрд╛рд╕


рдпрд╣рд╛рдВ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рджреЗ рджреВрдВрдЧрд╛ред
рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рджреГрд╢реНрдп рдмрдирд╛рдПрдБ, рд▓рд╛рдЗрдЯрдорд┐рдЯрд░ рд╡рд░реНрдЧ:
public class LightEmmiter { //      : X, Y, Z public Vector3 position; //   public Vector3 color; //   (  тАФ ) public float corrector; //   public float radius; //       internal void UpdateEffect(EffectParameter effectParameter) { effectParameter.StructureMembers["position"].SetValue(position); effectParameter.StructureMembers["color"].SetValue(color * corrector); effectParameter.StructureMembers["invRadius"].SetValue(1f / radius); } } 


рдЕрдм рд╣рдо Game1 (рдореБрдЦреНрдп рд╡рд░реНрдЧ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
рдЪрд░ рдмрдирд╛рдПрдВ:
 Texture2D texture; // Color  ( ) Texture2D textureNormal; // Normal  private Effect deferred; //  SpriteFont spriteFont; // ,   Debug- EffectParameter lightParameter; //     private float lightRadius; //     private float lightZ; //   Z-  private float lightC; //     LightEmmiter[] lights = new LightEmmiter[2]; //   


рдЕрдм рдпрд╣ рд╕рднреА LoadContent рдореЗрдердб рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 texture = Content.Load<Texture2D>("test1"); //   textureNormal = Content.Load<Texture2D>("test1_map"); //   deferred = Content.Load<Effect>("deferred"); //   spriteFont = Content.Load<SpriteFont>("default"); //   lightRadius = 320f; //    lightZ = 50f; //   Z- lightC = 1f; //    lights[0] = new LightEmmiter(); lights[0].position = new Vector3(20, 30, 0); lights[0].radius = lightRadius; lights[0].corrector = lightC; lights[0].color = new Vector3(1f, 0f, 0f); lights[1] = new LightEmmiter(); lights[1].position = new Vector3(20, 30, 0); lights[1].radius = lightRadius; lights[1].corrector = lightC; lights[1].color = new Vector3(1f, 1f, 1f); 


рдЕрдкрдбреЗрдЯ рд╕реНрд╡рдпрдВ рдмрдирд╛рдПрдВ :
 //     RenderTarget тАФ  GraphicsDevice.Clear(Color.LightSkyBlue); GraphicsDevice.SetRenderTarget(null); //     lights[0].position = new Vector3(Mouse.GetState().X, Mouse.GetState().Y, lightZ); lights[0].radius = lightRadius; lights[0].corrector = lightC; lights[1].position = new Vector3(800 - Mouse.GetState().X, 480 - Mouse.GetState().Y, lightZ); lights[1].radius = lightRadius; lights[1].corrector = lightC; //   deferred.CurrentTechnique = deferred.Techniques["Deferred"]; //    deferred.Parameters["screenWidth"].SetValue(GraphicsDevice.Viewport.Width); deferred.Parameters["screenHeight"].SetValue(GraphicsDevice.Viewport.Height); deferred.Parameters["ambientColor"].SetValue(new Vector3(1, 1, 1) * 0.1f); deferred.Parameters["numberOfLights"].SetValue(2); deferred.Parameters["normaltexture"].SetValue(textureNormal); //    lights-   lightParameter = deferred.Parameters["lights"]; //  lights-    for (int i = 0; i < lights.Length; i++) { LightEmmiter l = lights[i]; l.UpdateEffect(lightParameter.Elements[i]); } //   (   ) foreach (EffectPass pass in deferred.CurrentTechnique.Passes) { spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullCounterClockwise); pass.Apply(); spriteBatch.Draw(texture, new Rectangle(0, 0, 800, 480), Color.White); spriteBatch.End(); } //  Debug- spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullCounterClockwise, null); //800 480 spriteBatch.DrawString(spriteFont, "lightRadius: " + lightRadius + "\nlightCorrector: " + lightC + "\nligthZ: " + lightZ, new Vector2(10, 10), Color.LightYellow); spriteBatch.End(); 


рд╕рдм, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдЫреЛрдбрд╝ рджрд┐рдпрд╛, deferred.fx shader рдмрдирд╛рдПрдБ, рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ:
 //   ,   struct Light { float3 position; float3 color; float invRadius; }; //   texture normaltexture; // -      3-  int numberOfLights; Light lights[3]; //   float3 ambientColor; // ,   float screenWidth; float screenHeight; //  Color- () sampler ColorMap : register(s0); //  Normal- sampler NormalMap : samplerState { Texture = normaltexture; MinFilter = Linear; MagFilter = Linear; AddressU = Clamp; AddressV = Clamp; }; //      float3 CalculateLight(Light light, float3 normal, float3 pixelPosition) { //  float3 direction = light.position - pixelPosition; float atten = length(direction); direction /= atten; //      float amount = max(dot(normal, direction), 0); atten *= light.invRadius; //  ,  modifer       ,         float modifer = max((1 - atten), 0); //     return light.color * modifer * amount; } float4 DeferredNormalPS(float2 texCoords : TEXCOORD0) : COLOR { float4 base = tex2D(ColorMap, texCoords); //    color-   texCoords float3 normal = normalize(tex2D(NormalMap, texCoords) * 2.0f - 1.0f); //   X,Y,Z  -   texCoords     : -1, 1. //    float3 pixelPosition = float3(screenWidth * texCoords.x, screenHeight * texCoords.y,0); //  - float3 finalColor = 0; for (int i=0;i<numberOfLights;i++) { //          finalColor += CalculateLight(lights[i], normal, pixelPosition); } //   ,  *     ,  multiply          return float4((ambientColor + finalColor) * base.rgb, base.a); } technique Deferred { pass Pass0 { PixelShader = compile ps_2_0 DeferredNormalPS(); } } 


рдмрд╕ рдЗрддрдирд╛ рд╣реА, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ - рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрдИ рд╢реЗрдб рдкрд╛рд╕реЛрдВ рд╕реЗ рдЕрдирдВрдд рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;)

рдкреНрд░рдХрд╛рд╢ рдкреНрд░рджрд░реНрд╢рди рд╡реАрдбрд┐рдпреЛ:


рдбреЗрдореЛ (exe) рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ: рдпрд╣рд╛рдВ ред
рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд▓рд┐рдВрдХ (рдкрд░рд┐рдпреЛрдЬрдирд╛, рд╡реАрдПрд╕2010): рдпрд╣рд╛рдВ ред

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

рд╕реМрднрд╛рдЧреНрдп;)

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


All Articles