A RenderTarget használata textúraként textúrára rajzolás után

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 10 esetén
  • Windows 11 esetén
Visual Studio
  • Visual Studio 2022
Monojáték
  • 3.8.1

Információk a renderelési célokról

Általában rajzoláskor a rajz tartalma megjelenik a képernyőn, de renderelési céllal textúrára írhatja a rajzot. A textúrába írt tartalom textúráként használható. Ha például a televízió tartalmát egy textúrára írja, majd beilleszti a textúrát a TV képernyőjére, áthelyezhet egy másik képet a televízión. Természetesen állóképként is használható, és dinamikusan létrehozhat textúrát anélkül, hogy előre előkészítené a textúra képfájlját.

Képek előkészítése

A renderelési cél használatához nincs szükség képfájlra, de készítek egy képfájlt, hogy mintaként könnyebben érthető legyen.

Normál tartalomfájlként lesz használva, ezért kérjük, regisztrálja az MGCB-ben. Texture Hagyja meg a nevet .

mező

Game1 Írjuk meg az osztályban. A meglévő kód különösebben nem változik, ezért csak a hozzáadott összeget írom le leírás nélkül.

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

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

_texture A mezők az előkészített képek betöltésére szolgálnak, és nem különösebben relevánsak a tipp tartalma szempontjából.

RenderTarget2D Az osztályban definiált mezők renderelési célokká válnak. Mivel szükséges GraphicsDevice példányosítani , ebben a szakaszban nem hozható létre, így csak meg van határozva.

Game1 konstruktor

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

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

Itt nincs semmi különös. Egyelőre megadtam a játék felbontását, hogy összehasonlítható legyen a renderelési céllal.

Tartalom betöltése

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

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

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

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

Először olvassa el a Texture2D Content.Load használatával történő rajzolást.

GraphicsDevice Ha van RenderTarget2D , akkor bárhol létrehozhatja, de a példában a metódusban LoadContent hozzuk létre. A renderelési cél valódi textúra, ezért van mérete. A GraphicsDevice konstruktor megadja a méretet is a .

Rajzol

Ha renderelési célt használ, az itt található kód a fő.

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

Mivel a rajzolás alapvetően GraphicsDevice , még akkor is, ha a rajzolási folyamatot úgy hajtják végre, ahogy van, a főablakhoz lesz rajzolva. GraphicsDevice.SetRenderTarget Metódus megadásával RenderTarget2D textúrára válthatja a rajzolás célját.

A váltás után a rajzolási folyamat ugyanúgy történik, mint a főablakban történő rajzoláskor. GraphicsDevice.Clear Törli a rajzadatokat, és megrajzoljaSpriteBatch a sprite-ot. Annak ellenőrzése érdekében, hogy valóban a textúrával szemben rajzol-e, szándékosan megadtam a rajz helyzetét, hogy a sprite ezúttal kinyúljon.

Ha befejezte a renderelési céltárgyra történő rajzolást, GraphicsDevice.SetRenderTarget adja meg a null módszert. Ez lehetővé teszi a rajzcél visszaállítását a főablakba.

RenderTarget2D textúrának használható úgy, ahogy van, ezért SpriteBatch.Draw megadom a _renderTarget sprite-ként való rajzolás módját.

kivégzés

Miután megírta a kódot, próbálja meg futtatni. Ha úgy néz ki, mint az ábra, akkor rendben van.

A renderelési cél és a főablak kitöltési színe el van választva, így láthatja, hogy a textúra hol lett létrehozva renderelési célként. A sprite-ot úgy rajzoltam meg, hogy a renderelési célhoz nyúljon, de azt hiszem, láthatja, hogy megfelelően van levágva, és nem a főablak felé húzva.

Ez az összes kód, amely eléri a renderelési célt. Nincs semmi különösebben nehéz. Azt hiszem, az egyetlen dolog, ami érdekel, az a rajzolási célok váltásának kezelése és RenderTarget2D kezelése.

Próbálja meg áthelyezni

Az előző végrehajtás eredménye úgy néz ki, mintha a képet egyszerűen levágnák és rajzolnák, így Ezután szeretném áthelyezni a sprite-ot, hogy megbizonyosodjak arról, hogy megfelelően van-e megrajzolva a renderelési célban.

Update Mivel minden alkalommal frissíteni akarjuk a forgatást, előkészítjük a forgatási szöget a mezőben.

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

Update A módszerben növelje a _rotate számát.

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 A módszer beállítja a sprite forgatását _rotate . Csak azt kell tudnia, hogy forog, így a többi érték megfelelően van beállítva.

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

Futtatáskor forgatás közben rajzolnia kell az ábrán látható módon.