Використання RenderTarget як текстури після малювання текстурою

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 10
  • вікна 11
Visual Studio
  • Visual Studio 2022
Моногра
  • 3.8.1

Про цілі візуалізації

Зазвичай під час малювання вміст малюнка відображається на екрані, але ви можете використовувати ціль візуалізації, щоб записати малюнок до текстури. Вміст, написане текстурою, можна використовувати як текстуру, як воно є. Наприклад, якщо записати вміст телевізора в текстуру, а потім вставити текстуру на екран телевізора, можна перемістити інше зображення в телевізорі. Звичайно, його також можна використовувати як нерухоме зображення, і ви можете створити текстуру динамічно, не готуючи заздалегідь файл зображення для текстури.

Підготовка зображень

Вам не потрібен файл зображення для використання об'єкта візуалізації, але я підготую файл зображення, щоб його було легше зрозуміти як зразок.

Він буде використовуватися як звичайний файл вмісту, тому, будь ласка, зареєструйте його в MGCB. Texture Залиште ім'я як .

поле

Game1 Давайте напишемо це в класі. Існуючий код особливо змінений не буде, тому буду тільки описувати додану суму без її опису.

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

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

_texture Поля призначені для завантаження підготовлених зображень і не особливо відповідають змісту цієї поради.

RenderTarget2D Поля, визначені в класі, стають цілями візуалізації. Оскільки необхідно GraphicsDevice створити екземпляр , він не може бути створений на цьому етапі, тому він лише визначений.

Конструктор Game1

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

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

Тут робити особливо нічого. Поки що я вказав дозвіл гри, щоб його можна було порівняти з метою рендера.

LoadContent

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

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

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

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

Спочатку прочитайте використання Texture2D Content.Load для малювання з .

GraphicsDevice Якщо є RenderTarget2D , ви можете згенерувати його де завгодно, але в прикладі ми створимо його в LoadContent методі. Ціль візуалізації є справжньою текстурою, тому вона має розмір. Конструктор GraphicsDevice також вказує розмір разом з .

Малювати

Якщо ви використовуєте об'єкт візуалізації, код тут є основним.

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

Оскільки малювання в основному GraphicsDevice виконується на , навіть якщо процес малювання виконується так, як є, він буде намальований проти головного вікна. GraphicsDevice.SetRenderTarget Указавши RenderTarget2D метод, можна змінити ціль креслення на текстуру.

Після перемикання процес малювання виконується так само, як і при малюванні в головному вікні. GraphicsDevice.Clear Очищення відомостей про креслення та малюванняSpriteBatch спрайту. Для того щоб перевірити, чи дійсно ви малюєте проти текстури, я навмисно вказав положення малюнка, щоб спрайт на цей раз виступав.

Коли ви закінчите малювати до об'єкта візуалізації, GraphicsDevice.SetRenderTarget вкажіть null метод. Це дозволяє повернути об'єкт креслення в головне вікно.

RenderTarget2D можна використовувати як текстуру, як вона є, тому SpriteBatch.Draw я вказую метод, _renderTarget щоб намалювати її як спрайт.

виконання

Написавши код, спробуйте запустити його. Якщо це схоже на малюнок, це нормально.

Колір заливки для цілі візуалізації та колір заливки для головного вікна розділяються, щоб ви могли побачити, де текстура була створена як ціль візуалізації. Я намалював спрайт так, щоб він виступав проти цілі візуалізації, але, думаю, ви можете побачити, що він правильно обрізаний, а не намальований до головного вікна.

Ось і весь код, який досягає мети візуалізації. Тут немає нічого особливо складного. Я думаю, що єдине, що мене хвилює, - це управління перемиканням місць малювання та RenderTarget2D управління .

Спробуйте перемістити його

Результат попереднього виконання виглядає так, ніби зображення просто обрізається і намальовується, тому Далі я хотів би перемістити спрайт, щоб переконатися, що він правильно намальований у цілі візуалізації.

Update Так як ми хочемо кожен раз оновлювати поворот, то підготуємо кут повороту в полі.

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

Update У методі збільшують _rotate кількість .

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 Метод встановлює спрайт для _rotate обертання. Потрібно лише знати, що він обертається, тому інші значення встановлюються відповідним чином.

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

Коли ви його запустите, він повинен малювати під час обертання, як показано на малюнку.