"RenderTarget" naudojimas kaip tekstūros po piešimo ant tekstūros

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 10
  • Langai 11
Vizualinė studija
  • "Visual Studio 2022"
Monožaidimas
  • 3.8.1

Apie "Render Targets"

Paprastai, kai piešiate, piešinio turinys rodomas ekrane, tačiau galite naudoti atvaizdavimo tikslą, kad parašytumėte piešinį į tekstūrą. Tekstūroje parašytas turinys gali būti naudojamas kaip tekstūra, kokia ji yra. Pavyzdžiui, jei televizoriaus turinį įrašote į tekstūrą ir įklijuojate tekstūrą į televizoriaus ekraną, televizoriuje galite perkelti kitą vaizdą. Žinoma, jis taip pat gali būti naudojamas kaip nejudantis vaizdas, ir jūs galite dinamiškai sukurti tekstūrą, iš anksto neparuošę tekstūros vaizdo failo.

Vaizdų paruošimas

Jums nereikia vaizdo failo, kad galėtumėte naudoti pateikimo tikslą, bet aš paruošiu vaizdo failą, kad jį būtų lengviau suprasti kaip pavyzdį.

Jis bus naudojamas kaip įprastas turinio failas, todėl užregistruokite jį MGCB. Texture Palikite pavadinimą kaip .

laukas

Game1 Parašykime tai klasėje. Esamas kodas visų pirma nebus pakeistas, todėl aprašysiu tik pridėtą sumą, jos neaprašydamas.

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

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

_texture Laukai skirti paruoštiems vaizdams įkelti ir nėra ypač susiję su šio patarimo turiniu.

RenderTarget2D Klasėje apibrėžti laukai tampa generavimo tikslais. Kadangi būtina GraphicsDevice momentuoti , jis negali būti sukurtas šiame etape, todėl jis yra tik apibrėžtas.

Game1 konstruktorius

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

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

Čia nėra nieko ypatingo. Kol kas nurodžiau žaidimo skiriamąją gebą, kad ją būtų galima palyginti su atvaizdavimo tikslu.

LoadContent

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

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

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

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

Pirmiausia perskaitykite piešimo naudojimą Texture2D Content.Load su .

GraphicsDevice Jei yra RenderTarget2D , galite jį generuoti bet kur, bet pavyzdyje mes jį LoadContent sukursime metode. Atvaizdavimo tikslas yra tikra tekstūra, todėl jis turi dydį. Konstruktorius GraphicsDevice taip pat nurodo dydį kartu su .

Piešti

Jei naudojate atvaizdavimo tikslą, čia esantis kodas yra pagrindinis.

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

Kadangi piešimas iš esmės GraphicsDevice atliekamas , net jei piešimo procesas bus atliekamas taip, kaip yra, jis bus nupieštas prieš pagrindinį langą. GraphicsDevice.SetRenderTarget Nurodę RenderTarget2D metodą, piešimo paskirties vietą galite perjungti į tekstūrą.

Po perjungimo piešimo procesas atliekamas taip pat, kaip piešiant pagrindiniame lange. GraphicsDevice.Clear išvalo piešimo informaciją ir nupiešiaSpriteBatch sprite. Norėdamas patikrinti, ar tikrai piešiate pagal tekstūrą, sąmoningai nurodžiau piešimo padėtį, kad sprite šį kartą išsikištų.

Baigę piešti pagal atvaizdavimo tikslą, GraphicsDevice.SetRenderTarget nurodykite null metodą. Tai leidžia grąžinti piešimo tikslą į pagrindinį langą.

RenderTarget2D gali būti naudojamas kaip tekstūra, kokia ji yra, todėl SpriteBatch.Draw nurodau metodą, _renderTarget kaip jį nupiešti kaip sprite.

Vykdymo

Parašę kodą, pabandykite jį paleisti. Jei tai atrodo kaip paveikslas, tai gerai.

Atvaizdavimo paskirties užpildo spalva ir pagrindinio lango užpildo spalva yra atskirtos, todėl galite matyti, kur tekstūra buvo sukurta kaip atvaizdavimo paskirties vieta. Aš nupiešiau sprite taip, kad jis išsikištų prieš atvaizdavimo taikinį, bet manau, kad matote, kad jis yra tinkamai nukirptas ir nėra traukiamas link pagrindinio lango.

Tai visas kodas, kuris pasiekia atvaizdavimo tikslą. Nėra nieko ypatingo sunkumo. Manau, kad vienintelis dalykas, kuris man rūpi, yra valdyti piešimo paskirties vietų perjungimą ir RenderTarget2D valdymą .

Pabandykite jį perkelti

Ankstesnio vykdymo rezultatas atrodo, kad vaizdas yra tiesiog apkarpytas ir nupieštas, todėl Tada norėčiau perkelti sprite, kad įsitikinčiau, jog jis tinkamai nupieštas atvaizdavimo tiksle.

Update Kadangi norime kiekvieną kartą atnaujinti sukimąsi, paruošime sukimosi kampą lauke.

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

Update Metode padidinkite _rotate skaičių .

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 Metodas nustato sprite _rotate suktis. Jums tereikia žinoti, kad jis sukasi, todėl kitos vertės nustatomos tinkamai.

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

Kai jį paleisite, jis turėtų piešti sukdamasis, kaip parodyta paveikslėlyje.