Uporaba RenderTarget kot tekstura po risbi na teksturi

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 10
  • Windows 11
Vizualni studio
  • Vizualni studio 2022
MonoGame
  • 3.8.1

O ujemanju ciljev

Običajno se pri risanju na zaslonu prikaže vsebina risbe, vendar lahko s ciljnim prikazom zapišete risbo v teksturo. Vsebina, zapisana v teksturo, se lahko uporablja kot tekstura, kot je. Če na primer vsebino televizorja napišete v teksturo in nato prilepite teksturo na zaslon televizorja, lahko v televizorju premaknete drugo sliko. Seveda se lahko uporablja tudi kot še vedno slika, teksturo pa lahko ustvarite dinamično, ne da bi vnaprej pripravljali slikovno datoteko za teksturo.

Priprava slik

Za uporabo cilja renderja ne potrebujete slikovne datoteke, vendar bom pripravil slikovno datoteko, da bo lažje razumeti kot vzorec.

To bo uporabljena kot običajna vsebinska datoteka, zato jo registrirajte v MGCB. Texture Pustite ime kot .

polje

Game1 Napišimo to v razredu. Obstoječa koda se ne bo spremenila zlasti, zato bom dodal samo dodani znesek, ne da bi ga opisal.

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

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

_texture Polja so za nalaganje pripravljenih slik in niso posebej pomembna za vsebino tega namiga.

RenderTarget2D Polja, opredeljena v razredu, postanejo cilji za under. Ker je treba GraphicsDevice instantiate , ga ni mogoče ustvariti v tej fazi, zato je le opredeljen.

Konstruktor igre 1

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

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

Tukaj ni nič posebnega. Za zdaj sem določil resolucijo igre, tako da jo je mogoče primerjati s ciljnim renderjem.

LoadContent

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

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

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

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

Najprej preberite uporabo za Texture2D Content.Load risanje z .

GraphicsDevice Če obstaja RenderTarget2D , ga lahko ustvarite kjerkoli, vendar v primeru bomo ustvarili LoadContent v metodi. Cilj renderja je prava tekstura, zato ima velikost. Konstruktor določi GraphicsDevice tudi velikost skupaj z .

Risati

Če uporabite cilj renderja, je tukaj glavna koda.

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

Ker je GraphicsDevice risba v osnovi izvedena na , tudi če se risba proces izvaja, kot je, bo risana ob glavnem oknu. GraphicsDevice.SetRenderTarget Če določite metodo RenderTarget2D , lahko cilj risbe preklopite na teksturo.

Po preklopu se postopek risbe izvaja na enak način kot pri risanju v glavnem oknu. GraphicsDevice.Clear izprazni informacije o risbi in narišeSpriteBatch sprit. Da bi preverili, ali res rišete proti teksturi, sem načrtno določil položaj risbe, tako da bo šprica tokrat štrlela.

Ko končate risanje na cilj ugasnjenja, navedite GraphicsDevice.SetRenderTarget metodo null . Tako lahko cilj risbe vrnete v glavno okno.

RenderTarget2D se lahko uporablja kot tekstura, kot je, SpriteBatch.Draw _renderTarget tako da sem določiti metodo za risanje kot sprite.

usmrtitev

Ko boste napisali kodo, jo poskusite zaganati. Če je videti kot številka, je v redu.

Barva polnila za cilj ugasnjenja in barva polnila za glavno okno sta ločeni, tako da lahko vidite, kje je bila tekstura ustvarjena kot cilj ugasnjenega. Sprit sem narisal tako, da je štrleč proti render tarči, ampak mislim, da lahko vidite, da je pravilno ošiljan in ne vleče proti glavnemu oknu.

To je vsa koda, ki doseže cilj. Nič ni posebej težko. Mislim, da je edina stvar, ki mi je mar, upravljanje preklapljanje risbe destinacij RenderTarget2D in upravljanje .

Poskusi ga premakni.

Rezultat prejšnje usmrtitve kaže, da je slika preprosto obrezana in narisana, tako da Nato bi rad premaknil sprit, da se prepričam, da je pravilno narisan v ciljni render.

Update Ker želimo vrtenje posodabljati vsakič, bomo v polju pripravili kot vrtenja.

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

Update Pri metodi povečajte _rotate število .

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 določa vrtenje sprita _rotate . Vedeti morate le, da se vrti, zato so druge vrednosti nastavljene ustrezno.

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

Ko ga zaženete, naj nariše med vrtenjem, kot je prikazano na sliki.