RenderTarget izmantošana kā tekstūra pēc zīmēšanas uz tekstūras

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 10
  • Operētājsistēmā Windows 11
Visual Studio
  • Visual Studio 2022
MonoGame
  • 3.8.1

Par mērķu atveidošanu

Parasti, zīmējot, zīmēšanas saturs tiek parādīts ekrānā, bet jūs varat izmantot atveidojuma mērķi, lai zīmējumu rakstītu uz faktūru. Tekstūrā rakstīto saturu var izmantot kā tekstūru, kāda tā ir. Piemēram, ja rakstāt televizora saturu uz tekstūras un pēc tam ielīmējat tekstūru televizora ekrānā, televizorā varat pārvietot citu attēlu. Protams, to var izmantot arī kā nekustīgu attēlu, un jūs varat dinamiski izveidot tekstūru, iepriekš nesagatavojot tekstūras attēla failu.

Attēlu sagatavošana

Lai izmantotu renderēšanas mērķi, attēla fails nav nepieciešams, bet es sagatavošu attēla failu, lai to būtu vieglāk saprast kā paraugu.

Tas tiks izmantots kā parasts satura fails, tāpēc, lūdzu, reģistrējiet to MGCB. Texture Atstājiet vārdu kā .

lauks

Game1 Rakstīsim to klasē. Esošais kods netiks mainīts, tāpēc es aprakstīšu tikai pievienoto summu, to neaprakstot.

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

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

_texture Lauki ir paredzēti sagatavoto attēlu ielādei un nav īpaši atbilstoši šī padoma saturam.

RenderTarget2D Klasē definētie lauki kļūst par atveidošanas mērķiem. Tā kā ir nepieciešams GraphicsDevice uzreiz , to nevar izveidot šajā posmā, tāpēc tas ir tikai definēts.

Game1 konstruktors

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

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

Šeit nav nekā īpaša, ko darīt. Pagaidām esmu norādījis spēles izšķirtspēju, lai to varētu salīdzināt ar renderēšanas mērķi.

Ielādēt saturu

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

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

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

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

Vispirms izlasiet zīmēšanas lietojumu Texture2D Content.Load ar .

GraphicsDevice Ja ir RenderTarget2D , jūs varat to ģenerēt jebkur, bet piemērā mēs to LoadContent izveidosim metodē. Renderēšanas mērķis ir īsta tekstūra, tāpēc tam ir izmērs. Konstruktors GraphicsDevice arī norāda izmēru kopā ar .

Zīmēt

Ja izmantojat renderēšanas mērķi, šeit redzamais kods ir galvenais.

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

Tā kā zīmēšana pamatā GraphicsDevice tiek veikta , pat ja zīmēšanas process tiek veikts tāds, kāds tas ir, tas tiks uzzīmēts pret galveno logu. GraphicsDevice.SetRenderTarget Norādot RenderTarget2D metodi, varat pārslēgt zīmēšanas galamērķi uz faktūru.

Pēc pārslēgšanas zīmēšanas process tiek veikts tāpat kā zīmējot galvenajā logā. GraphicsDevice.Clear Notīra zīmējuma informāciju un uzzīmēSpriteBatch sprite. Lai pārbaudītu, vai jūs tiešām zīmējat pret tekstūru, es apzināti norādīju zīmēšanas pozīciju, lai sprite šoreiz izvirzītos.

Kad esat pabeidzis zīmēšanu uz atveidošanas mērķi, GraphicsDevice.SetRenderTarget norādiet metodi null . Tas ļauj atgriezt zīmēšanas mērķi galvenajā logā.

RenderTarget2D var izmantot kā tekstūru, kā tas ir, tāpēc SpriteBatch.Draw es precizēju metodi, _renderTarget kā to izdarīt kā sprite.

Izpildes

Kad esat uzrakstījis kodu, mēģiniet to palaist. Ja tas izskatās kā skaitlis, tas ir OK.

Atveidojuma mērķa aizpildījuma krāsa un galvenā loga aizpildījuma krāsa ir atdalītas, lai jūs varētu redzēt, kur faktūra tika izveidota kā atveidojuma mērķis. Es uzzīmēju sprite tā, lai tas izvirzītos pret renderēšanas mērķi, bet es domāju, ka jūs varat redzēt, ka tas ir pareizi izgriezts un nav vilkts uz galveno logu.

Tas ir viss kods, kas sasniedz renderēšanas mērķi. Nav nekas īpaši grūts. Es domāju, ka vienīgais, kas man rūp, ir pārvaldīt zīmēšanas galamērķu maiņu un RenderTarget2D pārvaldīt .

Mēģiniet to pārvietot

Iepriekšējās izpildes rezultāts izskatās, ka attēls ir vienkārši apgriezts un uzzīmēts, tāpēc Tālāk es gribētu pārvietot sprite, lai pārliecinātos, ka tas ir pareizi uzzīmēts renderēšanas mērķī.

Update Tā kā mēs vēlamies katru reizi atjaunināt rotāciju, mēs sagatavosim rotācijas leņķi laukā.

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

Update Metodē palieliniet _rotate .

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 Metode nosaka, ka sprite griežas _rotate . Jums tikai jāzina, ka tas rotē, tāpēc pārējās vērtības ir iestatītas atbilstoši.

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

Palaižot to, tam vajadzētu zīmēt, pagriežot, kā parādīts attēlā.