Ús de RenderTarget com a textura després de dibuixar una textura

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Windows 10
  • Finestres 11
Estudi visual
  • Estudi visual 2022
Monojoc
  • 3.8.1

Sobre els objectius de renderització

Normalment, quan dibuixeu, el contingut del dibuix es mostra a la pantalla, però podeu utilitzar un objectiu de renderització per escriure el dibuix amb una textura. El contingut escrit en la textura es pot utilitzar com a textura tal com és. Per exemple, si escriviu el contingut del televisor amb una textura i després enganxeu la textura a la pantalla del televisor, podeu moure una imatge diferent al televisor. Per descomptat, també es pot utilitzar com a imatge fixa i podeu crear una textura dinàmicament sense preparar un fitxer d'imatge per a la textura amb antelació.

Preparació d'imatges

No necessiteu un fitxer d'imatge per utilitzar l'objectiu render, però prepararé un fitxer d'imatge perquè sigui més fàcil d'entendre com a mostra.

S'utilitzarà com un fitxer de contingut normal, per la qual cosa si us plau, registreu-lo a MGCB. Texture Deixeu el nom com .

camp

Game1 Escrivim-ho a classe. El codi existent no es canviarà en particular, de manera que només descriuré la quantitat afegida sense descriure-la.

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

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

_texture Els camps són per carregar les imatges preparades i no són especialment rellevants per al contingut d'aquest consell.

RenderTarget2D Els camps definits a la classe es converteixen en objectius de renderització. Com que cal instanciar GraphicsDevice , no es pot crear en aquesta etapa, de manera que només es defineix.

Constructor de Game1

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

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

Aquí no hi ha res especial a fer. De moment, he especificat la resolució del joc perquè es pugui comparar amb l'objectiu render.

Carrega el contingut

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

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

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

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

En primer lloc, llegiu l'ús Texture2D Content.Load per dibuixar amb .

GraphicsDevice Si n'hi ha , es pot generar en qualsevol lloc, però en l'exemple RenderTarget2D el crearem en LoadContent el mètode. L'objectiu render és una textura real, per la qual cosa té una mida. El GraphicsDevice constructor també especifica la mida juntament amb .

Dibuixar

Si utilitzeu un objectiu de renderització, el codi aquí és el 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);
}

Com que el dibuix es realitza bàsicament GraphicsDevice sobre , fins i tot si el procés de dibuix es realitza tal qual, es dibuixarà contra la finestra principal. GraphicsDevice.SetRenderTarget Si especifiqueu un RenderTarget2D mètode, podeu canviar la destinació del dibuix a una textura.

Després de canviar, el procés de dibuix es realitza de la mateixa manera que quan es dibuixa a la finestra principal. GraphicsDevice.Clear esborra la informació del dibuix i dibuixaSpriteBatch el personatge. Per comprovar si realment dibuixeu contra la textura, he especificat deliberadament la posició del dibuix perquè l'sprite sobresurti aquesta vegada.

Quan hàgiu acabat de dibuixar a l'objectiu renderitza, GraphicsDevice.SetRenderTarget especifiqueu el mètode null . Això us permet tornar l'objectiu de dibuix a la finestra principal.

RenderTarget2D es pot utilitzar com a textura tal com és, així que SpriteBatch.Draw especifico el _renderTarget mètode per dibuixar-lo com un sprite.

execució

Un cop hàgiu escrit el codi, proveu d'executar-lo. Si s'assembla a la xifra, està bé.

El color de farciment per a l'objectiu render i el color d'ompliment per a la finestra principal estan separats, de manera que podeu veure on es va crear la textura com a objectiu de renderització. He dibuixat l'sprite de manera que sobresurti contra l'objectiu render, però crec que es pot veure que està ben retallat i no dibuixat cap a la finestra principal.

Aquest és tot el codi que aconsegueix l'objectiu render. No hi ha res especialment difícil. Crec que l'únic que m'importa és gestionar el canvi de destinació i RenderTarget2D gestionar .

Proveu de moure'l

El resultat de l'execució anterior sembla que la imatge simplement es retalla i es dibuixa, de manera que A continuació, m'agradaria moure l'sprite per assegurar-me que es dibuixa correctament a l'objectiu render.

Update Com que volem actualitzar la rotació cada vegada, prepararem l'angle de rotació al camp.

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

Update En el mètode, augmenteu el _rotate nombre de .

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 El mètode estableix que l'sprite giri _rotate . Només heu de saber que gira, de manera que els altres valors s'estableixen adequadament.

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

Quan l'executeu, s'ha de dibuixar mentre gira tal com es mostra a la figura.