рд╕рдореНрдорд┐рд╢реНрд░рдг рдФрд░ рдПрдХрддрд╛ рдХреНрд╖реЗрддреНрд░: рдХреИрд╕реЗ рдЪреМрд░рд╛рд╣реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдкрдиреА рдЖрдБрдЦреЛрдВ рдХреЛ рдЪреЛрдЯ рдкрд╣реБрдВрдЪрд╛рдирд╛ рдмрдВрдж рдХрд░реЗрдВ

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

рдЫрд╡рд┐

рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг "рдмрд╛рд╣рд░реА" рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рд╕рддрд╣ рдХреЗ рд╕рд╛рде рдЪрдЯреНрдЯрд╛рдиреЛрдВ рдФрд░ рд╡рдирд╕реНрдкрддрд┐рдпреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреА рдкрд░реЗрд╢рд╛рди рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░рдЪрдирд╛ рд╣реИред

рдЫрд╡рд┐

рд╡рд┐рднрд┐рдиреНрди рдЪреМрд░рд╕рд╛рдИ рд╡рд┐рдзрд┐рдпреЛрдВ (рдПрд╕рдПрд╕рдПрдП, рдПрдордПрд╕рдПрдП, рд╕реАрдПрд╕рдПрдП, рдПрдлрдПрдХреНрд╕рдПрдП, рдПрдирдПрдлрдПрдП, рд╕реАрдПрдордПрдП, рдбреАрдПрд▓рдПрдП, рдЯреАрдПрдП, рдЖрджрд┐) рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреМрд░рд╛рд╣реЛрдВ рдХреА рд░реЗрдЦрд╛рдУрдВ рдХреЗ рджреЛрд╖рдкреВрд░реНрдг рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рддрдХрдиреАрдХреЗрдВ рд╣реИрдВред рд╣рдо рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЧрд╣рд░рд╛рдИ рдХрд╛ рд╕рдореНрдорд┐рд╢реНрд░рдг


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

рдЫрд╡рд┐
рдирд░рдо рдХрдгреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд

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

рдлреЙрд░рд╡рд░реНрдб рд╢реЗрдбрд┐рдВрдЧ рдФрд░ рдпреВрдирд┐рдЯреА рд▓рд┐рдЧреЗрд╕реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧрд╣рд░рд╛рдИ рдмрдлрд░ [1] рдореЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА ред рдпрд╣ рдкрд╛рд╕ Camera.depthTextureMode рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЙрдЪрд┐рдд рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реАрдХреНрд╖рдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ [2] рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

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


рдирд░рдо рдХрдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрдбреНрд╕ рдореЗрдВ рдЪреМрд░рд╛рд╣реЗ рдХреА рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛

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

рдХреЛрдб рджреЗрдЦреЗрдВ
// Blending with depth buffer

#include "UnityCG.cginc"

float BlendStart;
float BlendEnd;
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);

struct v2f
{
    // ...

    half4 projPos : TEXCOORD0;
};

v2f vert(appdata v)
{
    v2f o;
    UNITY_INITIALIZE_OUTPUT(v2f,o);

    // ...

    o.projPos = ComputeScreenPos(o.pos);
    COMPUTE_EYEDEPTH(o.projPos.z);

    // ...

    return o;
}

fixed4 frag(v2f i) : COLOR
{     
    fixed4 result = 0;
      
    // ... 

    float depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos));
    float sceneZ = LinearEyeDepth(depth);
    float partZ = i.projPos.z;
    float fade = saturate( sceneZ - partZ );
    result.a = smoothstep( BlendStart, BlendEnd, fade );

    // ... 
       
    return result; 
}


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВред

рдкрд╣рд▓рд╛ рджреЛрд╖ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХрд╛ рдХрд╛рдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд╛рдЗрдк рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рдЪрд░рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╡рд┐рдЦрдВрдбрди рдФрд░ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ [3] [4] [5] рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ [6] [7] [8] [8] рдХреЛ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдпрд╣ рдХрд┐рд╕реА рднреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдХрд╛ рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдмреАрд╕ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред GPU рдореЗрдореЛрд░реА рд╕реЗ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред

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

рджреВрд╕рд░рд╛ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдорд┐рд╢реНрд░рдг рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рдХреИрд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рддрдм рд╕рднреА рдЯреБрдХрдбрд╝реЗ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░реАрди рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ рдХрд┐рд░рдг рдХреИрдорд░реЗ рдХреА рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдХрд▓рддреА рд╣реИ рдФрд░ рдЗрд╕ рд╕реНрдХреНрд░реАрди рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╡рд┐рд╢реНрд╡ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИред рдпрд╣, рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреИрдорд░рд╛ рд╕реНрдерд┐рддрд┐ рдпрд╛ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рд▓рдВрдмрди рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛: рдХреИрдорд░реЗ рдХреЗ рдХрд░реАрдм рд╕реНрдерд┐рдд 3 рдбреА рдореЙрдбрд▓ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреИрдорд░реЗ рд╕реЗ рдЖрдЧреЗ рд╕реНрдерд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ [10] [11] ред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЬрдм рдХреИрдорд░реЗ рдХреЗ рдирд┐рд░рдВрддрд░ рдкрд╛рд░реНрд╢реНрд╡ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдХрд░реАрдм рд╕реАрдорд╛ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред


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


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

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


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

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


рдХреИрдорд░реЗ

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


рдКрдВрдЪрд╛рдИ рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдореНрдорд┐рд╢реНрд░рдг


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

рдЯреЗрд░реЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЗрд▓рд╛рдХреЗ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрд░реЗрдирдбрд╛рдЯрд╛ рдореЗрдВ, рдФрд░ рд╣рд╛рде рдкрд░ "рдКрдВрдЪрд╛рдИ рдХрд╛ рдирдХреНрд╢рд╛" рд╣реИ, рдЖрдк рджреБрдирд┐рдпрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдЗрд▓рд╛рдХреЗ рдХреА рдКрдВрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдКрдВрдЪрд╛рдИ рдХреЗ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореИрджрд╛рдиреА рдХреНрд╖реЗрддреНрд░

// Setting up a heightmap and uniforms to use with shaders... 

Shader.SetGlobalTexture(Uniforms.TerrainHeightmap, terrain.terrainData.heightmapTexture);
Shader.SetGlobalVector(Uniforms.HeightmapScale, terrain.terrainData.heightmapScale);
Shader.SetGlobalVector(Uniforms.TerrainSize, terrain.terrainData.size);
Shader.SetGlobalVector(Uniforms.TerrainPos, terrain.transform.position);

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

// Computes UV for sampling terrain heightmap... 

float2 TerrainUV(float3 worldPos)
{
    return (worldPos.xz - TerrainPos.xz) / TerrainSize.xz;
}

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

// Returns the height of terrain at a given position in world space... 

float TerrainHeight(float2 terrainUV)
{
    float heightmapSample = tex2Dlod(TerrainHeightmap, float4(terrainUV,0,0));
    return TerrainPos.y + UnpackHeightmap(heightmapSample) * HeightmapScale.y * 2;
}

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

рдХреЛрдб рджреЗрдЦреЗрдВ
// Blending with terrain heightmap

#include "UnityCG.cginc"

float BlendStart;
float BlendEnd;

sampler2D_float TerrainHeightmap; 
float4 HeightmapScale;
float4 TerrainSize;
float4 TerrainPos;        

struct v2f
{
   // ...

   float3 worldPos : TEXCOORD0;
   float2 heightMapUV : TEXCOORD1;

   // ...
};


v2f vert(appdata v)
{
    v2f o;
    UNITY_INITIALIZE_OUTPUT(v2f,o);
   
    // ...
    
    o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    o.heightMapUV = TerrainUV(o.worldPos);

    // ...

    return o;
}

fixed4 frag(v2f i) : COLOR
{
    fixed4 result = 0;

    // ... 

    half height = TerrainHeight(i.heightMapUV);
    half deltaHeight = i.worldPos.y - height;
    result.a = smoothstep( BlendStart, BlendEnd, deltaHeight );

    // ... 
       
    return result; 
}





рдЧрд╣рд░рд╛рдИ рд╕рдореНрдорд┐рд╢реНрд░рдг рдФрд░ рдЙрддреНрдерд╛рди рд╕рдореНрдорд┐рд╢реНрд░рдгред рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреНрд╖реЗрддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рдПрдХ рд╣реА shader рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред

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

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


рднреВрдирд┐рд░реНрдорд╛рдг рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕рдореНрдорд┐рд╢реНрд░рдг


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


рд▓рдВрдмрди рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ: рд╕рдореНрдорд┐рд╢реНрд░рдг

рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдЯреБрдХрдбрд╝рд╛ рдЪреБрдирдирд╛ , рд╣рдо рдпрд╣рд╛рдВ рдПрдХ рдЖрднрд╛рд╕реА рдкрд░рд┐рджреГрд╢реНрдп рдЯреБрдХрдбрд╝реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдПрдХ 3 рдбреА рдореЙрдбрд▓ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдорд┐рд╢реНрд░рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреИрдорд░реЗ рдХреЗ рджреГрд╢реНрдп рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рднреА рдирд╣реАрдВ рдЖрдПрдЧрд╛ред рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ (рдПрд╕рдПрд╕рдПрд▓рдЖрд░) рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ рдХрд┐ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╣реАрдВ рд╣реИ [13] ред

рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрднрд╛рд╕реА рдЯреБрдХрдбрд╝реЗ рдХрд╛ рд░рдВрдЧ рдПрдХрддрд╛ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ [14] , рдкреНрд░рдХрд╛рд╢ рдирдХреНрд╢рд╛ [15] , рд╕рдореНрдорд┐рд╢реНрд░рдг рдкрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд░рд┐рдд рдмрдирд╛рд╡рдЯ [16] , рдФрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкрд░рддреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ [рез 17] ред


рд▓реИрдВрдбрд╕реНрдХреЗрдк рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг

рд╕рднреА рд▓реИрдВрдбрд╕реНрдХреЗрдк рдЬреЛ рд▓реИрдВрдбрд╕реНрдХреЗрдк рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЛ рдКрдВрдЪрд╛рдИ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рд╕рдорд╛рди рдпреВрд╡реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдореВрдирд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рддреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рдд [18] [19] рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЯрд╛рдЗрд▓рд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред

рдХреЛрдб рджреЗрдЦреЗрдВ
// Blending with reconstructed terrain fragments

#include "UnityCG.cginc"

float BlendStart;
float BlendEnd;

sampler2D_float TerrainHeightmapTexture;
sampler2D_float TerrainNormalTexture;
sampler2D TerrainAlphaMap;

float4 HeightmapScale;
float4 TerrainSize;
float4 TerrainPos;
Float4 TerrainLightmap_ST;

UNITY_DECLARE_TEX2D(TerrainSplatMap0);
UNITY_DECLARE_TEX2D_NOSAMPLER(TerrainNormalMap0);
half4 TerrainSplatMap0_ST;

UNITY_DECLARE_TEX2D(TerrainSplatMap1);
UNITY_DECLARE_TEX2D_NOSAMPLER(TerrainNormalMap1);
half4 TerrainSplatMap1_ST;

UNITY_DECLARE_TEX2D(TerrainSplatMap2);
UNITY_DECLARE_TEX2D_NOSAMPLER(TerrainNormalMap2);
half4 TerrainSplatMap2_ST;

UNITY_DECLARE_TEX2D(TerrainSplatMap3);
UNITY_DECLARE_TEX2D_NOSAMPLER(TerrainNormalMap3);
half4 TerrainSplatMap3_ST;

struct v2f
{
   // ...

   float3 worldPos : TEXCOORD0;
   float2 heightMapUV : TEXCOORD1;
#if defined(LIGHTMAP_ON)
   float2 modelLightMapUV : TEXCOORD2;
   float2 terrainLightMapUV : TEXCOORD3;
#endif

   // ...
};


v2f vert(appdata v)
{
    v2f o;
    UNITY_INITIALIZE_OUTPUT(v2f,o);
   
    // ...
    
    o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    o.heightMapUV = TerrainUV(o.worldPos);

#if defined(LIGHTMAP_ON)
    o.modelLightMapUV = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
    o.terrainLightMapUV = o.heightMapUV * TerrainLightmap_ST.xy + TerrainLightmap_ST.zw;
#endif

    // ...

    return o;
}
half3 TerrainNormal(float2 terrainUV)
{
    return tex2Dlod( TerrainNormalTexture, float4(terrainUV,0,0) ).xyz * 2.0 - 1.0;
}

half4 TerrainSplatMap(float2 uv0, float2 uv1, float2 uv2, float2 uv3, half4 control)
{
    half4 splat0 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainSplatMap0, TerrainSplatMap0, uv0);
    half4 splat1 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainSplatMap1, TerrainSplatMap1, uv1);
    half4 splat2 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainSplatMap2, TerrainSplatMap2, uv2);
    half4 splat3 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainSplatMap3, TerrainSplatMap3, uv3);         
    half4 result = splat0 * control.r + 
                   splat1 * control.g + 
                   splat2 * control.b + 
                   splat3 * control.a;
    return result;
}

half3 TerrainNormalMap(float2 uv0, float2 uv1, float2 uv2, float2 uv3, half4 control)
{
    half4 n0 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainNormalMap0, TerrainSplatMap0, uv0);
    half4 n1 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainNormalMap1, TerrainSplatMap1, uv1);
    half4 n2 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainNormalMap2, TerrainSplatMap2, uv2);
    half4 n3 = UNITY_SAMPLE_TEX2D_SAMPLER(TerrainNormalMap3, TerrainSplatMap3, uv3);
    half3 result = UnpackNormalWithScale(n0, 1.0) * control.r +
                   UnpackNormalWithScale(n1, 1.0) * control.g +
                   UnpackNormalWithScale(n2, 1.0) * control.b +
                   UnpackNormalWithScale(n3, 1.0) * control.a;
    result.z += 1e-5;
    return result;
}

half3 TerrainLightmap(float2 uv, half3 normal)
{
#if defined(LIGHTMAP_ON)
#if defined(DIRLIGHTMAP_COMBINED)
    half4 lm = UNITY_SAMPLE_TEX2D(unity_Lightmap, uv);
    half4 lmd = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, uv);
    half3 result = DecodeLightmapRGBM(lm, unity_Lightmap_HDR);
    result = DecodeDirectionalLightmap(result, lmd, normal);
#else
    half4 lm = UNITY_SAMPLE_TEX2D(unity_Lightmap, uv);
    half3 result = DecodeLightmapRGBM(lm, unity_Lightmap_HDR);
#endif                
#else
    half3 result = UNITY_LIGHTMODEL_AMBIENT.rgb;
#endif
    return result;
}

fixed4 frag(v2f i) : COLOR
{
    fixed4 result = 0;

    // ...

    // compute model color and put it to the result

    // ... 

    // reconstruction of terrain fragment

    float2 splatUV0 = TRANSFORM_TEX(i.heightMapUV, TerrainSplatMap0);
    float2 splatUV1 = TRANSFORM_TEX(i.heightMapUV, TerrainSplatMap1);
    float2 splatUV2 = TRANSFORM_TEX(i.heightMapUV, TerrainSplatMap2);
    float2 splatUV3 = TRANSFORM_TEX(i.heightMapUV, TerrainSplatMap3);

    half4 control = tex2D(_TerrainAlphaMap, i.heightMapUV);
    half4 terrainColor = TerrainSplatMap(splatUV0, splatUV1, splatUV2, splatUV3, control);

    half3 terrainSurfaceNormal = TerrainNormal(i.heightMapUV);
    half3 terrainSurfaceTangent = cross(terrainSurfaceNormal, float3(0,0,1));
    half3 terrainSurfaceBitangent = cross(terrainSurfaceTangent, terrainSurfaceNormal);

    half3 terrainNormal = TerrainNormalMap(splatUV0, splatUV1, splatUV2, splatUV3, control);
    terrainNormal = terrainNormal.x * terrainSurfaceTangent + 
                    terrainNormal.y * terrainSurfaceBitangent + 
                    terrainNormal.z * terrainSurfaceNormal;
    
    half3 terrainLightmapColor = TerrainLightmap(i.heightMapUV, terrainNormal);
    terrainColor *= terrainLightmapColor;

    // blend model color & terrain color

    half height = TerrainHeight(i.heightMapUV);
    half deltaHeight = i.worldPos.y - height;
    half blendingWeight = smoothstep(BlendStart, BlendEnd, deltaHeight);

    result.rgb = lerp(result.rgb, terrainColor, blendingFactor);
       
    return result; 
}


рддреЛ, рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рд╕рдореНрдорд┐рд╢реНрд░рдг рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмрди рд╕рд╣рд┐рдд рдКрдВрдЪрд╛рдИ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рд╕рд╛рде рд╕рдореНрдорд┐рд╢реНрд░рдг рдХрд░рддрд╛ рд╣реИред



рднреВрдирд┐рд░реНрдорд╛рдг рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕рдореНрдорд┐рд╢реНрд░рдг


рдореИрджрд╛рдиреА рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд░реНрд╢рди


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

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

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

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

  1. рдПрдХ рд╢рд░реНрдд рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдорд╛рдорд▓реЛрдВ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред
  2. . , ( , ), GPU. тАХ (branch granularity), , , , , . , , . , GPU , , . , GPU, , 1 (PowerVR SGX).


рд╕реБрд╕рдВрдЧрддрддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдВрд╢реЛрдВ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди

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


рдкрд░рд┐рджреГрд╢реНрдп рдЕрдВрд╢реЛрдВ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреА рд╕рд╛рдордВрдЬрд╕реНрдп рдпрд╣

рдЗрд╕ рд╕рдореНрдорд┐рд╢реНрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

  1. рдПрдХрддрд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рд╡рдЯ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдпрджрд┐ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдбреНрд░реЙ рдЗрдВрд╕реНрдЯреЗрдВрдбреЗрдб рдореЛрдб рд╕рдХреНрд╖рдо рд╣реИ [20] , рдЕрдиреНрдпрдерд╛ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рд▓рд┐рдП рд▓реИрдВрдбрд╕реНрдХреЗрдк рдкреНрд░рдХрд╛рд╢ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред
  2. Unity API , (base map) . - .
  3. , API (, Metal 16 ).
  4. 3D- , Terrain, SRP.
  5. 3D- , 3D- .
  6. , ┬л┬╗ , ┬л┬╗ . , ┬л┬╗ , . ┬л┬╗ .






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


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

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


рддрдбрд╝рдХ рдХреЗ рдмрд┐рдирд╛ 3 рдбреА рдореЙрдбрд▓ред рд╢реАрд░реНрд╖ рд╕реНрдиреЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде 3 рдбреА рдореЙрдбрд▓ред рд╢реАрд░реНрд╖ рд╕реНрдиреЗрдкрд┐рдВрдЧ рдФрд░ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде 3 рдбреА рдореЙрдбрд▓ред рд╢реАрд░реНрд╖ рд╕реНрдиреЗрдкрд┐рдВрдЧ, рд╕рдореНрдорд┐рд╢реНрд░рдг рдФрд░ рд╕реНрдереИрддрд┐рдХ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рд╛рде 3 рдбреА рдореЙрдбрд▓

рддрдбрд╝рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ 3 рдбреА рдореЙрдбрд▓ рдХреЗ рдХреМрди рд╕реЗ рдХреЛрдиреЗ рдЖрдкрдХреЛ рдКрдВрдЪрд╛рдИ рдХреЗ рдирдХреНрд╢реЗ рдкрд░ рд╕реНрдиреИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВред рд╡рд░реНрдЯреЗрдХреНрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рддрд╣ рдХреА рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ (рдЬреЛ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ) рдФрд░ рдЗрд╕рдХреЗ рдЯреЛрдкреЛрд▓реЙрдЬреА (рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

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


рддрдбрд╝рдХ рдХреЗ рд▓рд┐рдП рд╡реЗрдЯрд┐рдВрдЧ рдХреЛрдбрд┐рдВрдЧ

рдХреЛрдб рджреЗрдЦреЗрдВ
// Per-vertex snapping with terrain heightmap

#include "UnityCG.cginc"

sampler2D_float TerrainHeightmapTexture;

float4 HeightmapScale;
float4 TerrainSize;
float4 TerrainPos;

struct v2f
{

   // ...

   float3 worldPos : TEXCOORD0;
   float2 heightMapUV : TEXCOORD1;

   // ...

};

v2f vert(appdata v)
{
    v2f o;
    UNITY_INITIALIZE_OUTPUT(v2f,o);
   
    // ...
    
    o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    o.heightMapUV = TerrainUV(o.worldPos);
    float snappingWeight = v.color.r;                
    half height = TerrainHeight( o.heightMapUV );                
    o.worldPos.y = lerp( o.worldPos.y, height, snappingWeight );
    o.pos = UnityWorldToClipPos( half4( o.worldPos, 1 ) );

    // ...

    return o;
}


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


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


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

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


рд╕рдВрджрд░реНрдн



All Articles