Използване на RenderTarget като текстура след рисуване върху текстура

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 10
  • Прозорци 11
Визуално студио
  • Визуално студио 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;
}

Тук няма нищо специално за правене. За момента съм уточнил резолюцията на играта, така че да може да се сравни с целта на рендера.

Зареждане на съдържание

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

Когато го стартирате, той трябва да рисува, докато се върти, както е показано на фигурата.