RenderTargeti kasutamine tekstuurina pärast tekstuurile joonistamist

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 10
  • Windows 11
Visuaalne stuudio
  • Visual Studio 2022
Monomäng
  • 3.8.1

Teave sihtmärkide renderdamise kohta

Tavaliselt kuvatakse joonistamisel joonise sisu ekraanil, kuid saate joonise tekstuurile kirjutamiseks kasutada renderdussihtmärki. Tekstuuriga kirjutatud sisu saab kasutada tekstuurina sellisena, nagu see on. Näiteks kui kirjutate teleri sisu tekstuurile ja kleebite seejärel tekstuuri teleriekraanile, saate teleris teisaldada teise pildi. Loomulikult saab seda kasutada ka vaikse pildina ja saate luua tekstuuri dünaamiliselt, ilma et peaksite tekstuuri jaoks pildifaili ette valmistama.

Piltide ettevalmistamine

Renderdussihtmärgi kasutamiseks pole vaja pildifaili, kuid valmistan ette pildifaili, et seda oleks näidisena lihtsam mõista.

Seda kasutatakse tavalise sisufailina, nii et palun registreerige see MGCB-s. Texture Jätke nimi nimeks .

põld

Game1 Kirjutame selle klassis. Olemasolevat koodi eriti ei muudeta, seega kirjeldan ainult lisatud summat ilma seda kirjeldamata.

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

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

_texture Väljad on ettevalmistatud piltide laadimiseks ja ei ole selle näpunäite sisu suhtes eriti asjakohased.

RenderTarget2D Klassis määratletud väljad muutuvad renderdamise sihtmärkideks. Kuna on vaja GraphicsDevice koheselt , ei saa seda selles etapis luua, seega on see ainult määratletud.

Game1 konstruktor

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

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

Siin pole midagi erilist teha. Praegu olen täpsustanud mängu eraldusvõimet, et seda saaks võrrelda renderdamise sihtmärgiga.

LoadContent

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

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

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

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

Kõigepealt lugege kasutamist Texture2D Content.Load joonistamiseks koos .

GraphicsDevice Kui on RenderTarget2D , saate selle genereerida kõikjal, kuid näites loome selle meetodis LoadContent . Renderdussihtmärk on tõeline tekstuur, seega on sellel suurus. Konstruktor GraphicsDevice määrab ka suuruse koos .

Viik

Kui kasutate renderdussihtmärki, on siinne kood peamine.

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

Kuna joonistamine toimub põhimõtteliselt GraphicsDevice , isegi kui joonistamisprotsess viiakse läbi nii, nagu see on, joonistatakse see vastu peaakent. GraphicsDevice.SetRenderTarget Meetodi määramisega RenderTarget2D saate joonistuse sihtkoha tekstuuriks muuta.

Pärast lülitamist viiakse joonistusprotsess läbi samamoodi nagu peaaknas joonistamisel. GraphicsDevice.Clear Puhastab joonistusteabe ja joonistabSpriteBatch spraidi. Selleks, et kontrollida, kas te tõesti joonistate tekstuuri vastu, täpsustasin teadlikult joonistusasendit nii, et sprait ulatub seekord välja.

Kui olete renderdamise sihtmärgini joonistamise lõpetanud, GraphicsDevice.SetRenderTarget määrake null meetod. See võimaldab teil joonise sihtmärgi peaaknasse tagasi saata.

RenderTarget2D saab kasutada tekstuurina sellisena, nagu see on, seega SpriteBatch.Draw täpsustan _renderTarget meetodi selle joonistamiseks spraidina.

Täitmise

Kui olete koodi kirjutanud, proovige seda käivitada. Kui see näeb välja nagu joonis, on see OK.

Renderdussihtmärgi täitevärv ja peaakna täitevärv on eraldatud, nii et näete, kus tekstuur renderdamise sihtmärgina loodi. Joonistasin spraidi nii, et see ulatuks vastu renderdamise sihtmärki, kuid arvan, et näete, et see on korralikult kärbitud ja seda ei tõmmata peaakna poole.

See on kõik kood, mis saavutab renderduseesmärgi. Miski pole eriti raske. Ma arvan, et ainus asi, millest ma hoolin, on joonistamise sihtkohtade vahetamise haldamine ja RenderTarget2D haldamine .

Proovige seda teisaldada

Eelmise täitmise tulemus näeb välja nii, et pilt on lihtsalt kärbitud ja joonistatud, nii et Järgmisena tahaksin spraiti liigutada, et veenduda, et see on renderdamise sihtmärgis õigesti joonistatud.

Update Kuna tahame pöörlemist iga kord värskendada, valmistame põllul ette pöördenurga.

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

Update Meetodis suurendage _rotate arvu .

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 Meetod seab spraidi pöörlema _rotate . Teil on vaja ainult teada, et see pöörleb, nii et teised väärtused on sobivalt seatud.

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

Selle käivitamisel peaks see joonistama pööramise ajal, nagu joonisel näidatud.