Utilisation de RenderTarget comme texture après avoir dessiné sur une texture

Page mise à jour :
Date de création de la page :

Environnement de vérification

Windows
  • Fenêtres 10
  • Fenêtres 11
Visual Studio
  • Visual Studio 2022
Monojeu
  • 3.8.1

À propos des cibles de rendu

Normalement, lorsque vous dessinez, le contenu du dessin est affiché à l’écran, mais vous pouvez utiliser une cible de rendu pour écrire le dessin dans une texture. Le contenu écrit dans la texture peut être utilisé comme texture telle quelle. Par exemple, si vous écrivez le contenu du téléviseur dans une texture, puis collez la texture sur l’écran du téléviseur, vous pouvez déplacer une image différente dans le téléviseur. Bien sûr, il peut également être utilisé comme image fixe, et vous pouvez créer une texture dynamiquement sans préparer un fichier image pour la texture à l’avance.

Préparation des images

Vous n’avez pas besoin d’un fichier image pour utiliser la cible de rendu, mais je vais préparer un fichier image pour le rendre plus facile à comprendre en tant qu’exemple.

Il sera utilisé comme un fichier de contenu normal, veuillez donc l’enregistrer dans MGCB. Texture Conservez le nom .

champ

Game1 Écrivons-le dans la classe. Le code existant ne sera pas modifié en particulier, donc je ne décrirai que la quantité ajoutée sans la décrire.

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

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

_texture Les champs servent à charger les images préparées et ne sont pas particulièrement pertinents pour le contenu de cette astuce.

RenderTarget2D Les champs définis dans la classe deviennent des cibles de rendu. Comme il est nécessaire d’instancier GraphicsDevice , il ne peut pas être créé à ce stade, il est donc seulement défini.

Game1, constructeur

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

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

Il n’y a rien de spécial à faire ici. Pour le moment, j’ai spécifié la résolution du jeu afin qu’elle puisse être comparée à la cible de rendu.

LoadContent (en anglais)

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

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

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

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

Tout d’abord, lisez l’utilisation Texture2D Content.Load pour dessiner avec .

GraphicsDevice S’il y a RenderTarget2D , vous pouvez le générer n’importe où, mais dans l’exemple, nous le créerons dans LoadContent la méthode. La cible de rendu est une vraie texture, elle a donc une taille. Le GraphicsDevice constructeur spécifie également la taille avec .

Dessiner

Si vous utilisez une cible de rendu, le code ici est le principal.

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

Étant donné que le dessin est essentiellement GraphicsDevice effectué sur , même si le processus de dessin est exécuté tel quel, il sera dessiné contre la fenêtre principale. GraphicsDevice.SetRenderTarget En spécifiant une méthode, vous pouvez basculer la destination du dessin vers une RenderTarget2D texture.

Après la commutation, le processus de dessin est effectué de la même manière que lors du dessin dans la fenêtre principale. GraphicsDevice.Clear efface les informations de dessin et dessineSpriteBatch le sprite. Afin de vérifier si vous dessinez vraiment contre la texture, j’ai délibérément spécifié la position du dessin pour que le sprite dépasse cette fois.

Lorsque vous avez terminé de dessiner sur la cible de rendu, GraphicsDevice.SetRenderTarget spécifiez la null méthode. Cela vous permet de renvoyer la cible de dessin dans la fenêtre principale.

RenderTarget2D peut être utilisé comme texture tel quel, donc SpriteBatch.Draw je spécifie la _renderTarget méthode pour le dessiner comme un sprite.

exécution

Une fois que vous avez écrit le code, essayez de l’exécuter. Si cela ressemble à la figure, c’est OK.

La couleur de remplissage de la cible de rendu et la couleur de remplissage de la fenêtre principale sont séparées, ce qui vous permet de voir où la texture a été créée en tant que cible de rendu. J’ai dessiné le sprite de manière à ce qu’il dépasse de la cible de rendu, mais je pense que vous pouvez voir qu’il est correctement clipsé et non dessiné vers la fenêtre principale.

C’est tout le code qui atteint la cible de rendu. Il n’y a rien de particulièrement difficile. Je pense que la seule chose qui m’importe, c’est de gérer le changement de destination de dessin et RenderTarget2D de gérer .

Essayez de le déplacer

Le résultat de l’exécution précédente donne l’impression que l’image est simplement recadrée et dessinée, donc Ensuite, je voudrais déplacer le sprite pour m’assurer qu’il est correctement dessiné dans la cible de rendu.

Update Puisque nous voulons mettre à jour la rotation à chaque fois, nous allons préparer l’angle de rotation sur le terrain.

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

Update Dans la méthode, augmentez le _rotate nombre de fichiers .

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 La méthode définit la rotation du sprite _rotate . Vous avez seulement besoin de savoir qu’il est en rotation, de sorte que les autres valeurs sont définies de manière appropriée.

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

Lorsque vous l’exécutez, il doit dessiner en tournant comme indiqué dans la figure.