Это возможно без пользовательских шейдеров, если вы измените рисунки вершин.
Если у вас есть массив вершин где-то, вы можете сделать следующее в 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);
}
}
Если вы захватили исходные текстурные коорды в массиве, вы всегда можете вернуться к ним после определенной суммы; таким образом, вы не ограничены постоянной упаковкой всей текстуры.