Menggunakan RenderTarget sebagai tekstur setelah menggambar pada tekstur
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.