Použitie RenderTarget ako textúry po nakreslení textúry

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 10
  • Windows 11
Vizuálne štúdio
  • Visual Studio 2022
MonoGame
  • 3.8.1

Informácie o cieľoch vykresľovania

Za normálnych okolností sa pri kreslení obsah kresby zobrazí na obrazovke, ale na zápis kresby do textúry môžete použiť cieľ vykreslenia. Obsah napísaný v textúre môže byť použitý ako textúra taká, aká je. Ak napríklad zapíšete obsah televízora na textúru a potom textúru prilepíte na obrazovku televízora, môžete v televízore presunúť iný obrázok. Samozrejme, dá sa použiť aj ako statický obrázok a textúru môžete vytvoriť dynamicky bez toho, aby ste vopred pripravili obrazový súbor pre textúru.

Príprava obrázkov

Na použitie cieľa vykreslenia nepotrebujete obrazový súbor, ale pripravím obrazový súbor, aby bol ľahšie pochopiteľný ako vzorka.

Bude použitý ako normálny obsahový súbor, preto ho zaregistrujte v MGCB. Texture Názov ponechajte ako .

pole

Game1 Napíšte to v triede. Existujúci kód sa konkrétne nezmení, takže pridanú sumu iba popíšem bez toho, aby som ju popisoval.

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

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

_texture Polia slúžia na načítanie pripravených obrázkov a nie sú zvlášť relevantné pre obsah tohto tipu.

RenderTarget2D Polia definované v triede sa stanú cieľmi vykreslenia. Keďže je potrebné inštancovať GraphicsDevice , v tejto fáze ho nemožno vytvoriť, takže je definovaný.

Konštruktér hry 1

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

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

Nie je tu nič zvláštne. Zatiaľ som špecifikoval rozlíšenie hry tak, aby sa dalo porovnať s cieľom vykreslenia.

Načítať obsah

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

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

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

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

Najprv si prečítajte použitie Texture2D Content.Load na kreslenie pomocou súboru .

GraphicsDevice Ak existuje RenderTarget2D , môžete ho vygenerovať kdekoľvek, ale v príklade ho vytvoríme metódou LoadContent . Cieľ vykreslenia je skutočná textúra, takže má veľkosť. Konštruktér GraphicsDevice tiež špecifikuje veľkosť spolu s .

Kresliť

Ak použijete cieľ vykresľovania, kód je tu hlavný.

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

Keďže kreslenie sa v podstate GraphicsDevice vykonáva na , aj keď sa proces kreslenia vykonáva tak, ako je, bude nakreslený proti hlavnému oknu. GraphicsDevice.SetRenderTarget Zadaním RenderTarget2D metódy môžete prepnúť cieľ kresby na textúru.

Po prepnutí sa proces kreslenia vykonáva rovnakým spôsobom ako pri kreslení v hlavnom okne. GraphicsDevice.Clear Vymaže informácie o výkrese a nakreslíSpriteBatch sprite. Aby som skontroloval, či skutočne kreslíte proti textúre, zámerne som špecifikoval polohu kresby tak, aby sprit tentoraz vyčnieval.

Po dokončení kreslenia cieľa GraphicsDevice.SetRenderTarget vykresľovania zadajte metódu null . To vám umožní vrátiť cieľ kreslenia do hlavného okna.

RenderTarget2D môže byť použitý ako textúra taká, aká je, takže SpriteBatch.Draw špecifikujem _renderTarget spôsob, ako ju nakresliť ako sprite.

poprava

Po napísaní kódu ho skúste spustiť. Ak to vyzerá ako postava, je to v poriadku.

Farba výplne pre cieľ vykreslenia a farba výplne pre hlavné okno sú oddelené, takže môžete vidieť, kde bola textúra vytvorená ako cieľ vykreslenia. Sprite som nakreslil tak, aby vyčnieval proti terču vykreslenia, ale myslím, že vidíte, že je správne orezaný a nie je nakreslený smerom k hlavnému oknu.

To je všetok kód, ktorý dosahuje cieľ vykresľovania. Nie je nič obzvlášť ťažké. Myslím si, že jediná vec, na ktorej mi záleží, je riadenie prepínania cieľov kreslenia a RenderTarget2D spravovanie.

Skúste ho presunúť

Výsledok predchádzajúceho prevedenia vyzerá, že obrázok je jednoducho orezaný a nakreslený, takže Ďalej by som chcel presunúť spritu, aby som sa uistil, že je správne nakreslený v terči vykreslenia.

Update Keďže chceme rotáciu zakaždým aktualizovať, pripravíme uhol natočenia v teréne.

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

Update V metóde zvýšte _rotate počet .

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 Metóda nastaví sprite na _rotate otáčanie. Potrebujete len vedieť, že sa otáča, takže ostatné hodnoty sú nastavené správne.

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

Keď ho spustíte, mal by kresliť počas otáčania, ako je znázornené na obrázku.