рдпреВрдирд┐рдЯреА рдЗрдВрдЬрди рдореЗрдВ рдЧреНрд░рд╛рд╕ рд╢реИрдбрд░ рдмрдирд╛рдирд╛


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

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

рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рд╣реИред рдЙрддреНрдкрдиреНрди shader рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рд╕рдордЭ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИрдВред

рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ


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

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдк (.zip) рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред

рдХрд╛рдо рдкрд░ рд▓рдЧрдирд╛


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХрддрд╛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЦреЛрд▓реЗрдВред Main рджреГрд╢реНрдп рдЦреЛрд▓реЗрдВ, рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рдореЗрдВ Grass рд╢реЗрдбрд░ рдЦреЛрд▓реЗрдВред

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╢реЗрдбрд░ рд╣реИ рдЬреЛ рд╕рдлреЗрдж рд░рдВрдЧ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╣рдо рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╢реАрд░реНрд╖ shader рдХреЛ CGINCLUDE рдмрд╛рд╣рд░ рд╕реНрдерд┐рдд CGINCLUDE рдмреНрд▓реЙрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рд░рдЦрд╛ рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдкрд╛рд╕реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛; рдпрд╣ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рд╢реЗрдбрд░ рдореЗрдВ рдХрдИ рдкрд╛рд╕ рд╣реЛрдВрдЧреЗред

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

1. рдЬрд┐рдпреЛрдореЗрдЯреНрд░рд┐рдХ рд╢реЗрдбреНрд╕


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


Direct3D рдЧреНрд░рд╛рдлрд╝рд┐рдХреНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди 11ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдЖрд░реЗрдЦ рдореЗрдВ рдЯреБрдХрдбрд╝рд╛ shader рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ shader рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреНрдпрд╛рдорд┐рддреАрдп рд╢реЗрдбреНрд╕ рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рдПрдХрд▓ рдЖрджрд┐рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реВрдиреНрдп, рдПрдХ рдпрд╛ рдХрдИ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдЬреНрдпрд╛рдорд┐рддреАрдп shader рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рд╢реАрд░реНрд╖ (рдпрд╛ рдмрд┐рдВрджреБ ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдХреЛ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред

 // Add inside the CGINCLUDE block. struct geometryOutput { float4 pos : SV_POSITION; }; [maxvertexcount(3)] void geo(triangle float4 IN[3] : SV_POSITION, inout TriangleStream<geometryOutput> triStream) { } тАж // Add inside the SubShader Pass, just below the #pragma fragment frag line. #pragma geometry geo 

рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде geo рдирд╛рдордХ рдПрдХ рдЬреНрдпрд╛рдорд┐рддреАрдп рд╢реЗрдбрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛, triangle float4 IN[3] , рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░рд┐рднреБрдЬ (рддреАрди рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдпреБрдХреНрдд) рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧрд╛ред TriangleStream рдЬреИрд╕реА рджреВрд╕рд░реА, рддреНрд░рд┐рдХреЛрдг рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реИрдбрд░ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП geometryOutput рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред

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

 void geo(point vertexOutput IN[1], inout TriangleStream<geometryOutput> triStream) 

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЗ рдКрдкрд░ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдореЗрдВ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: [maxvertexcount(3)] ред рд╡рд╣ GPU рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗ (рд▓реЗрдХрд┐рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) 3 рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдиреЗ рдирд╣реАрдВ рд╣реИрдВред рд╣рдо SubShader рдХреЛ Pass рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдПрдХ рдЬреНрдпрд╛рдорд┐рддреАрдп рд╢реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдЬреНрдпрд╛рдорд┐рддреАрдп shader рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ; рддреНрд░рд┐рдХреЛрдг рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреНрдпрд╛рдорд┐рддреАрдп рдЫрд╛рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред

 geometryOutput o; o.pos = float4(0.5, 0, 0, 1); triStream.Append(o); o.pos = float4(-0.5, 0, 0, 1); triStream.Append(o); o.pos = float4(0, 1, 0, 1); triStream.Append(o); 


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

 // Update the return call in the vertex shader. //return UnityObjectToClipPos(vertex); return vertex; тАж // Update each assignment of o.pos in the geometry shader. o.pos = UnityObjectToClipPos(float4(0.5, 0, 0, 1)); тАж o.pos = UnityObjectToClipPos(float4(-0.5, 0, 0, 1)); тАж o.pos = UnityObjectToClipPos(float4(0, 1, 0, 1)); 


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

рд╣рдо рдЗрд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреЛрдЬреАрд╢рди рдСрдлрд╝рд╕реЗрдЯ рдмрдирд╛рдХрд░ рдареАрдХ рдХрд░реЗрдВрдЧреЗред

 // Add to the top of the geometry shader. float3 pos = IN[0]; тАж // Update each assignment of o.pos. o.pos = UnityObjectToClipPos(pos + float3(0.5, 0, 0)); тАж o.pos = UnityObjectToClipPos(pos + float3(-0.5, 0, 0)); тАж o.pos = UnityObjectToClipPos(pos + float3(0, 1, 0)); 


рдХреБрдЫ рдХреЛрдиреЗ рддреНрд░рд┐рдХреЛрдг рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ?

рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реА рдЖрджрд┐рдо рдПрдХ рддреНрд░рд┐рдХреЛрдг рд╣реЛрдЧреА, рддреНрд░рд┐рдХреЛрдг рдХреЗ рдПрдХ рдмрд┐рдВрджреБ рд╕реЗ рдХреЗрд╡рд▓ рдШрд╛рд╕ рдХрд╛ рдПрдХ рдмреНрд▓реЗрдб рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреНрдп рджреЛ рдХреЛ рддреНрдпрд╛рдЧ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рддреАрди рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдШрд╛рд╕ рдХреЗ рдПрдХ рдмреНрд▓реЗрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ рдХрд┐ рдкрдбрд╝реЛрд╕реА рддреНрд░рд┐рдХреЛрдг рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдКрдкрд░ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдмрдирд╛рддреЗ рд╣реИрдВред

рдпрд╛ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬреНрдпреЛрдореЗрдЯреНрд░рд┐рдХ рд╢реЗрдбрд░ рдХреЗ рдЗрдирдХрдорд┐рдВрдЧ рдореЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЛрдкреЛрд▓реЙрдЬреА рдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддреНрд░рд┐рдХреЛрдг рдЕрдм рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреАрдВрдЪреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдЙрдирдХрд╛ рдЖрдзрд╛рд░ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢рд┐рдЦрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, GrassPlane рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ , рдФрд░ GrassBall рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ ред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдШрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рддрд╣реЛрдВ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдореЗрд╢ рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред


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

2. рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди


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


рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдореЗрдВ, X , Y рдФрд░ Z рдЕрдХреНрд╖ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕рддрд╣ рдХреА рд╕реНрдерд┐рддрд┐ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдиреЗ) рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕реНрдерд╛рди рдХреА рддрд░рд╣, рд╣рдо рддреАрди рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╢реАрд░реНрд╖ рд╕реНрдерд╛рди рдХреЗ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рд╣реА , рдЖрдЧреЗ рдФрд░ рдКрдкрд░ ред рдЗрди рд╡реИрдХреНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд╛рди рддрдХ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЛ рдореЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рдирдП рдЗрдирдкреБрдЯ рд╡рд░реНрдЯреЗрдХреНрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕рд╣реА рдФрд░ рдКрдкрд░ рд╡реИрдХреНрдЯрд░ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред

 // Add to the CGINCLUDE block. struct vertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; }; struct vertexOutput { float4 vertex : SV_POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; }; тАж // Modify the vertex shader. vertexOutput vert(vertexInput v) { vertexOutput o; o.vertex = v.vertex; o.normal = v.normal; o.tangent = v.tangent; return o; } тАж // Modify the input for the geometry shader. Note that the SV_POSITION semantic is removed. void geo(triangle vertexOutput IN[3], inout TriangleStream<geometryOutput> triStream) тАж // Modify the existing line declaring pos. float3 pos = IN[0].vertex; 

рддреАрд╕рд░реЗ рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рджреЛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рдХреЛ рд▓реЗ рдХрд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рдж рджреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдХреНрдЯрд░ рд▓рдВрдмрд╡рдд рджреЗрддрд╛ рд╣реИред

 // Place in the geometry shader, below the line declaring float3 pos. float3 vNormal = IN[0].normal; float4 vTangent = IN[0].tangent; float3 vBinormal = cross(vNormal, vTangent) * vTangent.w; 

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

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

 // Add below the lines declaring the three vectors. float3x3 tangentToLocal = float3x3( vTangent.x, vBinormal.x, vNormal.x, vTangent.y, vBinormal.y, vNormal.y, vTangent.z, vBinormal.z, vNormal.z ); 

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

 // Add to the CGINCLUDE block. geometryOutput VertexOutput(float3 pos) { geometryOutput o; o.pos = UnityObjectToClipPos(pos); return o; } тАж // Remove the following from the geometry shader. //geometryOutput o; //o.pos = UnityObjectToClipPos(pos + float3(0.5, 0, 0)); //triStream.Append(o); //o.pos = UnityObjectToClipPos(pos + float3(-0.5, 0, 0)); //triStream.Append(o); //o.pos = UnityObjectToClipPos(pos + float3(0, 1, 0)); //triStream.Append(o); // ...and replace it with the code below. triStream.Append(VertexOutput(pos + float3(0.5, 0, 0))); triStream.Append(VertexOutput(pos + float3(-0.5, 0, 0))); triStream.Append(VertexOutput(pos + float3(0, 1, 0))); 

рдЕрдВрдд рдореЗрдВ, рд╣рдо tangentToLocal рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдиреЗ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреЗ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(0.5, 0, 0)))); triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(-0.5, 0, 0)))); triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(0, 1, 0)))); 

рдЫрд╡рд┐

рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд╣рдордиреЗ Y рдЕрдХреНрд╖ рдХреА рджрд┐рд╢рд╛ "рдЕрдк" (рдЕрдк) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛; рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдореЗрдВ, рдКрдкрд░ рдХреА рджрд┐рд╢рд╛ рдЖрдорддреМрд░ рдкрд░ Z рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИред рдЕрдм рд╣рдо рдпреЗ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВрдЧреЗред

 // Modify the position of the third vertex being emitted. triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(0, 0, 1)))); 


3. рдШрд╛рд╕ рдХрд╛ рджрд┐рдЦрдирд╛


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

3.1 рд░рдВрдЧ рдврд╛рд▓


рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдХрд▓рд╛рдХрд╛рд░ рдХреЛ рджреЛ рд░рдВрдЧ - рд╢реАрд░реНрд╖ рдФрд░ рдиреАрдЪреЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ, рдФрд░ рдЗрди рджреЛ рд░рдВрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдирд╛ рд╡рд╣ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд┐рдк рдХрд░рддрд╛ рд╣реИред рдпреЗ рд░рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА shader рдлрд╝рд╛рдЗрд▓ рдореЗрдВ _TopColor рдФрд░ _BottomColor рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЙрдирдХреЗ рдЙрдЪрд┐рдд рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЯреБрдХрдбрд╝рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 // Add to the geometryOutput struct. float2 uv : TEXCOORD0; тАж // Modify the VertexOutput function signature. geometryOutput VertexOutput(float3 pos, float2 uv) тАж // Add to VertexOutput, just below the line assigning o.pos. o.uv = uv; тАж // Modify the existing lines in the geometry shader. triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(0.5, 0, 0)), float2(0, 0))); triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(-0.5, 0, 0)), float2(1, 0))); triStream.Append(VertexOutput(pos + mul(tangentToLocal, float3(0, 0, 1)), float2(0.5, 1))); 

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


рдпреВрд╡реА рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рддреАрди рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред рдпрджреНрдпрдкрд┐ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдврд╛рд▓ рдХреЗ рд╕рд╛рде рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдмрдирд╛рд╡рдЯ рдХреА рдПрдХ рд╕рдорд╛рди рд╡реНрдпрд╡рд╕реНрдерд╛ рдЖрдкрдХреЛ рдмрдирд╛рд╡рдЯ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдЕрдм рд╣рдо рдпреВрд╡реА рдХреЗ рд╕рд╛рде рдЯреБрдХрдбрд╝реЗ lerp рдореЗрдВ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреЗ рд░рдВрдЧреЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ lerp рд╕рд╛рде рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░ lerp ред рд╣рдо рднреА рдЯреБрдХрдбрд╝рд╛ shader рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ geometryOutput рдмрдирд╛ рд░рд╣реА geometryOutput , рдФрд░ рди рдХреЗрд╡рд▓ float4 рдХреА рд╕реНрдерд┐рддрд┐ред

 // Modify the function signature of the fragment shader. float4 frag (geometryOutput i, fixed facing : VFACE) : SV_Target тАж // Replace the existing return call. return float4(1, 1, 1, 1); return lerp(_BottomColor, _TopColor, i.uv.y); 


3.2 рд░реИрдВрдбрдо рдмреНрд▓реЗрдб рджрд┐рд╢рд╛


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

Shader рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ: rand , рдЬреЛ рддреАрди-рдЖрдпрд╛рдореА рдЗрдирдкреБрдЯ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ AngleAxis3x3 , рдЬреЛ рдХреЛрдг ( рд░реЗрдбрд┐рдпрди рдореЗрдВ ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдлрд╝рдВрдХреНрд╢рди рдмрд┐рд▓реНрдХреБрд▓ C # Quaternion.AngleAxis рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ AngleAxis3x3 рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ AngleAxis3x3 )ред

rand рдлрд╝рдВрдХреНрд╢рди 0 ... 1 рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИ; рдХреЛрдгреАрдп рдореВрд▓реНрдпреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕реЗ 2 рдкрд╛рдИ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ред

 // Add below the line declaring the tangentToLocal matrix. float3x3 facingRotationMatrix = AngleAxis3x3(rand(pos) * UNITY_TWO_PI, float3(0, 0, 1)); 

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

рдмрдирд╛рдП рдЧрдП tangentToLocal рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдкрд░ tangentToLocal рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдирд╣реАрдВ рд╣реИ ; рдСрдкрд░реЗрдВрдб рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред

 // Add below the line declaring facingRotationMatrix. float3x3 transformationMatrix = mul(tangentToLocal, facingRotationMatrix); тАж // Replace the multiplication matrix operand with our new transformationMatrix. triStream.Append(VertexOutput(pos + mul(transformationMatrix, float3(0.5, 0, 0)), float2(0, 0))); triStream.Append(VertexOutput(pos + mul(transformationMatrix, float3(-0.5, 0, 0)), float2(1, 0))); triStream.Append(VertexOutput(pos + mul(transformationMatrix, float3(0, 0, 1)), float2(0.5, 1))); 


3.3 рдмреЗрддрд░рддреАрдм рдЖрдЧреЗ рдЭреБрдХрдирд╛


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

 // Add as a new property. _BendRotationRandom("Bend Rotation Random", Range(0, 1)) = 0.2 тАж // Add to the CGINCLUDE block. float _BendRotationRandom; тАж // Add to the geometry shader, below the line declaring facingRotationMatrix. float3x3 bendRotationMatrix = AngleAxis3x3(rand(pos.zzx) * _BendRotationRandom * UNITY_PI * 0.5, float3(-1, 0, 0)); 

рдлрд┐рд░ рд╕реЗ рд╣рдо рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░ рдЗрд╕реЗ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдмреАрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рднреА UNITY_PI рдХреЛ 0.5 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВрдЧреЗ; рдпрд╣ рд╣рдореЗрдВ 0 ... 90 рдбрд┐рдЧреНрд░реА рдХрд╛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдВрддрд░рд╛рд▓ рджреЗрдЧрд╛ред

рд╣рдо рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд░реЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред

 // Modify the existing line. float3x3 transformationMatrix = mul(mul(tangentToLocal, facingRotationMatrix), bendRotationMatrix); 


рей.рек рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ


рдЬрдмрдХрд┐ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХрд╛ рдЖрдХрд╛рд░ 1 рдпреВрдирд┐рдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ 1 рдпреВрдирд┐рдЯ рдХреА рдКрдВрдЪрд╛рдИ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рд╣рдо рдЖрдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рднрд┐рдиреНрдирддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдг рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗред

 // Add as new properties. _BladeWidth("Blade Width", Float) = 0.05 _BladeWidthRandom("Blade Width Random", Float) = 0.02 _BladeHeight("Blade Height", Float) = 0.5 _BladeHeightRandom("Blade Height Random", Float) = 0.3 тАж // Add to the CGINCLUDE block. float _BladeHeight; float _BladeHeightRandom; float _BladeWidth; float _BladeWidthRandom; тАж // Add to the geometry shader, above the triStream.Append calls. float height = (rand(pos.zyx) * 2 - 1) * _BladeHeightRandom + _BladeHeight; float width = (rand(pos.xzy) * 2 - 1) * _BladeWidthRandom + _BladeWidth; тАж // Modify the existing positions with our new height and width. triStream.Append(VertexOutput(pos + mul(transformationMatrix, float3(width, 0, 0)), float2(0, 0))); triStream.Append(VertexOutput(pos + mul(transformationMatrix, float3(-width, 0, 0)), float2(1, 0))); triStream.Append(VertexOutput(pos + mul(transformationMatrix, float3(0, 0, height)), float2(0.5, 1))); 


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

рдПрдХ рд╕рдорд╛рдзрд╛рди рдПрдХ рдирдпрд╛, рд╕рдШрди рдЬрд╛рд▓ рдмрдирд╛рдирд╛ рд╣реИ, рдпрд╛ рддреЛ C # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдПрдХ 3D рд╕рдВрдкрд╛рджрдХ рдореЗрдВред рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдШрд╛рд╕ рдХреЗ рдШрдирддреНрд╡ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЯреЗрд╕реНрдпреВрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЬрд╛рд▓ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред

4. рдЯреЗрд╢рди


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

рднреВрддрд▓ рд╢реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП, рдпреВрдирд┐рдЯреА рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдЯреЗрд╕реЗрд▓реЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐ рд╣рдо рд╕рддрд╣ рд╢реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╢реЗрд▓ рдФрд░ рдбреЛрдореЗрди рд╢реЗрдб рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ tessellation рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдФрд░ рд╣рдо рдмрд╕ рдореМрдЬреВрджрд╛ CustomTessellation.cginc рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреИрдЯрд▓рд╛рдЗрдХ рдХреЛрдбрд┐рдВрдЧ рд▓реЗрдЦ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рдЬреЛ рдПрдХрддрд╛ рдореЗрдВ рдЯреЗрд╕реЗрд▓реЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕реНрд░реЛрдд рд╣реИред

рдпрджрд┐ рд╣рдо рджреГрд╢реНрдп рдореЗрдВ TessellationExample рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдордЧреНрд░реА рд╣реИ рдЬреЛ tessellation рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред Tessellation рдпреВрдирд┐рдлрд╝реЙрд░реНрдо рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдЙрдкрд╡рд┐рднрд╛рдЬрди рдкреНрд░рднрд╛рд╡ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред


рд╣рдо рдкреНрд▓реЗрди рдХреЗ рдШрдирддреНрд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрд╛рд╕ рдХреА рдЫрд╛рдпрд╛ рдореЗрдВ рдЯреЗрд╕рд▓реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ CustomTessellation.cginc рдлрд╛рдЗрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрде рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдВрдЧреЗред

 // Add inside the CGINCLUDE block, below the other #include statements. #include "Shaders/CustomTessellation.cginc" 

рдпрджрд┐ рдЖрдк CustomTessellation.cginc рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ vertexInput рдФрд░ vertexOutput , рд╕рд╛рде рд╣реА рд╕рд╛рде рд╢реАрд░реНрд╖ vertexOutput , рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рд╣рдорд╛рд░реЗ рдШрд╛рд╕ рдХреА рдЫрд╛рдпрд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 /*struct vertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; }; struct vertexOutput { float4 vertex : SV_POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; }; vertexOutput vert(vertexInput v) { vertexOutput o; o.vertex = v.vertex; o.normal = v.normal; o.tangent = v.tangent; return o; }*/ 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ CustomTessellation.cginc рдореЗрдВ CustomTessellation.cginc рд╢реЗрдбрд░ рд╕реАрдзреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЯреЗрд╕реЗрд▓реЗрд╢рди рдЪрд░рдг рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ; vertexOutput рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ рдбреЛрдореЗрди рд╢реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, vertexOutput рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп vertexOutput рд╣реИред

рдЕрдм рд╣рдо рд╢реЗрд▓ рдФрд░ рдбреЛрдореЗрди рд╢реЗрдбреНрд╕ рдХреЛ рдШрд╛рд╕ рд╢реЗрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдпреВрдирд┐рдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ _TessellationUniform рдЧреБрдг рднреА рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ - рдЗрд╕ рдЧреБрдг рдХреЗ рдЕрдиреБрд░реВрдк рдЪрд░ рдХреЛ рдкрд╣рд▓реЗ рд╣реА CustomTessellation.cginc рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

 // Add as a new property. _TessellationUniform("Tessellation Uniform", Range(1, 64)) = 1 тАж // Add below the other #pragma statements in the SubShader Pass. #pragma hull hull #pragma domain domain 

рдЕрдм Tessellation рдпреВрдирд┐рдлрд╝реЙрд░реНрдо рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рд╣рдо рдШрд╛рд╕ рдХреЗ рдШрдирддреНрд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ 5 рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред


5. рд╣рд╡рд╛


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


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

 // Add as new properties. _WindDistortionMap("Wind Distortion Map", 2D) = "white" {} _WindFrequency("Wind Frequency", Vector) = (0.05, 0.05, 0, 0) тАж // Add to the CGINCLUDE block. sampler2D _WindDistortionMap; float4 _WindDistortionMap_ST; float2 _WindFrequency; тАж // Add to the geometry shader, just above the line declaring the transformationMatrix. float2 uv = pos.xz * _WindDistortionMap_ST.xy + _WindDistortionMap_ST.zw + _WindFrequency * _Time.y; 

рд╣рдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ _WindDistortionMap рдХреЗ рдкреИрдорд╛рдиреЗ рдФрд░ рдСрдлрд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ _Time.y рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ _Time.y , _Time.y рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ _WindFrequency ред рдЕрдм рд╣рдо рдЗрди рдпреВрд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдирд╛рд╡рдЯ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдФрд░ рд╣рд╡рд╛ рдХреА рддрд╛рдХрдд рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

 // Add as a new property. _WindStrength("Wind Strength", Float) = 1 тАж // Add to the CGINCLUDE block. float _WindStrength; тАж // Add below the line declaring float2 uv. float2 windSample = (tex2Dlod(_WindDistortionMap, float4(uv, 0, 0)).xy * 2 - 1) * _WindStrength; 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдмрдирд╛рд╡рдЯ рд╕реЗ рдирдореВрдирд╛ рдорд╛рди рдХреЛ рдЕрдВрддрд░рд╛рд▓ 0 ... 1 рд╕реЗ рдЕрдВрддрд░рд╛рд▓ -1 рддрдХ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ ... 1ред рдЕрдЧрд▓рд╛, рд╣рдо рд╣рд╡рд╛ рдХреА рджрд┐рд╢рд╛ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реЗрдХреНрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 // Add below the line declaring float2 windSample. float3 wind = normalize(float3(windSample.x, windSample.y, 0)); 

рдЕрдм рд╣рдо рдЗрд╕ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ transformationMatrix рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 // Add below the line declaring float3 wind. float3x3 windRotation = AngleAxis3x3(UNITY_PI * windSample, wind); тАж // Modify the existing line. float3x3 transformationMatrix = mul(mul(mul(tangentToLocal, windRotation), facingRotationMatrix), bendRotationMatrix); 

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдпреВрдирд┐рдЯреА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдШрд╛рд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╡рд┐рдВрдб рд╡рд┐рд░реВрдкрдг рдорд╛рдирдЪрд┐рддреНрд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП Wind рдЯреЗрдХреНрд╕рдЪрд░ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдкрд░ рд╕реНрдерд┐рдд) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ 0.01, 0.01 рдмрдирд╛рд╡рдЯ рдХреЗ рдЯрд╛рдЗрд▓рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рд╣реИрдВред


рдпрджрд┐ рджреГрд╢реНрдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рдШрд╛рд╕ рдПрдирд┐рдореЗрдЯреЗрдб рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдирд┐рдореЗрдЯреЗрдб рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЙрдЧрд▓ рд╕реНрдХрд╛рдИрдмреЙрдХреНрд╕, рдХреЛрд╣рд░реЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

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


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

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

 // Add below the line declaring float3x3 transformationMatrix. float3x3 transformationMatrixFacing = mul(tangentToLocal, facingRotationMatrix); тАж // Modify the existing lines outputting the base vertex positions. triStream.Append(VertexOutput(pos + mul(transformationMatrixFacing, float3(width, 0, 0)), float2(0, 0))); triStream.Append(VertexOutput(pos + mul(transformationMatrixFacing, float3(-width, 0, 0)), float2(1, 0))); 

6. рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреА рд╡рдХреНрд░рддрд╛


рдЕрдм рдШрд╛рд╕ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмреНрд▓реЗрдб рдПрдХ рддреНрд░рд┐рдХреЛрдг рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдмрдбрд╝реА рджреВрд░реА рдкрд░, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рдкрд╛рд╕ рд╡реЗ рдЬреИрд╡рд┐рдХ рдФрд░ рдЬреАрд╡рдВрдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╣реБрдд рдХрдареЛрд░ рдФрд░ рдЬреНрдпрд╛рдорд┐рддреАрдп рджрд┐рдЦрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдХрдИ рддреНрд░рд┐рдХреЛрдгреЛрдВ рд╕реЗ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рдХреНрд░ рдХреЗ рд╕рд╛рде рдЭреБрдХрд╛рдХрд░ рдареАрдХ рдХрд░реЗрдВрдЧреЗ ред

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

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


рдШрд╛рд╕ рдХреА рдПрдХ рдЙрдк-рд╡рд┐рднрд╛рдЬрд┐рдд рдмреНрд▓реЗрдб, рдЬрд┐рд╕реЗ рддреНрд░рд┐рдХреЛрдг рдкрдЯреНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред рдкрд╣рд▓реЗ рддреАрди рдХреЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рд╢реАрд░реНрд╖ рдкрд┐рдЫрд▓реЗ рджреЛ рдХреЛрдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рддреНрд░рд┐рдХреЛрдг рдмрдирд╛рддрд╛ рд╣реИред

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

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

 // Add to the CGINCLUDE block. #define BLADE_SEGMENTS 3 тАж // Modify the existing line defining the maxvertexcount. [maxvertexcount(BLADE_SEGMENTS * 2 + 1)] 

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдо рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 3 рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрдЧрдореЗрдВрдЯ maxvertexcountрдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд░реНрдЯрд┐рдХрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

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

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреЛрдб рдХреЗ рдШрд╛рд╕ рдмреНрд▓реЗрдб рдХреЗ рдХреЛрдиреЗ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдХреЗ рднрд╛рдЧ рдХреЛ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХрдИ рдмрд╛рд░ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдмреНрд▓реЙрдХ рдореЗрдВ CGINCLUDEрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ :

 geometryOutput GenerateGrassVertex(float3 vertexPosition, float width, float height, float2 uv, float3x3 transformMatrix) { float3 tangentPoint = float3(width, 0, height); float3 localPosition = vertexPosition + mul(transformMatrix, tangentPoint); return VertexOutput(localPosition, uv); } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рддрд░реНрдХреЛрдВ VertexOutputрдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рдХреЛрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдП рдереЗред рдПрдХ рд╕реНрдерд┐рддрд┐, рдКрдВрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрдЪрд░рд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реАрд░реНрд╖ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдпреВрд╡реА рд╕рдордиреНрд╡рдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред

 // Update the existing code outputting the vertices. triStream.Append(GenerateGrassVertex(pos, width, 0, float2(0, 0), transformationMatrixFacing)); triStream.Append(GenerateGrassVertex(pos, -width, 0, float2(1, 0), transformationMatrixFacing)); triStream.Append(GenerateGrassVertex(pos, 0, height, float2(0.5, 1), transformationMatrix)); 

рдлрд╝рдВрдХреНрд╢рди рдиреЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рд╣рдо рд╢реАрд░реНрд╖ рдкреАрдврд╝реА рдХреЛрдб рдХреЛ рд▓реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ forред рд▓рд╛рдЗрди рдХреЗ рдиреАрдЪреЗ float widthрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ :

 for (int i = 0; i < BLADE_SEGMENTS; i++) { float t = i / (float)BLADE_SEGMENTS; } 

рд╣рдо рдПрдХ рдЪрдХреНрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдШрд╛рд╕ рдЦрдВрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реВрдк рдХреЗ рдЕрдВрджрд░, рдПрдХ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ tред рдпрд╣ рдЪрд░ 0 0 ... 1 рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдПрдХ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рд╕рд╛рде рдХрд┐рддрдиреА рджреВрд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЦрдВрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 // Add below the line declaring float t. float segmentHeight = height * t; float segmentWidth = width * (1 - t); 

рдЬрдм рдШрд╛рд╕ рдХрд╛ рдПрдХ рдмреНрд▓реЗрдб рдКрдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдКрдВрдЪрд╛рдИ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЕрдм рд╣рдо GenerateGrassVertexрддреНрд░рд┐рднреБрдЬреЛрдВ рдХреА рдзрд╛рд░рд╛ рдореЗрдВ рдХреЛрдиреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдореЗрдВ рдХреЙрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ред рд╣рдо GenerateGrassVertexрдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреА рдиреЛрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдХреЙрд▓ рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗ ред

 // Add below the line declaring float segmentWidth. float3x3 transformMatrix = i == 0 ? transformationMatrixFacing : transformationMatrix; triStream.Append(GenerateGrassVertex(pos, segmentWidth, segmentHeight, float2(0, t), transformMatrix)); triStream.Append(GenerateGrassVertex(pos, -segmentWidth, segmentHeight, float2(1, t), transformMatrix)); тАж // Add just below the loop to insert the vertex at the tip of the blade. triStream.Append(GenerateGrassVertex(pos, 0, height, float2(0.5, 1), transformationMatrix)); тАж // Remove the existing calls to triStream.Append. //triStream.Append(GenerateGrassVertex(pos, width, 0, float2(0, 0), transformationMatrixFacing)); //triStream.Append(GenerateGrassVertex(pos, -width, 0, float2(1, 0), transformationMatrixFacing)); //triStream.Append(GenerateGrassVertex(pos, 0, height, float2(0.5, 1), transformationMatrix)); 

рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ float3x3 transformMatrix- рдпрд╣рд╛рдВ рд╣рдо рджреЛ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо transformationMatrixFacingрдЖрдзрд╛рд░ рдХреЗ рдХреЛрдиреЗ рдФрд░ transformationMatrixрдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП рд▓реЗрддреЗ рд╣реИрдВред


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

 // Update the function signature of GenerateGrassVertex. geometryOutput GenerateGrassVertex(float3 vertexPosition, float width, float height, float forward, float2 uv, float3x3 transformMatrix) тАж // Modify the Y coordinate assignment of tangentPoint. float3 tangentPoint = float3(width, forward, height); 

рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ powрдорд╛рди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ tред рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж tрдЖрдЧреЗ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдкрд░ рдЙрд╕рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреА рдбрд┐рдЧреНрд░реА рдореЗрдВ рд╣реИ рдЕрд░реЗрдЦреАрдп рдФрд░ рдШрд╛рд╕ рдХреА рдПрдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

 // Add as new properties. _BladeForward("Blade Forward Amount", Float) = 0.38 _BladeCurve("Blade Curvature Amount", Range(1, 4)) = 2 тАж // Add to the CGINCLUDE block. float _BladeForward; float _BladeCurve; тАж // Add inside the geometry shader, below the line declaring float width. float forward = rand(pos.yyz) * _BladeForward; тАж // Add inside the loop, below the line declaring segmentWidth. float segmentForward = pow(t, _BladeCurve) * forward; тАж // Modify the GenerateGrassVertex calls inside the loop. triStream.Append(GenerateGrassVertex(pos, segmentWidth, segmentHeight, segmentForward, float2(0, t), transformMatrix)); triStream.Append(GenerateGrassVertex(pos, -segmentWidth, segmentHeight, segmentForward, float2(1, t), transformMatrix)); тАж // Modify the GenerateGrassVertex calls outside the loop. triStream.Append(GenerateGrassVertex(pos, 0, height, forward, float2(0.5, 1), transformationMatrix)); 

рдпрд╣ рдХреЛрдб рдХрд╛ рдПрдХ рдХрд╛рдлреА рдмрдбрд╝рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реА рддрд░рд╣ рд╕рднреА рдХрд╛рдо рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде _BladeForwardрдФрд░ _BladeCurveрд╣рдореЗрдВ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд, рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд▓реЙрди рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдмрдбрд╝реЗ рдореВрд▓реНрдп рд╡рд┐рдкрд░реАрдд рдкреНрд░рднрд╛рд╡ рджреЗрдВрдЧреЗред


7. рдкреНрд░рдХрд╛рд╢ рдФрд░ рдЫрд╛рдпрд╛


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

7.1 рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдЫрд╛рдпрд╛


рдПрдХрддрд╛ рдореЗрдВ рдЫрд╛рдпрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЫрд╛рдпрд╛рдХрд╛рд░ рдХреЛ рджреВрд╕рд░рд╛ рдкрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╛рдпрд╛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рджреГрд╢реНрдп рдореЗрдВ рдЙрдирдХреЗ рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдШрд╛рд╕ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рдорд┐рддреАрдп рдЫрд╛рдпрд╛ рдХреЛ рдЫрд╛рдпрд╛ рдорд╛рд░реНрдЧ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдЫрд╛рдпрд╛ рдбрд╛рд▓ рд╕рдХреЗрдВред

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

 // Add below the existing Pass. Pass { Tags { "LightMode" = "ShadowCaster" } CGPROGRAM #pragma vertex vert #pragma geometry geo #pragma fragment frag #pragma hull hull #pragma domain domain #pragma target 4.6 #pragma multi_compile_shadowcaster float4 frag(geometryOutput i) : SV_Target { SHADOW_CASTER_FRAGMENT(i) } ENDCG } 

рдПрдХ рдирдпрд╛ рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдорд╛рд░реНрдЧ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВред рд▓реЗрдмрд▓ LightModeрдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ ShadowCaster, рдирд╣реАрдВ ForwardBase- рдпрд╣ рдПрдХрддрд╛ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЫрд╛рдпрд╛ рдирдХреНрд╢реЗ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдПрдХ рдкреВрд░реНрд╡рдкреНрд░рдХреНрд░рдордХ рдирд┐рд░реНрджреЗрд╢ рднреА рд╣реИ multi_compile_shadowcasterред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдЫрд╛рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЦреЗрд▓ рд╡рд╕реНрддреБ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ Fence рд╕рдХреНрд░рд┐рдп рдмрдирд╛рдПрдВ ; рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╕рддрд╣ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕ рдкрд░ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдПрдХ рдЫрд╛рдпрд╛ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред


7.2 рдЫрд╛рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


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

 // Add to the geometryOutput struct. unityShadowCoord4 _ShadowCoord : TEXCOORD1; тАж // Add to the VertexOutput function, just above the return call. o._ShadowCoord = ComputeScreenPos(o.pos); 

рдорд╛рд░реНрдЧ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, ForwardBaseрд╣рдо рдПрдХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ floatрдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рддрд╣ рдЫрд╛рдпрд╛ рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдорд╛рди 0 ... 1 рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ 0 рдкреВрд░реНрдг рдЫрд╛рдпрд╛рдВрдХрди рд╣реИ, 1 рдкреВрд░реНрдг рд░реЛрд╢рдиреА рд╣реИред

рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдХреЗ UV рд╕рдордиреНрд╡рдп рдХреЛ _ShadowCoord рдХреНрдпреЛрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣ рдкрд┐рдЫрд▓реЗ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
Unity ( ). SHADOW_ATTENUATION . Autolight.cginc , , .

 #define SHADOW_ATTENUATION(a) unitySampleShadow(a._ShadowCoord) 

- , .

 // Add to the ForwardBase pass's fragment shader, replacing the existing return call. return SHADOW_ATTENUATION(i); //return lerp(_BottomColor, _TopColor, i.uv.y); 

рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЫрд╛рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбрд░ рдХреЛ рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд╕ рдореЗрдВ рдПрдХ ForwardBaseрдкреВрд░реНрд╡рдкреНрд░рдХреНрд░рдордХ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ shader рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХреЗред

 // Add to the ForwardBase pass's preprocessor directives, below #pragma target 4.6. #pragma multi_compile_fwdbase 


рдХреИрдорд░реЗ рдХреЛ рдХрд░реАрдм рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреА рд╕рддрд╣ рдкрд░ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд╡реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдШрд╛рд╕ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмреНрд▓реЗрдб рдЦреБрдж рдкрд░ рдЫрд╛рдпрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдПрдХ рд░реИрдЦрд┐рдХ рдмрджрд▓рд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдпрд╛ рд╕реНрдХреНрд░реАрди рд╕реЗ рдереЛрдбрд╝реА рджреВрд░ рдЯреНрд░рдВрдХреЗрд╢рди рд╕реНрдкреЗрд╕ рдореЗрдВ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗ #ifрддрд╛рдХрд┐ рдСрдкрд░реЗрд╢рди рдХреЗрд╡рд▓ рдЫрд╛рдпрд╛ рдкрде рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

 // Add at the end of the VertexOutput function, just above the return call. #if UNITY_PASS_SHADOWCASTER // Applying the bias prevents artifacts from appearing on the surface. o.pos = UnityApplyLinearShadowBias(o.pos); #endif 


рд░реИрдЦрд┐рдХ рдЫрд╛рдпрд╛ рдмрджрд▓рд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдзрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЫрд╛рдпрд╛ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рддреНрд░рд┐рдХреЛрдг рдХреА рд╕рддрд╣ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

рдШрд╛рд╕ рдХреЗ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдмреНрд▓реЗрдб рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рдХреНрдпреЛрдВ рд╣реИрдВ?

(multisample anti-aliasing MSAA ) Unity , . , .

тАФ , , Unity . ( ); Unity .

Lighting.рей рдкреНрд░рдХрд╛рд╢


рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдЖрдо рд╡рд┐рд╕рд░рд┐рдд рдкреНрд░рдХрд╛рд╢ рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред


... рдЬрд╣рд╛рдВ N рд╕рддрд╣ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, L рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рджрд┐рд╢рд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ ред

рдлрд┐рд▓рд╣рд╛рд▓, рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рдХреЛрдиреЗ рддрдХ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рд╢реАрд░реНрд╖ рдкрджреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд╣рд▓реЗ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдорд╛рдирджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЬрдм рдмреНрд▓реЗрдб рд╡рдХреНрд░рддрд╛ рд░рд╛рд╢рд┐ рдкрд░ рд╕реЗрдЯ рд╣реИ 1 , рдПрдХ рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рд╕реНрдкрд░реНрд╢ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕рднреА рдШрд╛рд╕: рдЕрдХреНрд╖ рдХреЗ рд╡рд┐рдкрд░реАрдд Yред рд╣рдорд╛рд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдХреЛрдИ рд╡рдХреНрд░рддрд╛ рдорд╛рдирддреЗ рд╣реБрдП, рд╕рд╛рдорд╛рдиреНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред

 // Add to the GenerateGrassVertex function, belowing the line declaring tangentPoint. float3 tangentNormal = float3(0, -1, 0); float3 localNormal = mul(transformMatrix, tangentNormal); 

tangentNormalрд╕реАрдзреЗ рд╡рд╛рдИ рдЕрдХреНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд╛рди рдкрд░ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗред рдЕрдм рд╣рдо рдЗрд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ VertexOutput, рдФрд░ рдлрд┐рд░ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ geometryOutputред

 // Modify the return call in GenerateGrassVertex. return VertexOutput(localPosition, uv, localNormal); тАж // Add to the geometryOutput struct. float3 normal : NORMAL; тАж // Modify the existing function signature. geometryOutput VertexOutput(float3 pos, float2 uv, float3 normal) тАж // Add to the VertexOutput function to pass the normal through to the fragment shader. o.normal = UnityObjectToWorldNormal(normal); 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд┐рд╖реНрдХрд░реНрд╖ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдХреЛ рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ ; рдПрдХрддрд╛ рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдореБрдЦреНрдп рд╕реНрд░реЛрдд рдХреА рджрд┐рд╢рд╛ рдХреЛ рдврд╛рд▓ рджреЗрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдм рд╣рдо ForwardBaseрдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП shader рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдорд╛рдирджрдВрдбреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

 // Add to the ForwardBase fragment shader. float3 normal = facing > 0 ? i.normal : -i.normal; return float4(normal * 0.5 + 0.5, 1); // Remove the existing return call. //return SHADOW_ATTENUATION(i); 

рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реА рдЫрд╛рдпрд╛ рдореЗрдВ рдПрдХ Cullрдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Off, рдЗрд╕рд▓рд┐рдП рдШрд╛рд╕ рдХреЗ рдмреНрд▓реЗрдб рдХреЗ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдХреЛ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ VFACEрдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдерд╛ред

рддрд░реНрдХ fixed facingрд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЕрдЧрд░ рд╣рдо рд╕рддрд╣ рдХреЗ рд╕рд╛рдордиреЗ рдЪреЗрд╣рд░рд╛, рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирдВрдмрд░ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рд░рд┐рд╡рд░реНрд╕ рд╕рдВрдЦреНрдпрд╛ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдХреЛ рдлреНрд▓рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдЬрдм рдмреНрд▓реЗрдб рдХреА рд╡рдХреНрд░рддрд╛ рд░рд╛рд╢рд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреА рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ Z рд╕реНрдерд┐рддрд┐ forwardрдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рд░рд╛рд╢рд┐ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреА рдЬрд╛рдПрдЧреА GenerateGrassVertexред рд╣рдо рдорд╛рдиреЛрдВ рдХреЗ Z рдЕрдХреНрд╖ рдХреЛ рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ред

 // Modify the existing line in GenerateGrassVertex. float3 tangentNormal = normalize(float3(0, -1, forward)); 

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

 // Add to the ForwardBase fragment shader, below the line declaring float3 normal. float shadow = SHADOW_ATTENUATION(i); float NdotL = saturate(saturate(dot(normal, _WorldSpaceLightPos0)) + _TranslucentGain) * shadow; float3 ambient = ShadeSH9(float4(normal, 1)); float4 lightIntensity = NdotL * _LightColor0 + float4(ambient, 1); float4 col = lerp(_BottomColor, _TopColor * lightIntensity, i.uv.y); return col; // Remove the existing return call. //return float4(normal * 0.5 + 0.5, 1); 


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


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


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

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

GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ Shader рд╕реНрд░реЛрдд рдХреЛрдб

рдЬреЛрдбрд╝: рд╕рд╣рдпреЛрдЧ


рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рдмрд┐рдирд╛, рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рднрд╛рд╡ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдпрд╛ рдмреЗрдЬрд╛рди рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдШрд╛рд╕ рдХреЗ рд╕рд╛рде рджреБрдирд┐рдпрд╛ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдмрд╛рддрдЪреАрдд рдкрд░ рдПрдХ рдЦрдВрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ред

рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдЬрдбрд╝реА-рдмреВрдЯрд┐рдпреЛрдВ рдХреЗ рдПрдХ рднреЛрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЛ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ: рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдЬреЛ рдЫрд╛рдпрд╛рджрд╛рд░ рдХреЛ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдШрд╛рд╕ рдХреЗ рдХрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ рдореЗрдВ рдХреЛрдб рдХрд░реЗрдВред

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

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


All Articles