Uso de RenderTarget como textura después de dibujar en una textura

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 10
  • Ventanas 11
Visual Studio
  • Visual Studio 2022
Monojuego
  • 3.8.1

Acerca de los destinos de renderizado

Normalmente, al dibujar, el contenido del dibujo se muestra en la pantalla, pero puede utilizar un destino de procesamiento para escribir el dibujo en una textura. El contenido escrito en la textura se puede utilizar como una textura tal cual. Por ejemplo, si escribe el contenido del televisor en una textura y, a continuación, pega la textura en la pantalla del televisor, puede mover una imagen diferente en el televisor. Por supuesto, también se puede usar como una imagen fija, y puede crear una textura dinámicamente sin preparar un archivo de imagen para la textura de antemano.

Preparación de imágenes

No necesita un archivo de imagen para usar el destino de renderizado, pero prepararé un archivo de imagen para que sea más fácil de entender como muestra.

Se utilizará como un archivo de contenido normal, así que regístrelo en MGCB. Texture Deje el nombre como .

campo

Game1 Vamos a escribirlo en la clase. El código existente no se cambiará en particular, por lo que solo describiré la cantidad agregada sin describirla.

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

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

_texture Los campos son para cargar las imágenes preparadas y no son particularmente relevantes para el contenido de este consejo.

RenderTarget2D Los campos definidos en la clase se convierten en destinos de representación. Dado que es necesario GraphicsDevice crear una instancia, no se puede crear en esta etapa, por lo que solo se define.

Constructor de Game1

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

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

No hay nada especial que hacer aquí. Por el momento, he especificado la resolución del juego para que se pueda comparar con el objetivo de renderizado.

LoadContent

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

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

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

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

Primero, lea el uso Texture2D Content.Load para dibujar con .

GraphicsDevice Si lo hay, puedes generarlo en cualquier lugar, pero en el ejemplo lo RenderTarget2D crearemos en LoadContent el método. El objetivo de renderizado es una textura real, por lo que tiene un tamaño. El GraphicsDevice constructor también especifica el tamaño junto con .

Dibujar

Si utiliza un destino de renderizado, el código aquí es 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);
}

Dado que el dibujo se realiza básicamente GraphicsDevice en , incluso si el proceso de dibujo se realiza tal como está, se dibujará contra la ventana principal. GraphicsDevice.SetRenderTarget Al especificar un RenderTarget2D método, puede cambiar el destino del dibujo a una textura.

Después de cambiar, el proceso de dibujo se realiza de la misma manera que cuando se dibuja en la ventana principal. GraphicsDevice.Clear Borra la información del dibujo y dibujaSpriteBatch el sprite. Para verificar si realmente estás dibujando contra la textura, especificé deliberadamente la posición de dibujo para que el sprite sobresalga esta vez.

Cuando haya terminado de dibujar en el destino de representación, GraphicsDevice.SetRenderTarget especifique el null método. Esto le permite devolver el destino de dibujo a la ventana principal.

RenderTarget2D se puede usar como una textura tal como está, así que SpriteBatch.Draw especifico el _renderTarget método para dibujarlo como un sprite.

ejecución

Una vez que haya escrito el código, intente ejecutarlo. Si se parece a la figura, está bien.

El color de relleno para el destino de procesamiento y el color de relleno para la ventana principal están separados, por lo que puede ver dónde se creó la textura como destino de procesamiento. Dibujé el sprite para que sobresalga contra el objetivo de renderizado, pero creo que puedes ver que está correctamente recortado y no dibujado hacia la ventana principal.

Ese es todo el código que logra el objetivo de renderizado. No hay nada particularmente difícil. Creo que lo único que me importa es gestionar el cambio de destino de dibujo y RenderTarget2D administrar .

Intenta moverlo

El resultado de la ejecución anterior parece que la imagen simplemente está recortada y dibujada, por lo que A continuación, me gustaría mover el sprite para asegurarme de que está dibujado correctamente en el destino de renderizado.

Update Como queremos actualizar la rotación cada vez, prepararemos el ángulo de rotación en el campo.

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

Update En el método, aumente el _rotate número 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étodo establece el sprite para que _rotate gire. Solo necesita saber que está girando, por lo que los otros valores se establecen adecuadamente.

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

Cuando lo ejecute, debe dibujarse mientras gira como se muestra en la figura.