XNA рдбреНрд░рд╛: рдЦреЗрд▓ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░



рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред

Habr├й рдкрд░ рдореЗрд░реЗ рд╕рднреА рдЖрда рд▓реЗрдЦ рдЦреЗрд▓ рджреЗрд╡ рдкрд░ рд▓реЗрдЦ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ XNA рдЬреИрд╕реЗ рдЕрджреНрднреБрдд рдврд╛рдВрдЪреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВред XNA рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдкрд░рд┐рдЪрд┐рдд рдПрдХ рд╕рдВрдЧреАрдд рдЦрд┐рд▓реМрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдерд╛, рдлрд┐рд░ рд▓реЗрдЦреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝реА, рдореИрдВрдиреЗ рдХрдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╢реЗрдбреНрд╕ рдФрд░ рд╢реЗрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

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



рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ - рдирд┐рд╡рд╛рд╕ рдХреЗ рддрд╣рддред

рдкрд░рд┐рдЪрдп


рд╣рдо рдлрд┐рд░ рд╕реЗ рдЧреЗрдореНрд╕ рдХреЗ 2 рдбреА рдХрдВрдкреЛрдиреЗрдВрдЯ рдкрд░ рдЯрдЪ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рд╢реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

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

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

рд╡рд┐рд░реВрдкрдг (рд╡рд┐рдХреГрддрд┐)


рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рдкрд╣рд▓рд╛ рдкреНрд░рднрд╛рд╡ рд╡рд┐рдХреГрддрд┐ рд╣реИ:


рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ shader рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЙрд╕ рд▓реЗрдЦ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ред

рдЖрдЗрдП рдЙрд╕ рд╡рд┐рд╕реНрдлреЛрдЯ рдкреНрд░рднрд╛рд╡ рдХреЛ рджреЗрдЦреЗрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рд╡рдЯ рдпрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


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

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

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

рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджреЗрдВ:


HUD рд╡рд┐рд░реВрдкрдг



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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдореГрддреНрдпреБ:


рдпрд╣ shader рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╣реИ - рдЫрд╡рд┐ рд╡рд┐рд░реВрдкрдгред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реИред рд╡рд┐рдХреГрддрд┐рдпрд╛рдВ рд╡рд┐рдХреГрддрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░реЛрдВ рд╕реЗ, рдЖрдЗрдП shader рдХреЛрдб рджреЗрдЦреЗрдВ (shader рд╕рдордЭрдиреЗ рдореЗрдВ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ):

float force; //  ""  float timer; //  ,   . float random1; //   float random2; //   float initialization; //   ""  float desaturation_float; //    sampler TextureSampler : register(s0); float4 main(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 { texCoord.y += cos(texCoord.x) * timer * 0.0002f * force; //  if(initialization > 0) { texCoord.x += cos(texCoord.y) * initialization; //  } if(texCoord.y > random1 && texCoord.y < random2) //  { float moving = force; if(timer > 100) moving *= -1.0; texCoord.x += timer / 5000.0 * moving * random2; color *= 1 + random2 * force; } if(timer < 20 && force > 0.3) //   { color.b = random2; color.g = random1; } if(timer > 50) //  "" { color *= 1 + random1/3 * (1 + force); } float4 source = tex2D(TextureSampler, texCoord); float4 sourceR = tex2D(TextureSampler, texCoord + float2(0.01*force*random1, 0)); sourceR.g = 0; sourceR.b = 0; float4 sourceB = tex2D(TextureSampler, texCoord - float2(0.01*force*force*random2, 0)); sourceB.r = 0; sourceB.g = 0; float4 sourceG = tex2D(TextureSampler, texCoord - float2(0.01*force*((random1+random2) / 2), 0)); sourceG.r = 0; sourceG.b = 0; float4 output = (sourceR+sourceB+sourceG); output.a = source.a; float greyscale = dot(output.rgb, float3(0.3, 0.59, 0.11)); output.rgb = lerp(greyscale, output.rgb, 1.0 - desaturation_float); return color * output; } technique HUDDisplacer { pass DefaultPass { PixelShader = compile ps_2_0 main(); } } 


рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ shader рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдирджрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИред

рд╕реНрдереИрддрд┐рдХ рдмрдирд╛рд╡рдЯ рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдмрдирд╛рд╡рдЯ



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

рдЗрд╕ shader рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 float modifer; //   sampler TextureSampler : register(s0); float4 main(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 { float4 output = tex2D(TextureSampler, texCoord); float greyscale = dot(output.rgb, float3(0.3, 0.59, 0.11)); if(greyscale > 0.2) { color *= 1 + (modifer*greyscale / 1.5); if(greyscale > 0.8) { color *= 1 + (modifer*2); } } return color * output; } technique BackgroundShader { pass DefaultPass { PixelShader = compile ps_2_0 main(); } } 


рдпрджрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЪрдордХ ( рдЧреНрд░реЗрд╕реНрдХреЗрд▓ ) 20% рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ - рдПрдХ рдорд╛рдореВрд▓реА рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЕрдЧрд░ 80% рд╕реЗ рдЕрдзрд┐рдХ - рдордЬрдмреВрддред
рдпрд╣ рдЪрд┐рддреНрд░ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рд╕рдм рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред

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

рдмреНрд▓реВрдо (рдЪрдордХ рдкреНрд░рднрд╛рд╡)



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

рддрд╕реНрд╡реАрд░реЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг:
рджреГрд╢реНрдп рдЪрдордХ:


рдореВрд▓ рджреГрд╢реНрдп:


рддреИрдпрд╛рд░ рджреГрд╢реНрдп:


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

 sampler TextureSampler : register(s0); float4 main(float2 texCoord : TEXCOORD0) : COLOR0 { float4 c = tex2D(TextureSampler, texCoord); float BloomThreshold = 0.1; return saturate((c - BloomThreshold) / (1 - BloomThreshold)); } technique ThresholdEffect { pass DefaultPass { PixelShader = compile ps_2_0 main(); } } 


рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрдбрд░ рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛:

 texture bloomMap; sampler TextureSampler : register(s0); sampler BloomSampler : samplerState { Texture = bloomMap; MinFilter = Linear; MagFilter = Linear; AddressU = Clamp; AddressV = Clamp; }; // -  const float2 offsets[12] = { -0.326212, -0.405805, -0.840144, -0.073580, -0.695914, 0.457137, -0.203345, 0.620716, 0.962340, -0.194983, 0.473434, -0.480026, 0.519456, 0.767022, 0.185461, -0.893124, 0.507431, 0.064425, 0.896420, 0.412458, -0.321940, -0.932615, -0.791559, -0.597705, }; float4 AdjustSaturation(float4 color, float saturation) { float grey = dot(color, float3(0.3, 0.59, 0.11)); return lerp(grey, color, saturation); } float4 main(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 { float BlurPower = 0.01; // 0.01 float BaseIntensity = 1; float BloomIntensity = 0.4; // 0.4 float BaseSaturation = 1; float BloomSaturation = 1; float4 original = tex2D(TextureSampler, texCoord); //  float4 sum = tex2D(BloomSampler, texCoord); for(int i = 0; i < 12; i++){ sum += tex2D(BloomSampler, texCoord + BlurPower * offsets[i]); } sum /= 13; original = AdjustSaturation(original, BaseSaturation) * BaseIntensity; sum = AdjustSaturation(sum, BloomSaturation) * BloomIntensity; return sum + original; } technique BloomEffect { pass DefaultPass { PixelShader = compile ps_2_0 main(); } } 


рдореЛрд╢рди рдмреНрд▓рд░


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



рдпрд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рднреА, рдХрд╛рдлреА рд╕рд░рд▓:
 float rad = direction_move.x; float xOffset = cos(rad); float yOffset = sin(rad); for(int idx=0; idx<15; idx++) { texCoord.x = texCoord.x - 0.001 * xOffset * direction_move.y; texCoord.y = texCoord.y - 0.001 * yOffset * direction_move.y; c += tex2D(TextureSampler, texCoord); } c /= 15; 


рдЬрд╣рд╛рдВ direction_move рдореЛрд╢рди рд╡реЗрдХреНрдЯрд░ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖



рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреА рдорджрдж рд╕реЗ - рдЖрдк рдЕрдкрдиреЗ рдЦреЗрд▓ рдХреЛ рдПрдХ рдмрдбрд╝рд╛ "рдЯреНрд╡рд┐рд╕реНрдЯ" рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдЗрд╕ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, 2 рдбреА рдЧреЗрдо рдкрд░ "рдХреЛрд░реНрд╕" рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдореИрдВ рддреАрди-рдЖрдпрд╛рдореА рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ред

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

PSS рдЧрд▓рддрд┐рдпреЛрдВ / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЕрдиреБрд░реЛрдз, рдореБрдЭреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрджреЗрд╢ рд▓рд┐рдЦреЗрдВ, рдПрдХ рдЙрдкрдпреЛрдЧреА рд╢рдмреНрджрд╛рд░реНрде рднрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдЯрд┐рдкреНрдкрдгреА рди рд▓рд┐рдЦреЗрдВред

PSSS рдирдП рд╕рдВрдкрд░реНрдХреЛрдВ рд╕реЗ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ ;-)

рдореИрдВ рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдХреА рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ!

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


All Articles