RenderTargetin käyttäminen pintakuviona tekstuuriin piirtämisen jälkeen

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 10
  • Windows 11
Visuaalinen studio
  • Visuaalinen studio 2022
Monopeli
  • 3.8.1

Tietoja kohteiden hahmontamisesta

Normaalisti, kun piirrät, piirustuksen sisältö näkyy näytöllä, mutta voit käyttää renderöintikohdetta piirtääksesi piirustuksen tekstuuriin. Tekstuuriin kirjoitettua sisältöä voidaan käyttää tekstuurina sellaisenaan. Jos esimerkiksi kirjoitat television sisällön tekstuuriin ja liität sitten tekstuurin TV-ruutuun, voit siirtää toisen kuvan televisiossa. Tietenkin sitä voidaan käyttää myös still-kuvana, ja voit luoda tekstuurin dynaamisesti valmistelematta tekstuurille kuvatiedostoa etukäteen.

Kuvien valmistelu

Renderöintikohteen käyttämiseen ei tarvita kuvatiedostoa, mutta valmistelen kuvatiedoston, jotta se olisi helpompi ymmärtää näytteenä.

Sitä käytetään normaalina sisältötiedostona, joten rekisteröi se MGCB: hen. Texture Jätä nimeksi .

pelto

Game1 Kirjoitetaan se luokassa. Nykyistä koodia ei muuteta erityisesti, joten kuvailen vain lisätyn määrän kuvaamatta sitä.

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

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

_texture Kentät on tarkoitettu valmisteltujen kuvien lataamiseen, eivätkä ne ole erityisen merkityksellisiä tämän vihjeen sisällön kannalta.

RenderTarget2D Luokassa määritetyistä kentistä tulee hahmonnuskohteita. Koska se on välttämätöntä ilmentyä GraphicsDevice , sitä ei voida luoda tässä vaiheessa, joten se on vain määritelty.

Game1-konstruktori

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

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

Tässä ei ole mitään erityistä tekemistä. Toistaiseksi olen määrittänyt pelin resoluution, jotta sitä voidaan verrata renderöintikohteeseen.

Lataa sisältö

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

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

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

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

Lue ensin käyttö Texture2D Content.Load piirtämiseen .

GraphicsDevice Jos on RenderTarget2D , voit luoda sen missä tahansa, mutta esimerkissä luomme sen menetelmässä LoadContent . Renderöintikohde on todellinen pintakuvio, joten sillä on koko. Konstruktori GraphicsDevice määrittää myös koon yhdessä .

Piirtää

Jos käytät hahmonnuskohdetta, tässä oleva koodi on tärkein.

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

Koska piirustus suoritetaan periaatteessa GraphicsDevice , vaikka piirustusprosessi suoritettaisiin sellaisenaan, se piirretään pääikkunaa vasten. GraphicsDevice.SetRenderTarget Määrittämällä RenderTarget2D menetelmän voit vaihtaa piirustuksen kohteen pintakuvioksi.

Vaihtamisen jälkeen piirustusprosessi suoritetaan samalla tavalla kuin pääikkunassa piirrettäessä. GraphicsDevice.Clear tyhjentää piirustustiedot ja piirtääSpriteBatch spriten. Tarkistaakseni, piirrätkö todella tekstuuria vasten, määrittelin tarkoituksella piirustuspaikan niin, että sprite työntyy tällä kertaa esiin.

Kun olet piirtänyt hahmonnuskohteeseen, GraphicsDevice.SetRenderTarget määritä null menetelmä. Tämän avulla voit palauttaa piirustuskohteen pääikkunaan.

RenderTarget2D voidaan käyttää tekstuurina sellaisenaan, joten SpriteBatch.Draw määritän _renderTarget menetelmän piirtää se sprite.

teloitus

Kun olet kirjoittanut koodin, yritä suorittaa se. Jos se näyttää luvulta, se on OK.

Hahmonnuskohteen täyttöväri ja pääikkunan täyttöväri erotetaan toisistaan, joten näet, missä pintakuvio luotiin hahmonnuksen kohteena. Piirsin spriten niin, että se työntyy renderöintikohdetta vasten, mutta mielestäni näet, että se on leikattu oikein eikä piirretty pääikkunaa kohti.

Se on kaikki koodi, joka saavuttaa renderöintitavoitteen. Mikään ei ole erityisen vaikeaa. Luulen, että ainoa asia, josta välitän, on piirustuskohteiden vaihtamisen hallinta ja hallinta RenderTarget2D .

Kokeile siirtää sitä

Edellisen suorituksen tulos näyttää siltä, että kuva on yksinkertaisesti rajattu ja piirretty, joten Seuraavaksi haluaisin siirtää spritea varmistaakseni, että se on piirretty oikein renderöintikohteeseen.

Update Koska haluamme päivittää kierron joka kerta, valmistelemme pyörimiskulman kentällä.

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

Update Lisää _rotate menetelmässä .

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 Menetelmä asettaa spriten pyörimään _rotate . Sinun tarvitsee vain tietää, että se pyörii, joten muut arvot asetetaan asianmukaisesti.

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

Kun suoritat sen, sen pitäisi piirtää pyörimisen aikana kuvan osoittamalla tavalla.