Utilizarea RenderTarget ca textură după desenarea pe o textură

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Windows 10
  • Windows 11
Visual Studio
  • Visual Studio 2022
MonoGame
  • 3.8.1

Despre randarea țintelor

În mod normal, atunci când desenați, conținutul desenului este afișat pe ecran, dar puteți utiliza o țintă de randare pentru a scrie desenul la o textură. Conținutul scris în textură poate fi folosit ca textură așa cum este. De exemplu, dacă scrieți conținutul televizorului într-o textură și apoi lipiți textura pe ecranul televizorului, puteți muta o altă imagine în televizor. Desigur, poate fi folosit și ca imagine statică și puteți crea o textură dinamică fără a pregăti un fișier imagine pentru textură în avans.

Pregătirea imaginilor

Nu aveți nevoie de un fișier imagine pentru a utiliza ținta de randare, dar voi pregăti un fișier imagine pentru a-l face mai ușor de înțeles ca eșantion.

Acesta va fi folosit ca un fișier de conținut normal, așa că vă rugăm să-l înregistrați în MGCB. Texture Lăsați numele ca .

câmp

Game1 Să o scriem în clasă. Codul existent nu va fi modificat în special, așa că voi descrie doar suma adăugată fără a o descrie.

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

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

_texture Câmpurile sunt pentru încărcarea imaginilor pregătite și nu sunt deosebit de relevante pentru conținutul acestui sfat.

RenderTarget2D Câmpurile definite în clasă devin ținte de randare. Deoarece este necesar să GraphicsDevice se instantieze , nu poate fi creat în acest stadiu, deci este doar definit.

Constructor game1

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

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

Nu este nimic special de făcut aici. Pentru moment, am specificat rezoluția jocului, astfel încât să poată fi comparată cu ținta de randare.

LoadContent

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

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

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

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

În primul rând, citiți utilizarea Texture2D Content.Load pentru desen cu .

GraphicsDevice Dacă există RenderTarget2D , îl puteți genera oriunde, dar în exemplu îl vom crea în LoadContent metodă. Ținta de randare este o textură reală, deci are o dimensiune. Constructorul GraphicsDevice specifică, de asemenea, dimensiunea împreună cu .

Desena

Dacă utilizați o țintă de randare, codul de aici este cel principal.

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

Deoarece desenul este practic GraphicsDevice efectuat pe , chiar dacă procesul de desen este efectuat așa cum este, acesta va fi desenat pe fereastra principală. GraphicsDevice.SetRenderTarget Specificând o RenderTarget2D metodă, puteți comuta destinația desenului la o textură.

După comutare, procesul de desen se efectuează în același mod ca atunci când desenați în fereastra principală. GraphicsDevice.Clear șterge informațiile de desen și deseneazăSpriteBatch sprite. În scopul de a verifica dacă sunteți într-adevăr desen împotriva textura, am specificat în mod deliberat poziția de desen, astfel încât sprite iese de data aceasta.

După ce ați terminat de desenat la ținta de randare, GraphicsDevice.SetRenderTarget specificați null metoda. Acest lucru vă permite să returnați ținta de desen la fereastra principală.

RenderTarget2D poate fi folosit ca o textura asa cum este, asa ca SpriteBatch.Draw am specifica _renderTarget metoda de a trage ca un sprite.

execuție

După ce ați scris codul, încercați să îl rulați. Dacă arată ca cifra, este OK.

Culoarea de umplere pentru ținta de randare și culoarea de umplere pentru fereastra principală sunt separate, astfel încât să puteți vedea unde a fost creată textura ca țintă de randare. Am desenat sprite, astfel încât să iasă împotriva țintă face, dar cred că puteți vedea că acesta este corect tuns și nu trase spre fereastra principală.

Acesta este tot codul care atinge ținta de randare. Nu este nimic deosebit de dificil. Cred că singurul lucru care îmi pasă este gestionarea trecerea de destinații de desen și RenderTarget2D de gestionare .

Încercați să-l mutați

Rezultatul execuției anterioare arată ca imaginea este pur și simplu decupată și desenată, astfel încât Apoi, aș dori să se mute sprite pentru a vă asigura că acesta este corect trase în țintă face.

Update Deoarece dorim să actualizăm rotația de fiecare dată, vom pregăti unghiul de rotație în câmp.

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

Update În metodă, creșteți _rotate numărul de .

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 Metoda setează sprite să se _rotate rotească. Trebuie doar să știți că se rotește, astfel încât celelalte valori sunt setate în mod corespunzător.

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

Când îl rulați, ar trebui să deseneze în timp ce se rotește așa cum se arată în figură.