Brug af RenderTarget som tekstur efter tegning af en tekstur

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 10
  • Windows 11
Visual Studio
  • Visual Studio 2022
Monospil
  • 3.8.1

Om gengivelsesmål

Når du tegner, vises tegneindholdet normalt på skærmen, men du kan bruge et gengivelsesmål til at skrive tegningen til en struktur. Indholdet skrevet i tekstur kan bruges som en tekstur, som den er. Hvis du f.eks. skriver indholdet af tv'et til en tekstur og derefter indsætter teksturen på tv-skærmen, kan du flytte et andet billede i tv'et. Selvfølgelig kan den også bruges som et stillbillede, og du kan oprette en tekstur dynamisk uden at forberede en billedfil til tekstur på forhånd.

Forberedelse af billeder

Du behøver ikke en billedfil for at bruge gengivelsesmålet, men jeg forbereder en billedfil for at gøre den lettere at forstå som et eksempel.

Det vil blive brugt som en normal indholdsfil, så registrer den venligst i MGCB. Texture Lad navnet være .

mark

Game1 Lad os skrive det i klassen. Den eksisterende kode vil ikke blive ændret specielt, så jeg vil kun beskrive det tilføjede beløb uden at beskrive det.

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

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

_texture Felterne er til indlæsning af de forberedte billeder og er ikke særlig relevante for indholdet af dette tip.

RenderTarget2D Felter, der er defineret i klassen, bliver gengivelsesmål. Da det er nødvendigt at GraphicsDevice instantiere , det kan ikke oprettes på dette stadium, så det er kun defineret.

Spil1 konstruktør

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

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

Der er ikke noget særligt at gøre her. Indtil videre har jeg specificeret opløsningen af spillet, så det kan sammenlignes med gengivelsesmålet.

Indlæs indhold

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

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

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

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

Læs først brugen Texture2D Content.Load til tegning med .

GraphicsDevice Hvis der er RenderTarget2D , kan du generere det hvor som helst, men i eksemplet opretter vi det i LoadContent metoden. Gengivelsesmålet er en ægte tekstur, så det har en størrelse. Konstruktøren GraphicsDevice angiver også størrelsen sammen med .

Tegne

Hvis du bruger et gengivelsesmål, er koden her den vigtigste.

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

Da tegning grundlæggende GraphicsDevice udføres på , selvom tegningsprocessen udføres som den er, tegnes den mod hovedvinduet. GraphicsDevice.SetRenderTarget Ved at angive en metode kan du skifte tegningsdestinationen til en RenderTarget2D tekstur.

Efter skift udføres tegningsprocessen på samme måde som ved tegning i hovedvinduet. GraphicsDevice.Clear rydder tegningsoplysningerne og tegnerSpriteBatch spriten. For at kontrollere, om du virkelig tegner mod teksturen, specificerede jeg bevidst tegnepositionen, så spriten stikker ud denne gang.

Når du er færdig med at tegne til gengivelsesmåletnull, GraphicsDevice.SetRenderTarget skal du angive metoden. Dette giver dig mulighed for at returnere tegningsmålet til hovedvinduet.

RenderTarget2D kan bruges som en tekstur som den er, så SpriteBatch.Draw jeg specificerer metoden til at tegne den _renderTarget som en sprite.

henrettelse

Når du har skrevet koden, kan du prøve at køre den. Hvis det ligner figuren, er det OK.

Fyldfarven for gengivelsesmålet og fyldfarven for hovedvinduet er adskilt, så du kan se, hvor teksturen blev oprettet som gengivelsesmål. Jeg tegnede spritten, så den stikker ud mod gengivelsesmålet, men jeg tror, du kan se, at den er korrekt klippet og ikke trukket mod hovedvinduet.

Det er al den kode, der opnår gengivelsesmålet. Der er ikke noget særligt vanskeligt. Jeg tror, at det eneste, jeg bekymrer mig om, er at styre skiftet af tegningsdestinationer og RenderTarget2D administrere .

Prøv at flytte den

Resultatet af den foregående udførelse ser ud som om billedet simpelthen er beskåret og tegnet, så Dernæst vil jeg gerne flytte spritten for at sikre, at den er korrekt tegnet i gengivelsesmålet.

Update Da vi ønsker at opdatere rotationen hver gang, forbereder vi rotationsvinklen i marken.

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

Update I metoden øges _rotate antallet af .

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 Metoden indstiller spritten til at _rotate rotere. Du behøver kun at vide, at den roterer, så de andre værdier indstilles korrekt.

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

Når du kører det, skal det tegne, mens du roterer som vist på figuren.