рдпрджреНрдпрдкрд┐ рдореЗрд╢ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рдмрд╣реБрдореБрдЦреА рддрд░реАрдХрд╛ рд╣реИ, 2 рдбреА рдФрд░ 3 рдбреА рдореЗрдВ рдЖрдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдПрдХ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рджреВрд░реА рдХреНрд╖реЗрддреНрд░ (рдПрд╕рдбреАрдПрдл) рд╣реИрдВред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрдо рдЦрд░реНрдЪреАрд▓реА рдХрд┐рд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдореЗрдВ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рдФрд░ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдо-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрдирд╛рд╡рдЯ рдкрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рд╣рдо рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ 3 рдбреА рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдореИрдВ рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдирд┐рд░реНрднрд░ рд░рд╣реЗрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдПрдХ рдлреНрд▓реИрдЯ рдУрд╡рд░рд▓реЗ рдкрд░ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдлрд╛рдЙрдВрдбреЗрд╢рди рдХреА рддреИрдпрд╛рд░реА
рд╣рдо рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЖрдзрд╛рд░ рдлреНрд▓реИрдЯ рдУрд╡рд░рд▓реЗ рд╢реЗрдбрд░ рд╕реЗ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рддрдХрдиреАрдХреА рдЖрдзрд╛рд░ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВрдЧреЗред рдлрд┐рд░ рд╣рдо рджреБрдирд┐рдпрд╛ рдХреЗ рд╢реАрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реАрдзреЗ рдЦрдВрдб рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕реЗ рдпреВрд╡реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рддреИрдпрд╛рд░реА рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рджреГрд╢реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рдХрдЯрддрдо рд╕рддрд╣ рдкрд░ рджреВрд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
Shader "Tutorial/034_2D_SDF_Basics"{ SubShader{
рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреВрдВрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдКрдВрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдХреЛрдИ рдмреБрд░рд╛рдИ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢рд░реНрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд░ рд╕реЗрдЯ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╢рд░реНрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдирд┐рд░реНрдорд╛рдг рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЛ рдмрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдФрд░ рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ), рддреЛ рдпрд╣ shader рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддреЛ рдЖрдк рдпрд╣ рдЪреЗрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдпрджрд┐ рд╢рд╛рдорд┐рд▓ рдлрд╝рд╛рдЗрд▓ рдореБрдЦреНрдп shader рдХреЗ рд╕рдорд╛рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдЧреНрдо рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рддрд╣ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд▓реА рд╕рддрд╣ рджреЗрдЦреЗрдВрдЧреЗ, рдЙрд╕ рдкрд░ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреВрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рджреМрд░
рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╕рд░реНрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдирдореВрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рд░реНрдХрд▓ рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рд╣рдо рдирдореВрдирд╛ рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рд╣рдореЗрдВ рд╕реНрдерд┐рддрд┐ (0, 0) рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ 0 рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рд╡рд╛рд▓реЗ рд╡реГрддреНрдд рдХреЗ рд╕рдорд╛рди рд╣реИред
float circle(float2 samplePosition, float radius){ return length(samplePosition); }
рдлрд┐рд░ рдЖрдк рд╕рд░реНрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рджреВрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
float scene(float2 position) { float sceneDistance = circle(position, 2); return sceneDistance; }

рдлрд┐рд░ рд╣рдо рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рддреНрд░рд┐рдЬреНрдпрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рддрд╣ рдкрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рджреВрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рд╣реИ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рд╣реИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рджреВрд░рд╕реНрде рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐)ред рд╕рд░реНрдХрд▓ рдХреЛ рдПрдХ рддреНрд░рд┐рдЬреНрдпрд╛ рдореЗрдВ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рд▓рдВрдмрд╛рдИ рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рддрд╣, рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди 0 рджреЗрддрд╛ рд╣реИ, рдмрд╛рд╣рд░ рдХреА рдУрд░ рдмрдврд╝рддрд╛ рд╣реИред рд╡рд╣ рдЬреЛ 0 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░реНрдХрд▓ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рд╕реЗ рджреВрд░реА рдХреА рджреЛ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рд╣реИ, 1 рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░реНрдХрд▓ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ, рдФрд░ 3 рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рд╡рд╛рд▓реЗ рд╕рд░реНрдХрд▓ рдХреЗ рд▓рд┐рдП рд╕рд░реНрдХрд▓ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЗрдХрд╛рдИ (рдореВрд▓реНрдп -1) рд╣реИ;
float circle(float2 samplePosition, float radius){ return length(samplePosition) - radius; }

рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдХреЗрдВрджреНрд░ рд╕реЗ рд╕рд░реНрдХрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирдореВрдирд╛ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рд░реНрдХрд▓ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдирдпрд╛ рддрд░реНрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рд░реНрдХрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рди рд╕реЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛, рдЖрдк рдирдореВрдирд╛ рдмрд┐рдВрджреБ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдореВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдЪрдХреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рднреА рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
рд╡рд┐рд╕реНрдерд╛рдкрди
"рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди" - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд┐рдВрджреБ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЕрднреА рднреА рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдмрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдСрдлрд╕реЗрдЯ рдШрдЯрд╛рддреЗ рд╣реИрдВред рд╕реНрдерд┐рддрд┐ рдХреЛ рддрдм рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╕реНрдерд┐рддрд┐
(3, 4)
рдореЗрдВ рдПрдХ рдЧреЛрд▓реЗ рдХреЛ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реНрдерд╛рди рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐
(3, 4)
рдмрджрд▓ рдЬрд╛рдП
(0, 0)
, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ
(3, 4)
рдХреЛ рдШрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдм рдпрджрд┐ рд╣рдо рдПрдХ
рдирдП рдмрд┐рдВрджреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ
рдкреБрд░рд╛рдирд╛ рдмрд┐рдВрджреБ
(3, 4)
ред
float scene(float2 position) { float2 circlePosition = translate(position, float2(3, 2)); float sceneDistance = circle(circlePosition, 2); return sceneDistance; }
рдЖрдпрдд
рдПрдХ рдФрд░ рд╕рд░рд▓ рдЖрдХрд╛рд░ рдПрдХ рдЖрдпрдд рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдШрдЯрдХреЛрдВ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╣рдо рдХреЗрдВрджреНрд░ рд╕реЗ рджреВрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рд░рдкреЗрдХреНрд╖ рдореВрд▓реНрдп рд▓реЗрддреЗ рд╣реИрдВред рдлрд┐рд░, рдПрдХ рд╕рд░реНрдХрд▓ рдХреЗ рд╕рдорд╛рди, рд╣рдо рдЖрдзреЗ рдЖрдХрд╛рд░ рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВ (рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЖрдпрдд рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ)ред рдХреЗрд╡рд▓ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рджрд┐рдЦреЗрдВрдЧреЗ, рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдШрдЯрдХ рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗред
float rectangle(float2 samplePosition, float2 halfSize){ float2 componentWiseEdgeDistance = abs(samplePosition) - halfSize; return componentWiseEdgeDistance.x; }
рдЕрдм рд╣рдо рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдШрдЯрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдЖрдпрдд рдХрд╛ рдПрдХ рд╕рд╕реНрддрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред 2. рдпрд╣ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдиреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рд╣реА рджреВрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЖрдХреГрддрд┐ рдХреЗ рдмрд╛рд╣рд░ рдЖрдпрдд рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдорд╛рди рдкрд╣рд▓реЗ рдХрд┐рдирд╛рд░реЛрдВ рдФрд░ 0 рдХреА рджреВрд░реА рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдиреАрдЪреЗ рд╕реЗ рджреВрд░реА рдХреЛ 0 рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рдХреЛрдиреЛрдВ (рдЬрд╣рд╛рдВ рдХрд┐рдирд╛рд░реЗ рдХреА рджреВрд░реА
(0, 0)
) рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 0 рд╕реЗ рдиреАрдЪреЗ рдирд╣реАрдВ рдЧрд┐рд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдХрд┐рдирд╛рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ 0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдХреГрддрд┐ рдХреЗ рдкреВрд░реЗ рдЕрдВрджрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдирд╛рд░реЗ рд╕реЗ рджреВрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреВрд░реЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рджреВрд░реА 0 рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЖрдпрдд рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмрд╕ рд╕рд╕реНрддреЗ рдЖрдпрдд рдлрд╛рд░реНрдореВрд▓реЗ (x рдФрд░ y рдШрдЯрдХ рд╕реЗ рдЕрдзрд┐рдХрддрдо рдорд╛рди рд▓реЗрддреЗ рд╣реБрдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдФрд░ рдлрд┐рд░ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХрднреА рднреА 0 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рдорд╛рди 0 рд╕реЗ рд▓реЗред рдлрд┐рд░ рд╣рдо рдмрд╛рд╣рд░реА рджреВрд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдХрднреА 0 рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдВрддрд░рд┐рдХ рджреВрд░реА, рдЬреЛ рдХрднреА 0 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдо рд╕рдорд╛рдкреНрдд рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
float rectangle(float2 samplePosition, float2 halfSize){ float2 componentWiseEdgeDistance = abs(samplePosition) - halfSize; float outsideDistance = length(max(componentWiseEdgeDistance, 0)); float insideDistance = min(max(componentWiseEdgeDistance.x, componentWiseEdgeDistance.y), 0); return outsideDistance + insideDistance; }
рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдерд╛, рдЕрдм рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдЗрд╕рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
float scene(float2 position) { float2 circlePosition = translate(position, float2(1, 0)); float sceneDistance = rectangle(circlePosition, float2(1, 2)); return sceneDistance; }
рдореЛрдбрд╝
рдШреВрдорддреА рд╣реБрдИ рдЖрдХреГрддрд┐рдпрд╛рдБ рд╣рд┐рд▓рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдХреГрддрд┐ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдШреБрдорд╛рддреЗ рд╣реИрдВред рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдШреБрдорд╛рд╡реЛрдВ рдХреА рд╕рдордЭ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛрдгреЛрдВ рдХреЛ рд░реЗрдбрд┐рдпрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 * рдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд░реЛрдЯреЗрд╢рди рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЛрдЯреЗрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ 0.25 рдПрдХ рдореЛрдбрд╝ рдХрд╛ рдПрдХ рдЪреМрдерд╛рдИ рд╣реИ, 0.5 рдПрдХ рдореЛрдбрд╝ рдХрд╛ рдПрдХ рдЖрдзрд╛ рд╣реИ, рдФрд░ 1 рдПрдХ рдкреВрд░реНрдг рдореЛрдбрд╝ рд╣реИ (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╣рдо рд░реЛрдЯреЗрд╢рди рдХреЛ рдЙрд▓реНрдЯрд╛ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрд╕реА рджрд┐рд╢рд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдШреБрдорд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЪрд▓рддреЗ рд╕рдордпред
рдШреБрдорд╛рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдЗрди рдФрд░ рдХреЛрд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред Hlsl рдореЗрдВ рдПрдХ sincos рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрди рджреЛрдиреЛрдВ рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рддрдм рддреЗрдЬреА рд╕реЗ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЕрд▓рдЧ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдШрдЯрдХ x рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рджрд┐рд╢ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдореВрд▓ рдШрдЯрдХ x рдХреЛ cosine рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдШрдЯрдХ y рдХреЛ sine рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ 0 рдХрд╛ рдХреЛрд╕рд╛рдЗрди 1 рд╣реИ, рдФрд░ 0 рд╕реЗ рдШреБрдорд╛рдП рдЬрд╛рдиреЗ рдкрд░, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдирдП рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдШрдЯрдХ x рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╣реЛ (рдЬреЛ рдХрд┐ 1 рд╕реЗ рдЧреБрдгрд╛ рд╣реЛ)ред рдШрдЯрдХ y, рдЬреЛ рдкрд╣рд▓реЗ рдКрдкрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рдерд╛, рдиреЗ рдШрдЯрдХ x рдореЗрдВ рдХреЛрдИ рдпреЛрдЧрджрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛, рджрд╛рдИрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдорд╛рди 0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдмрдбрд╝реЗ рд╣реЛрддреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЗрд╕рдХреА рдЧрддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдирдП рд╡реЗрдХреНрдЯрд░ рдХреЗ рдШрдЯрдХ y рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреБрд░рд╛рдиреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдШрдЯрдХ y рджреНрд╡рд╛рд░рд╛ рдХреЛрд╕рд╛рдЗрди рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдШрдЯрдХ x рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдП рдЧрдП рд╕рд╛рдЗрди рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рд╕рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдШрдЯрд╛рдирд╛ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ, рдШрдЯрдХ x рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдШрдбрд╝реА рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдиреЗ рдкрд░ рд╡реЗрдХреНрдЯрд░
(1, 0)
рдмрджрд▓рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХрд╛ y рдШрдЯрдХ 0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ 0. рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдкрд░реАрдд рд╣реИ рдХрд┐ рд╕рд╛рдЗрди рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╛рдЗрди рдмрджрд▓рддреЗ рд╣реИрдВред
float2 rotate(float2 samplePosition, float rotation){ const float PI = 3.14159; float angle = rotation * PI * 2 * -1; float sine, cosine; sincos(angle, sine, cosine); return float2(cosine * samplePosition.x + sine * samplePosition.y, cosine * samplePosition.y - sine * samplePosition.x); }
рдЕрдм рдЬрдм рд╣рдордиреЗ рд░реЛрдЯреЗрд╢рди рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рджреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЖрдХреГрддрд┐ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
float scene(float2 position) { float2 circlePosition = position; circlePosition = rotate(circlePosition, _Time.y); circlePosition = translate(circlePosition, float2(2, 0)); float sceneDistance = rectangle(circlePosition, float2(1, 2)); return sceneDistance; }

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреВрд░реЗ рджреГрд╢реНрдп рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдШреБрдорд╛рд╡ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдЖрдХреГрддрд┐ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдШреБрдорд╛рдПрдВред рд░реЛрдЯреЗрд╢рди рдХреЗ рд╕рдордп рддрдХ рдЗрд╕ рдмрджрд▓реЗ рд╣реБрдП рдЖрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг, рдЖрдХреГрддрд┐ рдХрд╛ рдХреЗрдВрджреНрд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдХреЗрдВрджреНрд░ рдмрди рдЬрд╛рдПрдЧрд╛ред
float scene(float2 position) { float2 circlePosition = position; circlePosition = translate(circlePosition, float2(2, 0)); circlePosition = rotate(circlePosition, _Time.y); float sceneDistance = rectangle(circlePosition, float2(1, 2)); return sceneDistance; }
рд╕реНрдХреЗрд▓рд┐рдВрдЧ
рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреИрдорд╛рдиреЗ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХрдо рдкреИрдорд╛рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдЖрдВрдХрдбрд╝рд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдзрд╛рд░ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╡реЗ рдмрдбрд╝реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
float2 scale(float2 samplePosition, float scale){ return samplePosition / scale; }
float scene(float2 position) { float2 circlePosition = position; circlePosition = translate(circlePosition, float2(0, 0)); circlePosition = rotate(circlePosition, .125); float pulseScale = 1 + 0.5*sin(_Time.y * 3.14); circlePosition = scale(circlePosition, pulseScale); float sceneDistance = rectangle(circlePosition, float2(1, 2)); return sceneDistance; }

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рджреВрд░реА рднреА рдорд╛рдкрддрд╛ рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рдирд┐рдХрдЯрддрдо рд╕рддрд╣ рдХреА рджреВрд░реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд╝реВрдо рдЖрдЙрдЯ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рд╛рдЗрди рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдлрд╝рдВрдХреНрд╢рди (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
rectangle
) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рджреВрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд╕рдорд╛рди рдкреИрдорд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде)ред
float scene(float2 position) { float2 circlePosition = position; circlePosition = translate(circlePosition, float2(0, 0)); circlePosition = rotate(circlePosition, .125); float pulseScale = 1 + 0.5*sin(_Time.y * 3.14); circlePosition = scale(circlePosition, pulseScale); float sceneDistance = rectangle(circlePosition, float2(1, 2)) * pulseScale; return sceneDistance; }
рджреГрд╢реНрдп
рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджреВрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЫрд╛рдпрд╛ рдмрдирд╛рдирд╛, 3 рдбреА рджреГрд╢реНрдп, рднреМрддрд┐рдХреА рдФрд░ рдкрд╛рда рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рддрдХ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирдХреЗ рджреГрд╢реНрдп рдХреА рдХреЗрд╡рд▓ рджреЛ рддрдХрдиреАрдХреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВрдЧрд╛ред рдкрд╣рд▓рд╛ рдПрдВрдЯреАрдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╣реИ, рджреВрд╕рд░рд╛ рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рд╣реИред
рд╕реНрдкрд╖реНрдЯ рд░реВрдк
рдпрд╣ рд╡рд┐рдзрд┐ рдЙрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдЕрдХреНрд╕рд░ рдкрд╛рда рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рдлрдВрдХреНрд╢рди рд╕реЗ рджреВрд░реА рдХреНрд╖реЗрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрдирд╛рд╡рдЯ рд╕реЗ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдХрдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╡рд╛рд▓реЗ рдЯреЗрдХреНрд╕рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред TextMesh Pro рдЯреЗрдХреНрд╕реНрдЯ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ рджреВрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рд╣рдо рдХрдЯ-рдСрдл рдмрд┐рдВрджреБ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╣рдо рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рджреВрд░реА рдХреНрд╖реЗрддреНрд░ рдЕрдЧрд▓реЗ рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдХрд┐рддрдирд╛ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдордиреНрд╡рдп рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред
рджреВрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдзреА рджреВрд░реА рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЛ рдШрдЯрд╛рдХрд░ рдШрдЯрд╛рдХрд░ / рдкреНрд▓рд╕ рд╕реЗ рдЖрдзреА рджреВрд░реА рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓рдЧрднрдЧ 0 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЪреМрд░рд╕рд╛рдИ рдХреЗ рд╕рд╛рдеред рдлрд┐рд░ рдЖрдк рдХрд┐рд╕реА рднреА рдмрд╛рдЗрдирд░реА рдорд╛рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрдЪрд╛рд░реВ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ shader рдХреЛ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкреЗрд░реЗрдВрд╕реА shader рдореЗрдВ рдмрджрд▓реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдПрдХ рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╕реЗ рдирд┐рдЧреЗрдЯрд┐рд╡ рд╡реИрд▓реНрдпреВ рддрдХ рдПрдХ рд╕реНрдЯреЗрдкрд╕реНрдЯреЗрдк рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдлреАрд▓реНрдб рдХрд╛ рдиреЗрдЧреЗрдЯрд┐рд╡ рд╡реИрд▓реНрдпреВ рджрд┐рдЦрд╛рдИ рджреЗред рдпрджрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рдХрд┐ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдпрд╣рд╛рдБ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ
рдЕрдкрдиреЗ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛
рд╣реВрдБ ред
fixed4 frag(v2f i) : SV_TARGET{ float dist = scene(i.worldPos.xz); float distanceChange = fwidth(dist) * 0.5; float antialiasedCutoff = smoothstep(distanceChange, -distanceChange, dist); fixed4 col = fixed4(_Color, antialiasedCutoff); return col; }
рдКрдБрдЪрд╛рдИ рдХреА рд░реЗрдЦрд╛рдПрдБ
рджреВрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддрдХрдиреАрдХ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдореИрдВ рдЙрдирдХреЗ рдмреАрдЪ рдХреБрдЫ рдореЛрдЯреА рд░реЗрдЦрд╛рдПрдВ рдФрд░ рдХреБрдЫ рдкрддрд▓реА рд░реЗрдЦрд╛рдПрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдореЗрдВ рдЖрдХреГрддрд┐ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рднреА рдкреЗрдВрдЯ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рд╡рд╕реНрддреБ рдХрд╣рд╛рдВ рд╣реИред
рд╣рдо рдЖрдВрдХрдбрд╝реЗ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд░рдВрдЧреЛрдВ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирдП рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдЖрдХреГрддрд┐ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рд░рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЗрдбрд░ рдЪрд░ рднреАред
Properties{ _InsideColor("Inside Color", Color) = (.5, 0, 0, 1) _OutsideColor("Outside Color", Color) = (0, .5, 0, 1) }
рдлрд┐рд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдВ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо
step
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреВрд░реА рдХреА рддреБрд▓рдирд╛ 0 рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдВрддрд░рд┐рдХ рд╕реЗ рдмрд╛рд╣рд░реА рд░рдВрдЧ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
fixed4 frag(v2f i) : SV_TARGET{ float dist = scene(i.worldPos.xz); fixed4 col = lerp(_InsideColor, _OutsideColor, step(0, dist)); return col; }
рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рддрдиреА рдмрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡реЗ рдХрд┐рддрдиреА рдореЛрдЯреА рд╣реЛрдВрдЧреА, рдЧреБрдгреЛрдВ рдФрд░ рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реЗрдбрд░ рдЪрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ред
рдлрд┐рд░, рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреВрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЪреМрд░рд╕рд╛рдИ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рдЖрдзрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ 1 рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдкрд░рд┐рд╡рд░реНрддрди рджреВрд░реА рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрдзрд╛ рдШрдЯрд╛рддреЗ рд╣реИрдВред
float distanceChange = fwidth(dist) * 0.5;
рдлрд┐рд░ рд╣рдо рджреВрд░реА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛рдПрдВ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛рдПрдВред
рдлрд┐рд░ рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 0.5 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЖрдВрд╢рд┐рдХ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ 0.5 рдлрд┐рд░ рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВред рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧ рдФрд░ рдШрдЯрд╛рд╡ рдХреА рдпрд╣рд╛рдБ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдкрдВрдХреНрддрд┐ рджреЛрд╣рд░рд╛рд╡ рдкреИрдЯрд░реНрди рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рдЧреБрдЬрд╝рд░реЗред 0.5 рдХреЗ рдЖрдЧреЗ рдШрдЯрд╛рд╡ рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо 0.5 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рд╢рд┐рдлреНрдЯ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЬрд┐рди рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЧреНрд░рд╛рдл 0 рд╣реИ, рд╡реЗ 0, 1, 2, рдЖрджрд┐ рдкрд░ рд╣реИрдВ, рдФрд░ 0.5, 1.5 рдкрд░ рдирд╣реАрдВред рдЖрджрд┐
рдорд╛рди рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЪрд░рдг - рд╣рдо рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рди рд░реЗрдЦрд╛ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рдорд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрддрд░рди рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╕реЗ рдореВрд▓реНрдп рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдореАрдХрд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдлрд┐рд░ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рджреВрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдЧрдгрдирд╛ рдЕрднреА рднреА рд╕рд╣реА рд╣реИред

float majorLineDistance = abs(frac(dist / _LineDistance + 0.5) - 0.5) * _LineDistance;
рдЕрдм рдЬрдм рд╣рдордиреЗ рдЖрдХреГрддрд┐ рдХреА рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреА рд╣реИ, рддреЛ рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд▓рд╛рдЗрдирдерд┐рдХрдиреЗрд╕ рдорд╛рдЗрдирд╕ рдЖрдзреЗ рд╕реЗ рджреВрд░реА рдкрд░ рдПрдХ рдЪрдВрдЪрд▓рддрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓рд╛рдЗрдирдерд┐рдХрдиреЗрд╕ рдХреЗ рд▓рд┐рдП рджреВрд░реА рдореЗрдВ рдЖрдзрд╛ рдмрджрд▓рд╛рд╡ рдФрд░ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд▓рд╛рдЗрди рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдХрд╛рд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╣реБ-рд░рдВрдЧреАрди рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рд▓реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
fixed4 frag(v2f i) : SV_TARGET{ float dist = scene(i.worldPos.xz); fixed4 col = lerp(_InsideColor, _OutsideColor, step(0, dist)); float distanceChange = fwidth(dist) * 0.5; float majorLineDistance = abs(frac(dist / _LineDistance + 0.5) - 0.5) * _LineDistance; float majorLines = smoothstep(_LineThickness - distanceChange, _LineThickness + distanceChange, majorLineDistance); return col * majorLines; }

рд╣рдо рдЙрд╕реА рддрд░рд╣ рдореЛрдЯреА рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдкрддрд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдореЛрдЯреА рд░реЗрдЦрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд┐рддрдиреА рдкрддрд▓реА рд░реЗрдЦрд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рд╣рдо рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдореЛрдЯреА рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХреА рдереА, рд▓реЗрдХрд┐рди рдкрддрд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЗ рдХрд╛рд░рдг рд╣рдо рдкрддрд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмреАрдЪ рдореЛрдЯреА рд░реЗрдЦрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВред рд╣рдо рдкрддрд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рднреА рдмрдирд╛ рджреЗрдВрдЧреЗ
IntRange
, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдкрддрд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
IntRange
рдореЛрдЯреА рд╡рд╛рд▓реЛрдВ рд╕реЗ
IntRange
рдирд╣реАрдВ
IntRange
рд╣реИрдВред рдкрддрд▓реА рд░реЗрдЦрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд░рдВрдЧ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдореЛрдЯреАред
fixed4 frag(v2f i) : SV_TARGET{ float dist = scene(i.worldPos.xz); fixed4 col = lerp(_InsideColor, _OutsideColor, step(0, dist)); float distanceChange = fwidth(dist) * 0.5; float majorLineDistance = abs(frac(dist / _LineDistance + 0.5) - 0.5) * _LineDistance; float majorLines = smoothstep(_LineThickness - distanceChange, _LineThickness + distanceChange, majorLineDistance); float distanceBetweenSubLines = _LineDistance / _SubLines; float subLineDistance = abs(frac(dist / distanceBetweenSubLines + 0.5) - 0.5) * distanceBetweenSubLines; float subLines = smoothstep(_SubLineThickness - distanceChange, _SubLineThickness + distanceChange, subLineDistance); return col * majorLines * subLines; }
рд╕реНрд░реЛрдд рдХреЛрдб
2 рдбреА рдПрд╕рдбреАрдПрдл рд╕реБрд╡рд┐рдзрд╛рдПрдБ
#ifndef SDF_2D #define SDF_2D float2 rotate(float2 samplePosition, float rotation){ const float PI = 3.14159; float angle = rotation * PI * 2 * -1; float sine, cosine; sincos(angle, sine, cosine); return float2(cosine * samplePosition.x + sine * samplePosition.y, cosine * samplePosition.y - sine * samplePosition.x); } float2 translate(float2 samplePosition, float2 offset){
рд╡реГрддреНрдд рдЙрджрд╛рд╣рд░рдг
Shader "Tutorial/034_2D_SDF_Basics/Rectangle"{ SubShader{
рдЖрдпрдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг
Shader "Tutorial/034_2D_SDF_Basics/Rectangle"{ SubShader{
рдХрдЯрдСрдл
Shader "Tutorial/034_2D_SDF_Basics/Cutoff"{ Properties{ _Color("Color", Color) = (1,1,1,1) } SubShader{ Tags{ "RenderType"="Transparent" "Queue"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Pass{ CGPROGRAM #include "UnityCG.cginc" #include "2D_SDF.cginc" #pragma vertex vert #pragma fragment frag struct appdata{ float4 vertex : POSITION; }; struct v2f{ float4 position : SV_POSITION; float4 worldPos : TEXCOORD0; }; fixed3 _Color; v2f vert(appdata v){ v2f o;
рджреВрд░реА рдХреА рд░реЗрдЦрд╛рдПрдБ
Shader "Tutorial/034_2D_SDF_Basics/DistanceLines"{ Properties{ _InsideColor("Inside Color", Color) = (.5, 0, 0, 1) _OutsideColor("Outside Color", Color) = (0, .5, 0, 1) _LineDistance("Mayor Line Distance", Range(0, 2)) = 1 _LineThickness("Mayor Line Thickness", Range(0, 0.1)) = 0.05 [IntRange]_SubLines("Lines between major lines", Range(1, 10)) = 4 _SubLineThickness("Thickness of inbetween lines", Range(0, 0.05)) = 0.01 } SubShader{
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреВрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдирдП рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред