Utilizzo di RenderTarget come texture dopo aver disegnato su una texture
Ambiente di verifica
- Finestre
-
- Windows 10
- Windows 11
- Visual Studio
-
- Visual Studio 2022
- Monogioco
-
- 3.8.1
Informazioni sulle destinazioni di rendering
In genere, quando si disegna, il contenuto del disegno viene visualizzato sullo schermo, ma è possibile utilizzare una destinazione di rendering per scrivere il disegno in una texture. Il contenuto scritto nella texture può essere utilizzato come texture così com'è. Ad esempio, se si scrive il contenuto del televisore in una trama e quindi si incolla la trama sullo schermo TV, è possibile spostare un'immagine diversa nel televisore. Naturalmente, può anche essere utilizzato come immagine fissa e puoi creare una texture dinamicamente senza preparare in anticipo un file di immagine per la trama.
Preparazione delle immagini
Non è necessario un file di immagine per utilizzare la destinazione di rendering, ma preparerò un file di immagine per renderlo più facile da capire come esempio.
Verrà utilizzato come un normale file di contenuto, quindi si prega di registrarlo in MGCB. Texture
Lasciare il nome come .
campo
Game1
Scriviamolo in classe. Il codice esistente non verrà modificato in particolare, quindi descriverò solo l'importo aggiunto senza descriverlo.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
I campi servono per caricare le immagini preparate e non sono particolarmente rilevanti per il contenuto di questo suggerimento.
RenderTarget2D
I campi definiti nella classe diventano destinazioni di rendering.
Poiché è necessario creare GraphicsDevice
un'istanza , non può essere creato in questa fase, quindi è solo definito.
Costruttore Game1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Non c'è niente di speciale da fare qui. Per il momento, ho specificato la risoluzione del gioco in modo che possa essere confrontata con la destinazione di rendering.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Innanzitutto, leggete l'uso Texture2D
Content.Load
per disegnare con .
GraphicsDevice
Se c'è RenderTarget2D
, puoi generarlo ovunque, ma nell'esempio lo creeremo nel LoadContent
metodo.
La destinazione di rendering è una texture reale, quindi ha una dimensione. Il GraphicsDevice
costruttore specifica inoltre la dimensione insieme a .
Disegnare
Se si utilizza una destinazione di rendering, il codice qui è quello principale.
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);
}
Poiché il disegno viene fondamentalmente GraphicsDevice
eseguito su , anche se il processo di disegno viene eseguito così com'è, verrà disegnato contro la finestra principale.
GraphicsDevice.SetRenderTarget
Specificando un RenderTarget2D
metodo, potete cambiare la destinazione del disegno in una texture.
Dopo il passaggio, il processo di disegno viene eseguito nello stesso modo in cui si disegna nella finestra principale.
GraphicsDevice.Clear
Cancella le informazioni di disegno e disegnaSpriteBatch
lo sprite.
Per verificare se stai davvero disegnando contro la trama, ho deliberatamente specificato la posizione del disegno in modo che lo sprite sporga questa volta.
Al termine del disegno sulla destinazione di rendering, GraphicsDevice.SetRenderTarget
specificate il null
metodo.
In questo modo è possibile riportare la destinazione del disegno nella finestra principale.
RenderTarget2D
può essere usato come texture così com'è, quindi SpriteBatch.Draw
specifico il _renderTarget
metodo per disegnarlo come uno sprite.
esecuzione
Dopo aver scritto il codice, prova a eseguirlo. Se assomiglia alla figura, è OK.
Il colore di riempimento per la destinazione di rendering e il colore di riempimento per la finestra principale sono separati, in modo da poter vedere dove è stata creata la texture come destinazione di rendering. Ho disegnato lo sprite in modo che sporga contro la destinazione di rendering, ma penso che tu possa vedere che è correttamente ritagliato e non disegnato verso la finestra principale.
Questo è tutto il codice che raggiunge la destinazione di rendering. Non c'è nulla di particolarmente difficile.
Penso che l'unica cosa che mi interessa sia gestire il cambio di destinazione del disegno e RenderTarget2D
la gestione di .
Prova a spostarlo
Il risultato dell'esecuzione precedente sembra che l'immagine sia semplicemente ritagliata e disegnata, quindi Successivamente, vorrei spostare lo sprite per assicurarmi che sia disegnato correttamente nella destinazione di rendering.
Update
Poiché vogliamo aggiornare la rotazione ogni volta, prepareremo l'angolo di rotazione nel campo.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Nel metodo, aumentare il _rotate
numero di .
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
Il metodo imposta lo sprite in modo che _rotate
ruoti.
Devi solo sapere che sta ruotando, quindi gli altri valori sono impostati in modo appropriato.
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);
}
Quando lo eseguite, dovrebbe essere disegnato durante la rotazione, come mostrato nella figura.