Verwenden von RenderTarget als Textur nach dem Zeichnen einer Textur
Verifizierungsumgebung
- Fenster
-
- Windows 10
- Windows 11
- Visual Studio
-
- Visual Studio 2022
- MonoSpiel
-
- 3.8.1
Informationen zu Renderzielen
Normalerweise wird beim Zeichnen der Zeichnungsinhalt auf dem Bildschirm angezeigt, aber Sie können ein Renderziel verwenden, um die Zeichnung in eine Textur zu schreiben. Der in der Textur geschriebene Inhalt kann unverändert als Textur verwendet werden. Wenn Sie z. B. den Inhalt des Fernsehgeräts in eine Textur schreiben und die Textur dann auf dem Fernsehbildschirm einfügen, können Sie ein anderes Bild auf dem Fernsehgerät verschieben. Natürlich kann es auch als Standbild verwendet werden, und Sie können eine Textur dynamisch erstellen, ohne im Voraus eine Bilddatei für die Textur vorzubereiten.
Vorbereiten von Bildern
Sie benötigen keine Bilddatei, um das Renderziel zu verwenden, aber ich bereite eine Bilddatei vor, um sie als Beispiel leichter verständlich zu machen.
Es wird als normale Inhaltsdatei verwendet, also registrieren Sie es bitte in MGCB. Texture
Behalten Sie den Namen als .
Feld
Game1
Lasst es uns in der Klasse schreiben. Der bestehende Code wird nicht insbesondere geändert, daher werde ich nur den hinzugefügten Betrag beschreiben, ohne ihn zu beschreiben.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Die Felder dienen zum Laden der vorbereiteten Bilder und sind für den Inhalt dieses Tipps nicht besonders relevant.
RenderTarget2D
Felder, die in der Klasse definiert sind, werden zu Renderzielen.
Da es notwendig ist, GraphicsDevice
zu instanziieren , kann es zu diesem Zeitpunkt nicht erstellt werden, daher ist es nur definiert.
Game1-Konstruktor
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Hier gibt es nichts Besonderes zu tun. Vorerst habe ich die Auflösung des Spiels angegeben, damit sie mit dem Renderziel verglichen werden kann.
LoadContent (Inhalt laden)
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Lesen Sie zunächst die Verwendung Texture2D
Content.Load
zum Zeichnen mit .
GraphicsDevice
Wenn ja RenderTarget2D
, können Sie es überall generieren, aber im Beispiel werden wir es in LoadContent
der Methode erstellen.
Das Renderziel ist eine echte Textur, hat also eine Größe. Der GraphicsDevice
Konstruktor gibt auch die Größe zusammen mit an.
Zeichnen
Wenn Sie ein Renderziel verwenden, ist der Code hier der Hauptcode.
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);
}
Da das Zeichnen grundsätzlich GraphicsDevice
auf ausgeführt wird, wird es auch dann gegen das Hauptfenster gezeichnet, auch wenn der Zeichenvorgang so ausgeführt wird, wie er ist.
GraphicsDevice.SetRenderTarget
Durch Angeben einer RenderTarget2D
Methode können Sie das Zeichnungsziel in eine Textur umwandeln.
Nach dem Umschalten wird der Zeichenvorgang auf die gleiche Weise durchgeführt wie beim Zeichnen im Hauptfenster.
GraphicsDevice.Clear
Löscht die Zeichnungsinformationen und zeichnetSpriteBatch
das Sprite.
Um zu überprüfen, ob du wirklich gegen die Textur zeichnest, habe ich die Zeichenposition bewusst so angegeben, dass das Sprite diesmal übersteht.
Wenn Sie mit dem Zeichnen des Renderziels fertig sind, GraphicsDevice.SetRenderTarget
geben Sie die null
Methode an.
Auf diese Weise können Sie das Zeichnungsziel in das Hauptfenster zurückgeben.
RenderTarget2D
kann als Textur verwendet werden, so wie es ist, also SpriteBatch.Draw
gebe ich die _renderTarget
Methode an, um es als Sprite zu zeichnen.
Ausführung
Nachdem Sie den Code geschrieben haben, versuchen Sie, ihn auszuführen. Wenn es so aussieht wie die Abbildung, ist es in Ordnung.
Die Füllfarbe für das Renderziel und die Füllfarbe für das Hauptfenster sind getrennt, sodass Sie sehen können, wo die Textur als Renderziel erstellt wurde. Ich habe das Sprite so gezeichnet, dass es aus dem Renderziel herausragt, aber ich denke, Sie können sehen, dass es richtig abgeschnitten und nicht in Richtung des Hauptfensters gezeichnet ist.
Das ist der gesamte Code, mit dem das Renderziel erreicht wird. Es gibt nichts besonders Schwieriges.
Ich denke, das einzige, worum ich mich kümmere, ist das Verwalten des Umschaltens von Zeichnungszielen und RenderTarget2D
das Verwalten von .
Versuchen Sie, es zu verschieben
Das Ergebnis der vorherigen Ausführung sieht so aus, als ob das Bild einfach zugeschnitten und gezeichnet wird, also Als Nächstes möchte ich das Sprite verschieben, um sicherzustellen, dass es im Renderziel richtig gezeichnet wird.
Update
Da wir die Rotation jedes Mal aktualisieren möchten, bereiten wir den Rotationswinkel im Feld vor.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Erhöhen Sie in der Methode die _rotate
Anzahl von .
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
Die Methode legt fest, dass _rotate
das Sprite gedreht wird.
Sie müssen nur wissen, dass es sich dreht, damit die anderen Werte entsprechend eingestellt werden.
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);
}
Wenn Sie es ausführen, sollte es beim Drehen wie in der Abbildung gezeigt gezeichnet werden.