Použitie RenderTarget ako textúry po nakreslení textúry
Prostredie overovania
- Windows
-
- Windows 10
- Windows 11
- Vizuálne štúdio
-
- Visual Studio 2022
- MonoGame
-
- 3.8.1
Informácie o cieľoch vykresľovania
Za normálnych okolností sa pri kreslení obsah kresby zobrazí na obrazovke, ale na zápis kresby do textúry môžete použiť cieľ vykreslenia. Obsah napísaný v textúre môže byť použitý ako textúra taká, aká je. Ak napríklad zapíšete obsah televízora na textúru a potom textúru prilepíte na obrazovku televízora, môžete v televízore presunúť iný obrázok. Samozrejme, dá sa použiť aj ako statický obrázok a textúru môžete vytvoriť dynamicky bez toho, aby ste vopred pripravili obrazový súbor pre textúru.
Príprava obrázkov
Na použitie cieľa vykreslenia nepotrebujete obrazový súbor, ale pripravím obrazový súbor, aby bol ľahšie pochopiteľný ako vzorka.
Bude použitý ako normálny obsahový súbor, preto ho zaregistrujte v MGCB. Texture
Názov ponechajte ako .
pole
Game1
Napíšte to v triede. Existujúci kód sa konkrétne nezmení, takže pridanú sumu iba popíšem bez toho, aby som ju popisoval.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Polia slúžia na načítanie pripravených obrázkov a nie sú zvlášť relevantné pre obsah tohto tipu.
RenderTarget2D
Polia definované v triede sa stanú cieľmi vykreslenia.
Keďže je potrebné inštancovať GraphicsDevice
, v tejto fáze ho nemožno vytvoriť, takže je definovaný.
Konštruktér hry 1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Nie je tu nič zvláštne. Zatiaľ som špecifikoval rozlíšenie hry tak, aby sa dalo porovnať s cieľom vykreslenia.
Načítať obsah
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Najprv si prečítajte použitie Texture2D
Content.Load
na kreslenie pomocou súboru .
GraphicsDevice
Ak existuje RenderTarget2D
, môžete ho vygenerovať kdekoľvek, ale v príklade ho vytvoríme metódou LoadContent
.
Cieľ vykreslenia je skutočná textúra, takže má veľkosť. Konštruktér GraphicsDevice
tiež špecifikuje veľkosť spolu s .
Kresliť
Ak použijete cieľ vykresľovania, kód je tu hlavný.
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);
}
Keďže kreslenie sa v podstate GraphicsDevice
vykonáva na , aj keď sa proces kreslenia vykonáva tak, ako je, bude nakreslený proti hlavnému oknu.
GraphicsDevice.SetRenderTarget
Zadaním RenderTarget2D
metódy môžete prepnúť cieľ kresby na textúru.
Po prepnutí sa proces kreslenia vykonáva rovnakým spôsobom ako pri kreslení v hlavnom okne.
GraphicsDevice.Clear
Vymaže informácie o výkrese a nakreslíSpriteBatch
sprite.
Aby som skontroloval, či skutočne kreslíte proti textúre, zámerne som špecifikoval polohu kresby tak, aby sprit tentoraz vyčnieval.
Po dokončení kreslenia cieľa GraphicsDevice.SetRenderTarget
vykresľovania zadajte metódu null
.
To vám umožní vrátiť cieľ kreslenia do hlavného okna.
RenderTarget2D
môže byť použitý ako textúra taká, aká je, takže SpriteBatch.Draw
špecifikujem _renderTarget
spôsob, ako ju nakresliť ako sprite.
poprava
Po napísaní kódu ho skúste spustiť. Ak to vyzerá ako postava, je to v poriadku.
Farba výplne pre cieľ vykreslenia a farba výplne pre hlavné okno sú oddelené, takže môžete vidieť, kde bola textúra vytvorená ako cieľ vykreslenia. Sprite som nakreslil tak, aby vyčnieval proti terču vykreslenia, ale myslím, že vidíte, že je správne orezaný a nie je nakreslený smerom k hlavnému oknu.
To je všetok kód, ktorý dosahuje cieľ vykresľovania. Nie je nič obzvlášť ťažké.
Myslím si, že jediná vec, na ktorej mi záleží, je riadenie prepínania cieľov kreslenia a RenderTarget2D
spravovanie.
Skúste ho presunúť
Výsledok predchádzajúceho prevedenia vyzerá, že obrázok je jednoducho orezaný a nakreslený, takže Ďalej by som chcel presunúť spritu, aby som sa uistil, že je správne nakreslený v terči vykreslenia.
Update
Keďže chceme rotáciu zakaždým aktualizovať, pripravíme uhol natočenia v teréne.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
V metóde zvýšte _rotate
počet .
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
Metóda nastaví sprite na _rotate
otáčanie.
Potrebujete len vedieť, že sa otáča, takže ostatné hodnoty sú nastavené správne.
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);
}
Keď ho spustíte, mal by kresliť počas otáčania, ako je znázornené na obrázku.