Windows Phone 7上的UV纹理偏移动画

本文关键字:移动 动画 纹理 UV Phone 上的 Windows | 更新日期: 2023-09-27 18:08:38

没有自定义着色器(WP7),如何实现简单的UV纹理动画?我只需要像这个视频中那样进行偏移:https://www.youtube.com/watch?feature=player_detailpage&v=VbDjHMer0Bw#t=309s

我可以在一个模型上做这个,甚至只是一堆顶点吗?

Windows Phone 7上的UV纹理偏移动画

如果您改变正在绘制的顶点,则可以不使用自定义着色器。

如果你有一个顶点数组,你可以在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;
}

由于顶点经常变化,所以直接使用DrawUserPrimitivesDrawUserIndexedPrimitives来绘制它们是一个好主意,例如:

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

在XNA Model上,所有内容都存储在非动态VertexBuffer s中,这意味着您唯一的选择是复制缓冲区,更改它,然后重新将其复制回来。注意,这可能非常慢并且占用内存,这取决于您的模型有多复杂。所以请记住这一点。

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);
    }
}

如果你在数组中捕获初始纹理坐标,你可以在一定数量后返回它们;这样你就不会被限制在不断地包裹整个纹理