Utilizzo di RenderTarget come texture dopo aver disegnato su una texture

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • Windows 10
  • Windows 11
Visual Studio
  • Visual Studio 2022
Monogioco
  • 3.8.1

Informazioni sulle destinazioni di rendering

In genere, quando si disegna, il contenuto del disegno viene visualizzato sullo schermo, ma è possibile utilizzare una destinazione di rendering per scrivere il disegno in una texture. Il contenuto scritto nella texture può essere utilizzato come texture così com'è. Ad esempio, se si scrive il contenuto del televisore in una trama e quindi si incolla la trama sullo schermo TV, è possibile spostare un'immagine diversa nel televisore. Naturalmente, può anche essere utilizzato come immagine fissa e puoi creare una texture dinamicamente senza preparare in anticipo un file di immagine per la trama.

Preparazione delle immagini

Non è necessario un file di immagine per utilizzare la destinazione di rendering, ma preparerò un file di immagine per renderlo più facile da capire come esempio.

Verrà utilizzato come un normale file di contenuto, quindi si prega di registrarlo in MGCB. Texture Lasciare il nome come .

campo

Game1 Scriviamolo in classe. Il codice esistente non verrà modificato in particolare, quindi descriverò solo l'importo aggiunto senza descriverlo.

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

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

_texture I campi servono per caricare le immagini preparate e non sono particolarmente rilevanti per il contenuto di questo suggerimento.

RenderTarget2D I campi definiti nella classe diventano destinazioni di rendering. Poiché è necessario creare GraphicsDevice un'istanza , non può essere creato in questa fase, quindi è solo definito.

Costruttore Game1

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

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

Non c'è niente di speciale da fare qui. Per il momento, ho specificato la risoluzione del gioco in modo che possa essere confrontata con la destinazione di rendering.

LoadContent

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

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

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

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

Innanzitutto, leggete l'uso Texture2D Content.Load per disegnare con .

GraphicsDevice Se c'è RenderTarget2D , puoi generarlo ovunque, ma nell'esempio lo creeremo nel LoadContent metodo. La destinazione di rendering è una texture reale, quindi ha una dimensione. Il GraphicsDevice costruttore specifica inoltre la dimensione insieme a .

Disegnare

Se si utilizza una destinazione di rendering, il codice qui è quello principale.

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

Poiché il disegno viene fondamentalmente GraphicsDevice eseguito su , anche se il processo di disegno viene eseguito così com'è, verrà disegnato contro la finestra principale. GraphicsDevice.SetRenderTarget Specificando un RenderTarget2D metodo, potete cambiare la destinazione del disegno in una texture.

Dopo il passaggio, il processo di disegno viene eseguito nello stesso modo in cui si disegna nella finestra principale. GraphicsDevice.Clear Cancella le informazioni di disegno e disegnaSpriteBatch lo sprite. Per verificare se stai davvero disegnando contro la trama, ho deliberatamente specificato la posizione del disegno in modo che lo sprite sporga questa volta.

Al termine del disegno sulla destinazione di rendering, GraphicsDevice.SetRenderTarget specificate il null metodo. In questo modo è possibile riportare la destinazione del disegno nella finestra principale.

RenderTarget2D può essere usato come texture così com'è, quindi SpriteBatch.Draw specifico il _renderTarget metodo per disegnarlo come uno sprite.

esecuzione

Dopo aver scritto il codice, prova a eseguirlo. Se assomiglia alla figura, è OK.

Il colore di riempimento per la destinazione di rendering e il colore di riempimento per la finestra principale sono separati, in modo da poter vedere dove è stata creata la texture come destinazione di rendering. Ho disegnato lo sprite in modo che sporga contro la destinazione di rendering, ma penso che tu possa vedere che è correttamente ritagliato e non disegnato verso la finestra principale.

Questo è tutto il codice che raggiunge la destinazione di rendering. Non c'è nulla di particolarmente difficile. Penso che l'unica cosa che mi interessa sia gestire il cambio di destinazione del disegno e RenderTarget2D la gestione di .

Prova a spostarlo

Il risultato dell'esecuzione precedente sembra che l'immagine sia semplicemente ritagliata e disegnata, quindi Successivamente, vorrei spostare lo sprite per assicurarmi che sia disegnato correttamente nella destinazione di rendering.

Update Poiché vogliamo aggiornare la rotazione ogni volta, prepareremo l'angolo di rotazione nel campo.

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

Update Nel metodo, aumentare il _rotate numero di .

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 Il metodo imposta lo sprite in modo che _rotate ruoti. Devi solo sapere che sta ruotando, quindi gli altri valori sono impostati in modo appropriato.

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

Quando lo eseguite, dovrebbe essere disegnato durante la rotazione, come mostrato nella figura.