RenderTargetin käyttäminen pintakuviona tekstuuriin piirtämisen jälkeen
Varmennusympäristö
- Windows
-
- Windows 10
- Windows 11
- Visuaalinen studio
-
- Visuaalinen studio 2022
- Monopeli
-
- 3.8.1
Tietoja kohteiden hahmontamisesta
Normaalisti, kun piirrät, piirustuksen sisältö näkyy näytöllä, mutta voit käyttää renderöintikohdetta piirtääksesi piirustuksen tekstuuriin. Tekstuuriin kirjoitettua sisältöä voidaan käyttää tekstuurina sellaisenaan. Jos esimerkiksi kirjoitat television sisällön tekstuuriin ja liität sitten tekstuurin TV-ruutuun, voit siirtää toisen kuvan televisiossa. Tietenkin sitä voidaan käyttää myös still-kuvana, ja voit luoda tekstuurin dynaamisesti valmistelematta tekstuurille kuvatiedostoa etukäteen.
Kuvien valmistelu
Renderöintikohteen käyttämiseen ei tarvita kuvatiedostoa, mutta valmistelen kuvatiedoston, jotta se olisi helpompi ymmärtää näytteenä.
Sitä käytetään normaalina sisältötiedostona, joten rekisteröi se MGCB: hen. Texture
Jätä nimeksi .
pelto
Game1
Kirjoitetaan se luokassa. Nykyistä koodia ei muuteta erityisesti, joten kuvailen vain lisätyn määrän kuvaamatta sitä.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Kentät on tarkoitettu valmisteltujen kuvien lataamiseen, eivätkä ne ole erityisen merkityksellisiä tämän vihjeen sisällön kannalta.
RenderTarget2D
Luokassa määritetyistä kentistä tulee hahmonnuskohteita.
Koska se on välttämätöntä ilmentyä GraphicsDevice
, sitä ei voida luoda tässä vaiheessa, joten se on vain määritelty.
Game1-konstruktori
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Tässä ei ole mitään erityistä tekemistä. Toistaiseksi olen määrittänyt pelin resoluution, jotta sitä voidaan verrata renderöintikohteeseen.
Lataa sisältö
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Lue ensin käyttö Texture2D
Content.Load
piirtämiseen .
GraphicsDevice
Jos on RenderTarget2D
, voit luoda sen missä tahansa, mutta esimerkissä luomme sen menetelmässä LoadContent
.
Renderöintikohde on todellinen pintakuvio, joten sillä on koko. Konstruktori GraphicsDevice
määrittää myös koon yhdessä .
Piirtää
Jos käytät hahmonnuskohdetta, tässä oleva koodi on tärkein.
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);
}
Koska piirustus suoritetaan periaatteessa GraphicsDevice
, vaikka piirustusprosessi suoritettaisiin sellaisenaan, se piirretään pääikkunaa vasten.
GraphicsDevice.SetRenderTarget
Määrittämällä RenderTarget2D
menetelmän voit vaihtaa piirustuksen kohteen pintakuvioksi.
Vaihtamisen jälkeen piirustusprosessi suoritetaan samalla tavalla kuin pääikkunassa piirrettäessä.
GraphicsDevice.Clear
tyhjentää piirustustiedot ja piirtääSpriteBatch
spriten.
Tarkistaakseni, piirrätkö todella tekstuuria vasten, määrittelin tarkoituksella piirustuspaikan niin, että sprite työntyy tällä kertaa esiin.
Kun olet piirtänyt hahmonnuskohteeseen, GraphicsDevice.SetRenderTarget
määritä null
menetelmä.
Tämän avulla voit palauttaa piirustuskohteen pääikkunaan.
RenderTarget2D
voidaan käyttää tekstuurina sellaisenaan, joten SpriteBatch.Draw
määritän _renderTarget
menetelmän piirtää se sprite.
teloitus
Kun olet kirjoittanut koodin, yritä suorittaa se. Jos se näyttää luvulta, se on OK.
Hahmonnuskohteen täyttöväri ja pääikkunan täyttöväri erotetaan toisistaan, joten näet, missä pintakuvio luotiin hahmonnuksen kohteena. Piirsin spriten niin, että se työntyy renderöintikohdetta vasten, mutta mielestäni näet, että se on leikattu oikein eikä piirretty pääikkunaa kohti.
Se on kaikki koodi, joka saavuttaa renderöintitavoitteen. Mikään ei ole erityisen vaikeaa.
Luulen, että ainoa asia, josta välitän, on piirustuskohteiden vaihtamisen hallinta ja hallinta RenderTarget2D
.
Kokeile siirtää sitä
Edellisen suorituksen tulos näyttää siltä, että kuva on yksinkertaisesti rajattu ja piirretty, joten Seuraavaksi haluaisin siirtää spritea varmistaakseni, että se on piirretty oikein renderöintikohteeseen.
Update
Koska haluamme päivittää kierron joka kerta, valmistelemme pyörimiskulman kentällä.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Lisää _rotate
menetelmässä .
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
Menetelmä asettaa spriten pyörimään _rotate
.
Sinun tarvitsee vain tietää, että se pyörii, joten muut arvot asetetaan asianmukaisesti.
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);
}
Kun suoritat sen, sen pitäisi piirtää pyörimisen aikana kuvan osoittamalla tavalla.