XNA渲染3D视频(固定FPS!)

时间:2010-09-01 08:31:47

标签: video xna rendering frames textures

我必须开发一个应用程序,最后一步是导出由我的软件生成的3D动画的视频(或单帧)计算用户输入参数。

我想使用XNA并为此。我需要软件可以导出FIXED FPS视频(或者单独输出视频的所有单帧)。这不是LIVE FPS的问题。我不需要在屏幕上以固定的fps查看帧。由于动画可能非常复杂,我可以接受,如果软件每帧需要1分钟。

重要的是我可以在渲染时看到框架,并且不会跳过任何框架。 例如。如果视频是1分钟长,它还必须以24fps导出24帧,如果它需要20秒来渲染每帧。在渲染第一帧之后(所以在20秒之后)它不再在21秒处渲染帧。它必须渲染帧[第一分钟的2/24]

我怎样才能获得这个?

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是为XNA 4.0执行此操作的方法,在Game类的代码中描述(因为对我来说很容易):

protected override void Update(GameTime gameTime)
{
    // Do Nothing!
}

void RealUpdate()
{
    const float deltaTime = 1f/60f; // Fixed 60 FPS     
    // Update your scene here
}

RenderTarget2D screenshot;

protected override void LoadContent()
{
    screenshot = new RenderTarget2D(GraphicsDevice, width, height, false, SurfaceFormat.Color, null);
}

protected override void UnloadContent()
{
    screenshot.Dispose();
}

int i = 0;

protected override void Draw(GameTime)
{
    RealUpdate(); // Do the update once before drawing each frame.

    GraphicsDevice.SetRenderTarget(screenshot); // rendering to the render target
    //
    // Render your scene here
    //
    GraphicsDevice.SetRenderTarget(null); // finished with render target

    using(FileStream fs = new FileStream(@"screenshot"+(i++)+@".png", FileMode.OpenOrCreate)
    {
        screenshot.SaveAsPng(fs, width, height); // save render target to disk
    }

    // Optionally you could render your render target to the screen as well so you can see the result!

    if(done)
        Exit();
}

注意:我在没有编译或测试的情况下写了这个 - 所以可能会有一两个小错误。