Menggunakan RenderTarget sebagai tekstur setelah menggambar pada tekstur

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 10
  • jendela 11
Visual Studio
  • Visual Studio 2022
Permainan Tunggal
  • 3.8.1

Tentang target render

Biasanya, saat Anda menggambar, konten gambar ditampilkan di layar, tetapi Anda dapat menggunakan target render untuk menulis gambar ke tekstur. Isi yang tertulis dalam tekstur dapat digunakan sebagai tekstur apa adanya. Misalnya, jika Anda menulis konten TV ke tekstur dan kemudian menempelkan tekstur ke layar TV, Anda dapat memindahkan gambar yang berbeda di TV. Tentu saja, ini juga dapat digunakan sebagai gambar diam, dan Anda dapat membuat tekstur secara dinamis tanpa menyiapkan file gambar untuk tekstur terlebih dahulu.

Mempersiapkan Gambar

Anda tidak memerlukan file gambar untuk menggunakan target render, tetapi saya akan menyiapkan file gambar agar lebih mudah dipahami sebagai sampel.

Ini akan digunakan sebagai file konten normal, jadi silakan daftarkan di MGCB. Texture Biarkan nama sebagai .

kebun

Game1 Mari kita tulis di kelas. Kode yang ada tidak akan diubah secara khusus, jadi saya hanya akan menjelaskan jumlah tambahan tanpa menjelaskannya.

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

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

_texture Bidang ini untuk memuat gambar yang disiapkan dan tidak terlalu relevan dengan konten tip ini.

RenderTarget2D Bidang yang ditentukan di kelas menjadi target render. Karena itu perlu untuk GraphicsDevice instantiate , itu tidak dapat dibuat pada tahap ini, jadi hanya didefinisikan.

Konstruktor Game1

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

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

Tidak ada yang istimewa untuk dilakukan di sini. Untuk saat ini, saya telah menentukan resolusi game sehingga dapat dibandingkan dengan target render.

Muat Konten

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

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

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

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

Pertama, baca penggunaan Texture2D Content.Load untuk menggambar dengan .

GraphicsDevice Jika ada RenderTarget2D , Anda dapat membuatnya di mana saja, tetapi dalam contoh kami akan membuatnya dalam LoadContent metode. Target render adalah tekstur nyata, sehingga memiliki ukuran. Konstruktor GraphicsDevice juga menentukan ukuran bersama dengan .

Menarik

Jika Anda menggunakan target render, kode di sini adalah yang utama.

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

Karena menggambar pada dasarnya dilakukan pada GraphicsDevice , bahkan jika proses menggambar dilakukan apa adanya, itu akan ditarik ke jendela utama. GraphicsDevice.SetRenderTarget Dengan menentukan RenderTarget2D metode, Anda dapat mengalihkan tujuan gambar ke tekstur.

Setelah beralih, proses menggambar dilakukan dengan cara yang sama seperti saat menggambar di jendela utama. GraphicsDevice.Clear Menghapus informasi gambar dan menggambarSpriteBatch sprite. Untuk memeriksa apakah Anda benar-benar menggambar dengan tekstur, saya sengaja menentukan posisi gambar sehingga sprite menonjol kali ini.

Setelah selesai menggambar ke target GraphicsDevice.SetRenderTarget render, tentukan null metodenya. Ini memungkinkan Anda untuk mengembalikan target gambar ke jendela utama.

RenderTarget2D dapat digunakan sebagai tekstur apa adanya, jadi SpriteBatch.Draw saya menentukan _renderTarget metode untuk menggambarnya sebagai sprite.

eksekusi

Setelah Anda menulis kode, coba jalankan. Jika terlihat seperti sosoknya, tidak apa-apa.

Warna isian untuk target render dan warna isian untuk jendela utama dipisahkan, sehingga Anda dapat melihat di mana tekstur dibuat sebagai target render. Saya menggambar sprite sehingga menonjol terhadap target render, tetapi saya pikir Anda dapat melihat bahwa itu terpotong dengan benar dan tidak ditarik ke arah jendela utama.

Itu semua kode yang mencapai target render. Tidak ada yang sangat sulit. Saya pikir satu-satunya hal yang saya pedulikan adalah mengelola peralihan tujuan menggambar dan RenderTarget2D mengelola .

Coba pindahkan

Hasil eksekusi sebelumnya terlihat seperti gambar hanya dipotong dan digambar, jadi Selanjutnya, saya ingin memindahkan sprite untuk memastikan bahwa itu digambar dengan benar di target render.

Update Karena kami ingin memperbarui rotasi setiap saat, kami akan menyiapkan sudut rotasi di lapangan.

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

Update Dalam metode ini, tingkatkan _rotate jumlah .

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 ini mengatur sprite untuk _rotate berputar. Anda hanya perlu tahu bahwa itu berputar, sehingga nilai-nilai lain ditetapkan dengan tepat.

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

Ketika Anda menjalankannya, itu harus menggambar sambil berputar seperti yang ditunjukkan pada gambar.