A RenderTarget használata textúraként textúrára rajzolás után
Ellenőrzési környezet
- Windows
-
- Windows 10 esetén
- Windows 11 esetén
- Visual Studio
-
- Visual Studio 2022
- Monojáték
-
- 3.8.1
Információk a renderelési célokról
Általában rajzoláskor a rajz tartalma megjelenik a képernyőn, de renderelési céllal textúrára írhatja a rajzot. A textúrába írt tartalom textúráként használható. Ha például a televízió tartalmát egy textúrára írja, majd beilleszti a textúrát a TV képernyőjére, áthelyezhet egy másik képet a televízión. Természetesen állóképként is használható, és dinamikusan létrehozhat textúrát anélkül, hogy előre előkészítené a textúra képfájlját.
Képek előkészítése
A renderelési cél használatához nincs szükség képfájlra, de készítek egy képfájlt, hogy mintaként könnyebben érthető legyen.
Normál tartalomfájlként lesz használva, ezért kérjük, regisztrálja az MGCB-ben. Texture
Hagyja meg a nevet .
mező
Game1
Írjuk meg az osztályban. A meglévő kód különösebben nem változik, ezért csak a hozzáadott összeget írom le leírás nélkül.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
A mezők az előkészített képek betöltésére szolgálnak, és nem különösebben relevánsak a tipp tartalma szempontjából.
RenderTarget2D
Az osztályban definiált mezők renderelési célokká válnak.
Mivel szükséges GraphicsDevice
példányosítani , ebben a szakaszban nem hozható létre, így csak meg van határozva.
Game1 konstruktor
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Itt nincs semmi különös. Egyelőre megadtam a játék felbontását, hogy összehasonlítható legyen a renderelési céllal.
Tartalom betöltése
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Először olvassa el a Texture2D
Content.Load
használatával történő rajzolást.
GraphicsDevice
Ha van RenderTarget2D
, akkor bárhol létrehozhatja, de a példában a metódusban LoadContent
hozzuk létre.
A renderelési cél valódi textúra, ezért van mérete. A GraphicsDevice
konstruktor megadja a méretet is a .
Rajzol
Ha renderelési célt használ, az itt található kód a fő.
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);
}
Mivel a rajzolás alapvetően GraphicsDevice
, még akkor is, ha a rajzolási folyamatot úgy hajtják végre, ahogy van, a főablakhoz lesz rajzolva.
GraphicsDevice.SetRenderTarget
Metódus megadásával RenderTarget2D
textúrára válthatja a rajzolás célját.
A váltás után a rajzolási folyamat ugyanúgy történik, mint a főablakban történő rajzoláskor.
GraphicsDevice.Clear
Törli a rajzadatokat, és megrajzoljaSpriteBatch
a sprite-ot.
Annak ellenőrzése érdekében, hogy valóban a textúrával szemben rajzol-e, szándékosan megadtam a rajz helyzetét, hogy a sprite ezúttal kinyúljon.
Ha befejezte a renderelési céltárgyra történő rajzolást, GraphicsDevice.SetRenderTarget
adja meg a null
módszert.
Ez lehetővé teszi a rajzcél visszaállítását a főablakba.
RenderTarget2D
textúrának használható úgy, ahogy van, ezért SpriteBatch.Draw
megadom a _renderTarget
sprite-ként való rajzolás módját.
kivégzés
Miután megírta a kódot, próbálja meg futtatni. Ha úgy néz ki, mint az ábra, akkor rendben van.
A renderelési cél és a főablak kitöltési színe el van választva, így láthatja, hogy a textúra hol lett létrehozva renderelési célként. A sprite-ot úgy rajzoltam meg, hogy a renderelési célhoz nyúljon, de azt hiszem, láthatja, hogy megfelelően van levágva, és nem a főablak felé húzva.
Ez az összes kód, amely eléri a renderelési célt. Nincs semmi különösebben nehéz.
Azt hiszem, az egyetlen dolog, ami érdekel, az a rajzolási célok váltásának kezelése és RenderTarget2D
kezelése.
Próbálja meg áthelyezni
Az előző végrehajtás eredménye úgy néz ki, mintha a képet egyszerűen levágnák és rajzolnák, így Ezután szeretném áthelyezni a sprite-ot, hogy megbizonyosodjak arról, hogy megfelelően van-e megrajzolva a renderelési célban.
Update
Mivel minden alkalommal frissíteni akarjuk a forgatást, előkészítjük a forgatási szöget a mezőben.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
A módszerben növelje a _rotate
számát.
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
A módszer beállítja a sprite forgatását _rotate
.
Csak azt kell tudnia, hogy forog, így a többi érték megfelelően van beállítva.
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);
}
Futtatáskor forgatás közben rajzolnia kell az ábrán látható módon.