Verwenden von RenderTarget als Textur nach dem Zeichnen einer Textur

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 10
  • Windows 11
Visual Studio
  • Visual Studio 2022
MonoSpiel
  • 3.8.1

Informationen zu Renderzielen

Normalerweise wird beim Zeichnen der Zeichnungsinhalt auf dem Bildschirm angezeigt, aber Sie können ein Renderziel verwenden, um die Zeichnung in eine Textur zu schreiben. Der in der Textur geschriebene Inhalt kann unverändert als Textur verwendet werden. Wenn Sie z. B. den Inhalt des Fernsehgeräts in eine Textur schreiben und die Textur dann auf dem Fernsehbildschirm einfügen, können Sie ein anderes Bild auf dem Fernsehgerät verschieben. Natürlich kann es auch als Standbild verwendet werden, und Sie können eine Textur dynamisch erstellen, ohne im Voraus eine Bilddatei für die Textur vorzubereiten.

Vorbereiten von Bildern

Sie benötigen keine Bilddatei, um das Renderziel zu verwenden, aber ich bereite eine Bilddatei vor, um sie als Beispiel leichter verständlich zu machen.

Es wird als normale Inhaltsdatei verwendet, also registrieren Sie es bitte in MGCB. Texture Behalten Sie den Namen als .

Feld

Game1 Lasst es uns in der Klasse schreiben. Der bestehende Code wird nicht insbesondere geändert, daher werde ich nur den hinzugefügten Betrag beschreiben, ohne ihn zu beschreiben.

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

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

_texture Die Felder dienen zum Laden der vorbereiteten Bilder und sind für den Inhalt dieses Tipps nicht besonders relevant.

RenderTarget2D Felder, die in der Klasse definiert sind, werden zu Renderzielen. Da es notwendig ist, GraphicsDevice zu instanziieren , kann es zu diesem Zeitpunkt nicht erstellt werden, daher ist es nur definiert.

Game1-Konstruktor

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

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

Hier gibt es nichts Besonderes zu tun. Vorerst habe ich die Auflösung des Spiels angegeben, damit sie mit dem Renderziel verglichen werden kann.

LoadContent (Inhalt laden)

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

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

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

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

Lesen Sie zunächst die Verwendung Texture2D Content.Load zum Zeichnen mit .

GraphicsDevice Wenn ja RenderTarget2D , können Sie es überall generieren, aber im Beispiel werden wir es in LoadContent der Methode erstellen. Das Renderziel ist eine echte Textur, hat also eine Größe. Der GraphicsDevice Konstruktor gibt auch die Größe zusammen mit an.

Zeichnen

Wenn Sie ein Renderziel verwenden, ist der Code hier der Hauptcode.

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

Da das Zeichnen grundsätzlich GraphicsDevice auf ausgeführt wird, wird es auch dann gegen das Hauptfenster gezeichnet, auch wenn der Zeichenvorgang so ausgeführt wird, wie er ist. GraphicsDevice.SetRenderTarget Durch Angeben einer RenderTarget2D Methode können Sie das Zeichnungsziel in eine Textur umwandeln.

Nach dem Umschalten wird der Zeichenvorgang auf die gleiche Weise durchgeführt wie beim Zeichnen im Hauptfenster. GraphicsDevice.Clear Löscht die Zeichnungsinformationen und zeichnetSpriteBatch das Sprite. Um zu überprüfen, ob du wirklich gegen die Textur zeichnest, habe ich die Zeichenposition bewusst so angegeben, dass das Sprite diesmal übersteht.

Wenn Sie mit dem Zeichnen des Renderziels fertig sind, GraphicsDevice.SetRenderTarget geben Sie die null Methode an. Auf diese Weise können Sie das Zeichnungsziel in das Hauptfenster zurückgeben.

RenderTarget2D kann als Textur verwendet werden, so wie es ist, also SpriteBatch.Draw gebe ich die _renderTarget Methode an, um es als Sprite zu zeichnen.

Ausführung

Nachdem Sie den Code geschrieben haben, versuchen Sie, ihn auszuführen. Wenn es so aussieht wie die Abbildung, ist es in Ordnung.

Die Füllfarbe für das Renderziel und die Füllfarbe für das Hauptfenster sind getrennt, sodass Sie sehen können, wo die Textur als Renderziel erstellt wurde. Ich habe das Sprite so gezeichnet, dass es aus dem Renderziel herausragt, aber ich denke, Sie können sehen, dass es richtig abgeschnitten und nicht in Richtung des Hauptfensters gezeichnet ist.

Das ist der gesamte Code, mit dem das Renderziel erreicht wird. Es gibt nichts besonders Schwieriges. Ich denke, das einzige, worum ich mich kümmere, ist das Verwalten des Umschaltens von Zeichnungszielen und RenderTarget2D das Verwalten von .

Versuchen Sie, es zu verschieben

Das Ergebnis der vorherigen Ausführung sieht so aus, als ob das Bild einfach zugeschnitten und gezeichnet wird, also Als Nächstes möchte ich das Sprite verschieben, um sicherzustellen, dass es im Renderziel richtig gezeichnet wird.

Update Da wir die Rotation jedes Mal aktualisieren möchten, bereiten wir den Rotationswinkel im Feld vor.

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

Update Erhöhen Sie in der Methode die _rotate Anzahl von .

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 Die Methode legt fest, dass _rotate das Sprite gedreht wird. Sie müssen nur wissen, dass es sich dreht, damit die anderen Werte entsprechend eingestellt werden.

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

Wenn Sie es ausführen, sollte es beim Drehen wie in der Abbildung gezeigt gezeichnet werden.