2013-04-11 1 views
2

Без пользовательских шейдеров (WP7), как возможна простая анимация UV-текстуры? Мне просто нужно это смещать, как в этом видео: https://www.youtube.com/watch?feature=player_detailpage&v=VbDjHMer0Bw#t=309sУльтрафиолетовая текстура Смещение анимации на Windows Phone 7

Могу ли я сделать это на модели или даже просто кучу вершин?

ответ

2

Это возможно без пользовательских шейдеров, если вы измените рисунки вершин.

Если у вас есть массив вершин где-то, вы можете сделать следующее в Update:

var speed = new Vector2(0.1f, 0.1f); 
Vector2 uvOffset = speed * (float)gameTime.ElapsedGameTime.TotalSeconds; 

for (int i = 0; i < vertices.Length; ++i) 
{ 
    vertices[i].TextureCoordinate += uvOffset; 
} 

Поскольку вершины меняются так часто, что это хорошая идея, чтобы сделать их непосредственно с помощью DrawUserPrimitives или DrawUserIndexedPrimitives, например, :.

GraphicsDevice.DrawUserPrimitives<VertexPositionNormalTexture>(PrimitiveType.TriangleList, vertices, 0, vertices.Length/3); 

на XNA Model все хранится в нединамических VertexBuffer с, что означает, что ваш единственный выбор, чтобы скопировать буфер, изменить его и переписать его обратно в Остерегайтесь, что это потенциально очень медленное и зависание памяти, в зависимости от сложности вашей модели. Поэтому имейте это в виду.

var speed = new Vector2(0.1f, 0.1f); 
Vector2 uvOffset = speed * (float)gameTime.ElapsedGameTime.TotalSeconds; 

//unset first 
GraphicsDevice.SetVertexBuffer(null); 

foreach (ModelMesh mesh in model.Meshes) 
{ 
    foreach (ModelMeshPart mp in mesh.MeshParts) 
    {      
     //copy array first to change it 
     var newVertices = new VertexPositionNormalTexture[mp.VertexBuffer.VertexCount]; 
     mp.VertexBuffer.GetData<VertexPositionNormalTexture>(newVertices); 

     //offset all texture coords 
     for (int i = 0; i < newVertices.Length; ++i) 
     { 
      newVertices[i].TextureCoordinate += uvOffset; 
     } 

     //set data back into buffer 
     mp.VertexBuffer.SetData<VertexPositionNormalTexture>(newVertices); 
    } 
} 

Если вы захватили исходные текстурные коорды в массиве, вы всегда можете вернуться к ним после определенной суммы; таким образом, вы не ограничены постоянной упаковкой всей текстуры.