рдЕрдм рдЬрдм рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рджреВрд░рд╕реНрде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдардВрдбреА рдЪреАрдЬреЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реЙрдлреНрдЯ рдЯреВ-рдбрд╛рдпрдореЗрдВрд╢рдирд▓ рд╢реИрдбреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ (рдПрд╕рдбреАрдПрдл) рдкрд░ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ
рд╕рд╛рдзрд╛рд░рдг рдЖрдХреГрддрд┐рдпреЛрдВ рдкрд░ рдПрдХ
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
[GIF рдкреБрдирд░реНрд╕рдВрд░рдЪрдирд╛ рдХреЗ рджреМрд░рд╛рди рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред]
рдореВрд▓ рд╡рд┐рдиреНрдпрд╛рд╕
рдореИрдВрдиреЗ рдПрдХ рдХрдорд░реЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдпрд╛, рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ x рдФрд░ y рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ 2 рдХреЗ рд▓рд┐рдП рдПрдмреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдореИрдВрдиреЗ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рднрд╛рдЧреЛрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХреГрддрд┐ рдХреА рджреВрд░реА рдХреЛ рдЙрд▓рдЯрд╛ рдХрд░ рджрд┐рдпрд╛ред
рд╣рдо shader рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ
2D_SDF.cginc рдлрд╛рдЗрд▓ рдХреЙрдкреА рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
Shader "Tutorial/037_2D_SDF_Shadows"{ Properties{ } SubShader{
рдпрджрд┐ рд╣рдо рдЕрднреА рднреА рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдВрдХрдбрд╝рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рд╕рд░рд▓ рдЫрд╛рдпрд╛
рддреЗрдЬ рдЫрд╛рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирдореВрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдореЗрдВ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреЛрдИ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рд╣рдо рдмрд┐рдирд╛ рдмрд╛рдзрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рд╣реИред
рд╣рдо рдмреАрдо рдХреЗ рдореВрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдмреАрдо рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ (рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рд╣рдо рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рдФрд░ рдПрдХ рд▓рдХреНрд╖реНрдп рдмрд┐рдВрджреБ (рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐) рд╣реИред рд╣рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛рдИ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рд╢рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рд╕реЗ рдЕрдВрдд рддрдХ рдШрдЯрд╛рдХрд░ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдХреЗ рджрд┐рд╢рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓рдВрдмрд╛рдИ рдХреЛ рдкрджреЛрдВ рдХреЛ рдШрдЯрд╛рдХрд░ рдФрд░
length
рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рди рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
float traceShadow(float2 position, float2 lightPosition){ float direction = normalise(lightPosition - position); float distance = length(lightPosition - position); }
рдлрд┐рд░ рд╣рдо рдкреБрдирд░рд╛рд╡реГрддрд┐ рд▓реВрдк рдореЗрдВ рдХрд┐рд░рдг рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реИрдВред рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдШреЛрд╖рдгрд╛ рдореЗрдВ рд▓реВрдк рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд▓реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рд╢реЗрдбрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд▓реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдЕрднреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп 0. рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реВрдк рдореЗрдВ, рд╣рдо рдмреАрдо рдХреА рджрд┐рд╢рд╛ рдХреЛ рдЖрдзрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдмреАрдо рдХреА рджрд┐рд╢рд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдирдореВрдирд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЪрдХреНрд░ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреГрд╢реНрдп рдХреА рджреВрд░реА 1 рдХреЗ рдХрд░реАрдм рд╣реИ, рддреЛ рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмреАрдо рдПрдХ рдЖрдВрдХрдбрд╝рд╛ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ 0. рдпрджрд┐ рдХрд┐рд░рдг рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╕реЗ рджреВрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдЧреЗ рдлреИрд▓рддреА рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдмрд┐рдирд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдкрд╣реБрдВрдЪ рдЧрдП рдФрд░ рдорд╛рди рд▓реМрдЯрд╛рдПрдВ 1ред
рдпрджрд┐ рд░рд┐рдЯрд░реНрди рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирдореВрдиреЗ рдХреА рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмреАрдо рдЙрдиреНрдирддрд┐ рджреГрд╢реНрдп рдореЗрдВ рджреВрд░реА рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рджреГрд╢реНрдп рдореЗрдВ рджреВрд░реА рд╣рдореЗрдВ рдирд┐рдХрдЯрддрдо рдЖрдВрдХрдбрд╝реЗ рд╕реЗ рджреВрд░реА рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдмреАрдо рдореЗрдВ рдЗрд╕ рдорд╛рди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдВрднрд╡рддрдГ рдмреАрдо рдХреЛ рдирд┐рдХрдЯрддрдо рдЖрдВрдХрдбрд╝реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╛ рдЙрд╕рд╕реЗ рдкрд░реЗ рднреА рдирд╣реАрдВ рдлреЗрдВрдХ рдкрд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЫрд╛рдпрд╛ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рд╣рдордиреЗ рдХреБрдЫ рднреА рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдЬрдм рддрдХ рдирдореВрдирд╛ рдХрд╛ рд╕реНрдЯреЙрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ (рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛) рддрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛, рддреЛ рд╣рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЕрднреА рднреА рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рд╣рдо 0 рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
#define SAMPLES 32 float traceShadows(float2 position, float2 lightPosition){ float2 direction = normalize(lightPosition - position); float lightDistance = length(lightPosition - position); float rayProgress = 0; for(int i=0 ;i<SAMPLES; i++){ float sceneDist = scene(position + direction * rayProgress); if(sceneDist <= 0){ return 0; } if(rayProgress > lightDistance){ return 1; } rayProgress = rayProgress + sceneDist; } return 0; }
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрд┐рд╕реА рднреА рд░рдВрдЧ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреВрд░рд╕реНрде рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдкрд╣рд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдлрд┐рд░ рдореИрдВрдиреЗ рдмрд╕ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдЬреНрдпрд╛рдорд┐рддрд┐ред рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдЬреЛрдбрд╝ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдХрд╛рд░ рд╣рд░ рдЬрдЧрд╣ рдХрд╛рд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рднреА рдЖрдХреГрддрд┐ рд╣реИ рд╡рд╣рд╛рдВ рдЫрд╛рдпрд╛ рдХрд╛рд▓реА рд╣реИред
fixed4 frag(v2f i) : SV_TARGET{ float2 position = i.worldPos.xz;
float2 lightPos; sincos(_Time.y, lightPos.x , lightPos.y ); float shadows = traceShadows(position, lightPos); float3 light = shadows * float3(.6, .6, 1); float sceneDistance = scene(position); float distanceChange = fwidth(sceneDistance) * 0.5; float binaryScene = smoothstep(distanceChange, -distanceChange, sceneDistance); float3 geometry = binaryScene * float3(0, 0.3, 0.1); float3 col = geometry + light; return float4(col, 1); }
рд╢реАрддрд▓ рдЫрд╛рдпрд╛
рдЗрди рдХрдареЛрд░ рдЫрд╛рдпрд╛рдУрдВ рд╕реЗ рдирд░рдо рдФрд░ рдЕрдзрд┐рдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рддрдХ рдЬрд╛рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рдЗрд╕реА рд╕рдордп, shader рдЕрдзрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рдорд╣рдВрдЧрд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯрддрдо рджреГрд╢реНрдп рд╡рд╕реНрддреБ рд╕реЗ рджреВрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдИрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рдХрдЯрддрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЬрд╣рд╛рдВ рд╣рдо 1 рд▓реМрдЯрд╛рддреЗ рдереЗ, рд╡рд╣рд╛рдВ рд╕реЗ рдирд┐рдХрдЯрддрдо рдЖрдХреГрддрд┐ рдХреА рджреВрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рддрд╛рдХрд┐ рдЫрд╛рдпрд╛ рдХреА рдЪрдордХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рди рд╣реЛ рдФрд░ рдЕрдЬреАрдм рд░рдВрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рди рдмрдврд╝реЗ, рд╣рдо рдЗрд╕реЗ
saturate
рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЗрд╕реЗ 0 рд╕реЗ 1 рддрдХ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╡рд░реНрддрдорд╛рди рдирд┐рдХрдЯрддрдо рдЖрдХреГрддрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рдиреНрдпреВрдирддрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рджрд┐рди рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХрд╛ рдХрд┐рд░рдг рд╡рд┐рддрд░рдг рдкрд╣рд▓реЗ рд╣реА рдкрд╣реБрдВрдЪ рдЪреБрдХрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдо рдирдореВрдиреЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЬреАрдм рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
float traceShadows(float2 position, float2 lightPosition){ float2 direction = normalize(lightPosition - position); float lightDistance = length(lightPosition - position); float rayProgress = 0; float nearest = 9999; for(int i=0 ;i<SAMPLES; i++){ float sceneDist = scene(position + direction * rayProgress); if(sceneDist <= 0){ return 0; } if(rayProgress > lightDistance){ return saturate(nearest); } nearest = min(nearest, sceneDist); rayProgress = rayProgress + sceneDist; } return 0; }

рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд╡рд╣ рдЫрд╛рдпрд╛ рдореЗрдВ рдЕрдЬреАрдм "рджрд╛рдВрдд" рд╣реИред рд╡реЗ рдЙрдарддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рджреГрд╢реНрдп рд╕реНрд░реЛрдд рд╕реЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рджреВрд░реА 1 рд╕реЗ рдХрдо рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЗрд╕рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЫрд╛рдпрд╛ рдХреЗ рддреЗрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢реИрдбреЛ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╢рд╛рд░реНрдкрдиреЗрд╕ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛ред рд▓реВрдк рдореЗрдВ, рд╣рдо рддреАрд╡реНрд░рддрд╛ рд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рджреВрд░реА рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ 2 рдХреЗ рддреЗрдЬ рдХреЗ рд╕рд╛рде, рдЫрд╛рдпрд╛ рдХрд╛ рдирд░рдо, рдЧреНрд░реЗ рд╣рд┐рд╕реНрд╕рд╛ рдЖрдзрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рддреАрдЦреЗрдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рддреЗрдЬ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрдо рд╕реЗ рдХрдо 1 рдХреА рджреВрд░реА рдкрд░ рдЖрдВрдХрдбрд╝реЗ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк 20 рдХреА рддреАрд╡реНрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджреВрд░реА рдХрдо рд╕реЗ рдХрдо 0.05 рдЗрдХрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
float traceShadows(float2 position, float2 lightPosition, float hardness){ float2 direction = normalize(lightPosition - position); float lightDistance = length(lightPosition - position); float rayProgress = 0; float nearest = 9999; for(int i=0 ;i<SAMPLES; i++){ float sceneDist = scene(position + direction * rayProgress); if(sceneDist <= 0){ return 0; } if(rayProgress > lightDistance){ return saturate(nearest); } nearest = min(nearest, hardness * sceneDist); rayProgress = rayProgress + sceneDist; } return 0; }

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднреА рдЬрд┐рдиреНрд╣реЗрдВ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдордЬреЛрд░ рд╣реЛрдирд╛ рдЕрднреА рднреА рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдкрд╛рд╕ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫрд╛рдпрд╛ рдХреА рдХреЛрдорд▓рддрд╛ рдкреВрд░реЗ рдЫрд╛рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдХреГрддрд┐ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдкрд░ рдЖрдХреГрддрд┐ рдФрд░ рдирд░рдо рдХреЗ рдмрдЧрд▓ рдореЗрдВ рддреЗрдЬ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЫрд╛рдпрд╛ рд╕реЗ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рд╕реЗ рджреВрд░ рдЬрд╛рддреА рд╣реИред
рд╣рдо рдмреАрдо рдкреНрд░рд╕рд╛рд░ рджреНрд╡рд╛рд░рд╛ рджреГрд╢реНрдп рдореЗрдВ рджреВрд░реА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдмреАрдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреВрд░реА рдХреЛ рдмрд╣реБрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рдд, рд╣рдо рдЕрднреА рднреА рдЙрдЪреНрдЪ рдореВрд▓реНрдпреЛрдВ рдФрд░ рдПрдХ рд╕реБрдВрджрд░ рд╕реНрдкрд╖реНрдЯ рдЫрд╛рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЬрдм рд╣рдо рдХрд┐рд░рдг рдореЗрдВ рдмрд╛рдж рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХрд┐рд░рдг рдХреЗ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рдХреЛ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЫрд╛рдпрд╛ рдХреЛ рдирд░рдо рдмрдирд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рджреВрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЪрд░ рдХреЛ
shadow
рдмрджрд▓ рджреЗрдВрдЧреЗред
рд╣рдо рдПрдХ рдФрд░ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рднреА рдХрд░реЗрдВрдЧреЗ: рдЪреВрдВрдХрд┐ рд╣рдо рд░реЗрдкреНрд░реЛрдЧреНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдкрдХреЛ 0 рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ)ред рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдХрд┐рд╕реА рднреА рдмрд╣реБрдд рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред
float traceShadows(float2 position, float2 lightPosition, float hardness){ float2 direction = normalize(lightPosition - position); float lightDistance = length(lightPosition - position); float rayProgress = 0.0001; float shadow = 9999; for(int i=0 ;i<SAMPLES; i++){ float sceneDist = scene(position + direction * rayProgress); if(sceneDist <= 0){ return 0; } if(rayProgress > lightDistance){ return saturate(shadow); } shadow = min(shadow, hardness * sceneDist / rayProgress); rayProgress = rayProgress + sceneDist; } return 0; }
рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд
рдЗрд╕ рд╕рд░рд▓ рдПрдХрд▓-рдХреЛрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХрдИ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝рдирд╛ред
fixed4 frag(v2f i) : SV_TARGET{ float2 position = i.worldPos.xz; float2 lightPos1 = float2(sin(_Time.y), -1); float shadows1 = traceShadows(position, lightPos1, 20); float3 light1 = shadows1 * float3(.6, .6, 1); float2 lightPos2 = float2(-sin(_Time.y) * 1.75, 1.75); float shadows2 = traceShadows(position, lightPos2, 10); float3 light2 = shadows2 * float3(1, .6, .6); float sceneDistance = scene(position); float distanceChange = fwidth(sceneDistance) * 0.5; float binaryScene = smoothstep(distanceChange, -distanceChange, sceneDistance); float3 geometry = binaryScene * float3(0, 0.3, 0.1); float3 col = geometry + light1 + light2; return float4(col, 1); }
рд╕реНрд░реЛрдд рдХреЛрдб
рджреЛ-рдЖрдпрд╛рдореА рдПрд╕рдбреАрдПрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рджреНрд╡рд┐-рдЖрдпрд╛рдореА рдирд░рдо рдЫрд╛рдпрд╛
Shader "Tutorial/037_2D_SDF_Shadows"{ Properties{ } SubShader{
рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреЗ рдЦреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЕрдм рддрдХ рд╡реЗ рдмрд▓реНрдХрд┐ рдмреЛрдЭрд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ shader рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ shader рдХреЗ рдЧреБрдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред