рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХрдВрдХрд╛рд▓ рдПрдиреАрдореЗрд╢рди

рдПрдХрддрд╛ рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдИрд╕реАрдПрд╕ рдХреА рд╢реБрд░реБрдЖрдд рдХреАред рдЕрдзреНрдпрдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдФрд░ рдИрд╕реАрдПрд╕ рдХреЛ рдХреИрд╕реЗ рджреЛрд╕реНрдд рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЦреЛрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдЬреЛ рдХрд┐ NORDVEUS рдХреЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдпреВрдирд╛рдЗрдЯ рдСрд╕реНрдЯрд┐рди 2017 рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдбреЗрдореЛ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ред
рдпреВрдирд╛рдЗрдЯ рдСрд╕реНрдЯрд┐рди 2017 - рд╕реНрдкреЗрд▓рд╕рд▓реНрд╕ рдпреВрдирд┐рд╡рд░реНрд╕ рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд▓рдбрд╝рд╛рдИред


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


рдРрд╕реА рдореБрд╢реНрдХрд┐рд▓реЗрдВ, рдЖрдк рдХреНрдпреЛрдВ рдкреВрдЫрддреЗ рд╣реИрдВ?


NORDVEUS рдХреЗ рд▓реЛрдЧ рдПрдХ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдПрдирд┐рдореЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдХрдВрдХрд╛рд▓, рддрд▓рд╡рд╛рд░рдмрд╛рдЬред рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ: SkinnedMeshRenderers рдФрд░ рдПрдирд┐рдореЗрд╢рди \ рдПрдиреАрдореЗрдЯрд░ , рдбреНрд░реЙ рдХреЙрд▓ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рджреЗрдЧрд╛ред рдФрд░ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдиреАрдореЗрд╢рди рдХреЛ GPU рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рд╡рд░реНрдЯреЗрдХрд░ shader рдХреЗ рдмрдЬрд╛рдпред



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


рддреЛ рдЖрдЗрдП рд╣рд╛рдереА рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдХрд╛рдЯреЗрдВ:



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


рдПрдиреАрдореЗрд╢рди рдХреНрд▓рд┐рдк рд╕реЗ рдПрдиреАрдореЗрд╢рди рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


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


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


var boneMatrices = new Matrix4x4[Mathf.CeilToInt(frameRate * clip.length), renderer.bones.Length]; 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХреНрд▓рд┐рдк рдХреЗ рд▓рд┐рдП рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдлреНрд░реЗрдо рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдореИрдЯреНрд░реАрд╕ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ:


 //       for (var frameIndex = 0; frameIndex < totalFramesInClip; ++frameIndex) { //  : 0 -  , 1 - . var normalizedTime = (float) frameIndex / totalFramesInClip; //     animationState.normalizedTime = normalizedTime; animation.Sample(); //     for (var boneIndex = 0; j < renderer.bones.Length; boneIndex++) { //         var matrix = renderer.bones[boneIndex].localToWorldMatrix * renderer.sharedMesh.bindposes[boneIndex]; //   boneMatrices[i, j] = matrix; } } 

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


 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 0 0 0 1 

рдбреЗрдЯрд╛ рдХреЛ рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛


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


 var dataSize = numberOfBones * numberOfKeyFrames * MATRIX_ROWS_COUNT); //      var size = NextPowerOfTwo((int) Math.Sqrt(dataSize)); var texture = new Texture2D(size, size, TextureFormat.RGBAFloat, false) { wrapMode = TextureWrapMode.Clamp, filterMode = FilterMode.Point, anisoLevel = 0 }; 

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


 Clip0[Frame0[Bone0[row0,row1,row2]...BoneN[row0,row1,row2].]...FramM[bone0[row0,row1,row2]...ClipK[...] 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рд╣реЗрдЬреЗрдВ рд╣реИ:


 var textureColor = new Color[texture.width * texture.height]; var clipOffset = 0; for (var clipIndex = 0; clipIndex < sampledBoneMatrices.Count; clipIndex++) { var framesCount = sampledBoneMatrices[clipIndex].GetLength(0); for (var keyframeIndex = 0; keyframeIndex < framesCount; keyframeIndex++) { var frameOffset = keyframeIndex * numberOfBones * 3; for (var boneIndex = 0; boneIndex < numberOfBones; boneIndex++) { var index = clipOffset + frameOffset + boneIndex * 3; var matrix = sampledBoneMatrices[clipIndex][keyframeIndex, boneIndex]; textureColor[index + 0] = matrix.GetRow(0); textureColor[index + 1] = matrix.GetRow(1); textureColor[index + 2] = matrix.GetRow(2); } } } texture.SetPixels(textureColor); texture.Apply(false, false); 

рдореЗрд╖ (рдореЗрд╖) рдХреА рддреИрдпрд╛рд░реА


рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рд╣рдбреНрдбреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдФрд░ рдЗрд╕ рд╢реАрд░реНрд╖ рдкрд░ рд╣рдбреНрдбреА рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╡рдЬрди рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред
рдПрдХрддрд╛ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП 4 рд╣рдбреНрдбрд┐рдпрд╛рдВ рд╕рдВрднрд╡ рд╣реИрдВред рдиреАрдЪреЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ uv рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред рд╣рдо UV1 рдореЗрдВ рд╣рдбреНрдбрд┐рдпреЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдпреВрд╡реА 2 рдореЗрдВ рд╡рдЬрди рдХрд░рддреЗ рд╣реИрдВред


 var boneWeights = mesh.boneWeights; var boneIds = new List<Vector4>(mesh.vertexCount); var boneInfluences = new List<Vector4>(mesh.vertexCount); for (var i = 0; i < mesh.vertexCount; i++) { boneIds.Add(new Vector4(bw.boneIndex0, bw.boneIndex1, bw.boneIndex2, bw.boneIndex3); boneInfluences.Add(new Vector4(bw.weight0, bw.weight1, bw.weight2, bw.weight3)); } mesh.SetUVs(1, boneIds); mesh.SetUVs(2, boneInfluences); 

рд╢реЗрдбрд░


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


 // frameOffset = clipOffset + frameIndex * clipLength * 3 -     CPU // boneIndex -      ,   UV1 int index = frameOffset + boneIndex * 3; 

рддреЛ рд╣рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдорд┐рд▓рд╛, рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреНрд░рдорд╢рдГ +1, +2 рд╣реЛрдЧрд╛ред рдпрд╣ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдПрдХ-рдЖрдпрд╛рдореА рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


 inline float4 IndexToUV(int index, float2 size) { return float4(((float)((int)(index % size.x)) + 0.5) / size.x, ((float)((int)(index / size.x)) + 0.5) / size.y, 0, 0); } 

рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдШрдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдХрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ (0, 0, 0, 1) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред


 float4 row0 = tex2Dlod(frameOffset, IndexToUV(index + 0, animationTextureSize)); float4 row1 = tex2Dlod(frameOffset, IndexToUV(index + 1, animationTextureSize)); float4 row2 = tex2Dlod(frameOffset, IndexToUV(index + 2, animationTextureSize)); float4 row3 = float4(0, 0, 0, 1); return float4x4(row0, row1, row2, row3); 

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


 float4x4 m0 = CreateMatrix(frameOffset, bones.x) * boneInfluences.x; float4x4 m1 = CreateMatrix(frameOffset, bones.y) * boneInfluences.y; float4x4 m2 = CreateMatrix(frameOffset, bones.z) * boneInfluences.z; float4x4 m3 = CreateMatrix(frameOffset, bones.w) * boneInfluences.w; return m0 + m1 + m2 + m3; 

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


рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Graphics.DrawMeshInstancedIndirect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рддреИрдпрд╛рд░ рдЬрд╛рд▓ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╛рдордЧреНрд░реА рдореЗрдВ, рд╣рдореЗрдВ рдЯреЗрдХреНрд╕рдЪрд░ рд╕рд╛рдЗрдЬ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕рдЪрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореМрдЬреВрджрд╛ рд╕рдордп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреАред рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд░реЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╢реЗрдбрд░ рд╕рд╛рдЗрдб рдкрд░ рд░реЛрдЯреЗрд╢рди рдХреЛ [рд▓реЗрдЦ] рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рдордп рдХреА рдЕрд╡рдзрд┐ рдмрдврд╝рд╛рдПрдБ рдПрдиреАрдореЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ Time.deltaTime рдкрд░ред


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


 var offset = clipStart + frameIndex * bonesCount * 3.0f 

рд╢рд╛рдпрдж рдпрд╣ рд╕рднреА shader рдХреЛ рд╕рднреА рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рдо Graphics.DrawMeshInstancedIndirect рдХреЛ рддреИрдпрд╛рд░ рдЬрд╛рд▓ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВред


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


1050 рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рд╡рд╛рд▓реА рдорд╢реАрди рдкрд░ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдмрдврд╝рд╛ред


рдЫрд╡рд┐

рд╕реАрдкреАрдпреВ рдкрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА 4000 рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдиреАрдореЗрд╢рди


рдЫрд╡рд┐

GPU рдкрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА 8000 рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдиреАрдореЗрд╢рди


рдЙрд╕реА рд╕рдордп, рдПрдХ рдПрдХреАрдХреГрдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдореИрдХрдмреБрдХ рдкреНрд░реЛ 15 рдкрд░ рдЗрд╕ рджреГрд╢реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдкрд░реАрдд рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИред GPU рдмреЗрд╢рд░реНрдореА рд╕реЗ рд╣рд╛рд░ рдЬрд╛рддрд╛ рд╣реИ (рд▓рдЧрднрдЧ 2-3 рдмрд╛рд░), рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИред


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


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




[рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб]

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред


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


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


All Articles