2013-04-11 3 views

답변

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, 예를 사용하는 것이 좋습니다 :.

유일한 선택은, 버퍼을 복사하고 변경하고 다시 그것을 다시 복사하는 것을 의미 Model 모든 비 동적 VertexBuffer의에 저장된 XNA에
GraphicsDevice.DrawUserPrimitives<VertexPositionNormalTexture>(PrimitiveType.TriangleList, vertices, 0, vertices.Length/3); 

은 모델이 얼마나 복잡한 지에 따라 잠재적으로 매우 느리고 메모리 호깅이 될 수 있음을주의하십시오. 그러니 이것을 명심하십시오.

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

배열에서 초기 텍스처 좌표를 캡처하면 일정량 후에 항상 원래대로 되돌릴 수 있습니다. 그런 식으로 전체 질감을 끊임없이 감싸는 것에 국한되지 않습니다.