如果没有自定义着色器(WP7),如何实现简单的UV纹理动画?我只需像在此视频中那样进行偏移:https://www.youtube.com/watch?feature=player_detailpage&v=VbDjHMer0Bw#t=309s
我可以在Model或甚至一堆顶点上执行此操作吗?
答案 0 :(得分: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
中,这意味着您唯一的选择是复制缓冲区,更改缓冲区并重新复制它。当心< / strong>这可能非常慢并且占用内存,具体取决于您的模型的复杂程度。所以请记住这一点。
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);
}
}
如果捕获数组中的初始纹理坐标,则可以在一定量后再回到它们;这样你就不会局限于不断包裹整个纹理。