Använda RenderTarget som textur efter att ha ritat på en textur

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 10
  • Fönster 11
Visuell studio
  • Visual Studio 2022
Monospel
  • 3.8.1

Om renderingsmål

När du ritar visas ritningsinnehållet normalt på skärmen, men du kan använda ett renderingsmål för att skriva ritningen till en textur. Innehållet skrivet i texturen kan användas som en textur som den är. Om du till exempel skriver innehållet på TV:n till en textur och sedan klistrar in texturen på TV-skärmen kan du flytta en annan bild i TV:n. Naturligtvis kan den också användas som en stillbild, och du kan skapa en textur dynamiskt utan att förbereda en bildfil för texturen i förväg.

Förbereda bilder

Du behöver ingen bildfil för att använda renderingsmålet, men jag ska förbereda en bildfil för att göra den lättare att förstå som ett exempel.

Den kommer att användas som en vanlig innehållsfil, så registrera den i MGCB. Texture Lämna namnet som .

fält

Game1 Låt oss skriva det i klassen. Den befintliga koden kommer inte att ändras i synnerhet, så jag kommer bara att beskriva det tillagda beloppet utan att beskriva det.

/// <summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;

/// <summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;

_texture Fälten är för att ladda de förberedda bilderna och är inte särskilt relevanta för innehållet i detta tips.

RenderTarget2D Fält som definieras i klassen blir renderingsmål. Eftersom det är nödvändigt att GraphicsDevice instansiera , det kan inte skapas i detta skede, så det definieras bara.

Game1 konstruktör

public Game1()
{
  _graphics = new GraphicsDeviceManager(this);
  Content.RootDirectory = "Content";
  IsMouseVisible = true;

  // ゲームの解像度の設定
  _graphics.PreferredBackBufferWidth = 1280;
  _graphics.PreferredBackBufferHeight = 720;
}

Det finns inget speciellt att göra här. För närvarande har jag specificerat spelets upplösning så att den kan jämföras med renderingsmålet.

LoadContent

protected override void LoadContent()
{
  _spriteBatch = new SpriteBatch(GraphicsDevice);

  // TODO: this.Content を使用してゲーム コンテンツをここに読み込みます

  // コンテンツからテクスチャーを読み込みます
  _texture = Content.Load<Texture2D>("Texture");

  _renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}

Läs först användningen Texture2D Content.Load för att rita med .

GraphicsDevice Om det finns RenderTarget2D kan du generera det var som helst, men i exemplet skapar vi det i LoadContent metoden. Renderingsmålet är en riktig struktur, så det har en storlek. Konstruktorn GraphicsDevice anger också storleken tillsammans med .

Rita

Om du använder ett renderingsmål är koden här den viktigaste.

protected override void Draw(GameTime gameTime)
{
  // TODO: ここに描画コードを追加します

  // 描画先対象をレンダーターゲットに設定
  GraphicsDevice.SetRenderTarget(_renderTarget);

  // テクスチャーの情報をクリアし単色で塗りつぶします
  GraphicsDevice.Clear(Color.LightYellow);

  // スプライトバッチを使用してスプライトを書き込みます
  // レンダーターゲットの外に影響ないことを確認するためにわざと領域をはみ出るように描画しています
  _spriteBatch.Begin();
  for (int i = 0; i < 4; i++)
  {
    _spriteBatch.Draw(_texture, new Vector2((i / 2) * 200 - 50, (i % 2) * 200 - 50), Color.White);
  }
  _spriteBatch.End();

  // レンダーターゲットを解除します。これ以降の描画処理はメインウインドウに対して行われます
  GraphicsDevice.SetRenderTarget(null);

  // メインウィンドウの描画情報をクリアし単色で塗りつぶします
  GraphicsDevice.Clear(Color.CornflowerBlue);

  // メインウィンドウに対してレンダーターゲットをテクスチャーとして描画します
  _spriteBatch.Begin();
  _spriteBatch.Draw(_renderTarget, new Vector2(100, 100), Color.White);
  _spriteBatch.End();

  base.Draw(gameTime);
}

Eftersom ritning i princip GraphicsDevice utförs på , även om ritningsprocessen utförs som den är, kommer den att dras mot huvudfönstret. GraphicsDevice.SetRenderTarget Genom att ange en metod kan du växla ritningsmålet till en RenderTarget2D textur.

Efter växling utförs ritningsprocessen på samma sätt som vid ritning i huvudfönstret. GraphicsDevice.Clear Rensar ritningsinformationen och ritarSpriteBatch spriten. För att kontrollera om du verkligen ritar mot texturen specificerade jag medvetet ritningspositionen så att spriten sticker ut den här gången.

När du är klar med ritningen till renderingsmålet GraphicsDevice.SetRenderTarget anger null du metoden. Detta gör att du kan återställa ritningsmålet till huvudfönstret.

RenderTarget2D kan användas som en textur som den är, så SpriteBatch.Draw jag anger metoden för att rita den _renderTarget som en sprite.

avrättning

När du har skrivit koden kan du prova att köra den. Om det ser ut som figuren är det OK.

Fyllningsfärgen för renderingsmålet och fyllningsfärgen för huvudfönstret separeras så att du kan se var texturen skapades som renderingsmål. Jag ritade spriten så att den sticker ut mot renderingsmålet, men jag tror att du kan se att den är ordentligt klippt och inte ritad mot huvudfönstret.

Det är all kod som uppnår renderingsmålet. Det finns inget särskilt svårt. Jag tror att det enda jag bryr mig om är att hantera byte av ritningsdestinationer och RenderTarget2D hantera .

Prova att flytta den

Resultatet av föregående körning ser ut som att bilden helt enkelt beskärs och ritas, så Därefter vill jag flytta sprite för att se till att den ritas korrekt i renderingsmålet.

Update Eftersom vi vill uppdatera rotationen varje gång kommer vi att förbereda rotationsvinkeln i fältet.

/// <summary>テクスチャーを回転させる角度。</summary>
private float _rotate;

Update I metoden ökar _rotate du antalet .

protected override void Update(GameTime gameTime)
{
  if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
    Exit();

  // TODO: ここに更新ロジックを追加します

  // テクスチャーの回転角度を更新します
  _rotate += 0.01f;

  base.Update(gameTime);
}

Draw Metoden ställer in sprite att _rotate rotera. Du behöver bara veta att den roterar, så de andra värdena ställs in på lämpligt sätt.

protected override void Draw(GameTime gameTime)
{
  // 中略

  // スプライトバッチを使用してスプライトを書き込みます
  // レンダーターゲットの外に影響ないことを確認するためにわざと領域をはみ出るように描画しています
  _spriteBatch.Begin();
  for (int i = 0; i < 4; i++)
  {
    _spriteBatch.Draw(_texture, new Vector2((i / 2) * 200 + 32, (i % 2) * 200 + 32),
      null, Color.White, _rotate * i, new Vector2(64, 64), 1, SpriteEffects.None, 0);
  }
  _spriteBatch.End();

  // 中略

  // メインウィンドウに対してレンダーターゲットをテクスチャーとして描画します
  _spriteBatch.Begin();
  _spriteBatch.Draw(_renderTarget, new Vector2(400, 400), null, Color.White,
    _rotate, new Vector2(_renderTarget.Width / 2, _renderTarget.Height / 2), 1, SpriteEffects.None, 0);
  _spriteBatch.End();

  base.Draw(gameTime);
}

När du kör den ska den rita medan den roterar som visas i figuren.