RenderTargeti kasutamine tekstuurina pärast tekstuurile joonistamist
Kontrollimise keskkond
- Windows
-
- Windows 10
- Windows 11
- Visuaalne stuudio
-
- Visual Studio 2022
- Monomäng
-
- 3.8.1
Teave sihtmärkide renderdamise kohta
Tavaliselt kuvatakse joonistamisel joonise sisu ekraanil, kuid saate joonise tekstuurile kirjutamiseks kasutada renderdussihtmärki. Tekstuuriga kirjutatud sisu saab kasutada tekstuurina sellisena, nagu see on. Näiteks kui kirjutate teleri sisu tekstuurile ja kleebite seejärel tekstuuri teleriekraanile, saate teleris teisaldada teise pildi. Loomulikult saab seda kasutada ka vaikse pildina ja saate luua tekstuuri dünaamiliselt, ilma et peaksite tekstuuri jaoks pildifaili ette valmistama.
Piltide ettevalmistamine
Renderdussihtmärgi kasutamiseks pole vaja pildifaili, kuid valmistan ette pildifaili, et seda oleks näidisena lihtsam mõista.
Seda kasutatakse tavalise sisufailina, nii et palun registreerige see MGCB-s. Texture
Jätke nimi nimeks .
põld
Game1
Kirjutame selle klassis. Olemasolevat koodi eriti ei muudeta, seega kirjeldan ainult lisatud summat ilma seda kirjeldamata.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Väljad on ettevalmistatud piltide laadimiseks ja ei ole selle näpunäite sisu suhtes eriti asjakohased.
RenderTarget2D
Klassis määratletud väljad muutuvad renderdamise sihtmärkideks.
Kuna on vaja GraphicsDevice
koheselt , ei saa seda selles etapis luua, seega on see ainult määratletud.
Game1 konstruktor
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Siin pole midagi erilist teha. Praegu olen täpsustanud mängu eraldusvõimet, et seda saaks võrrelda renderdamise sihtmärgiga.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Kõigepealt lugege kasutamist Texture2D
Content.Load
joonistamiseks koos .
GraphicsDevice
Kui on RenderTarget2D
, saate selle genereerida kõikjal, kuid näites loome selle meetodis LoadContent
.
Renderdussihtmärk on tõeline tekstuur, seega on sellel suurus. Konstruktor GraphicsDevice
määrab ka suuruse koos .
Viik
Kui kasutate renderdussihtmärki, on siinne kood peamine.
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);
}
Kuna joonistamine toimub põhimõtteliselt GraphicsDevice
, isegi kui joonistamisprotsess viiakse läbi nii, nagu see on, joonistatakse see vastu peaakent.
GraphicsDevice.SetRenderTarget
Meetodi määramisega RenderTarget2D
saate joonistuse sihtkoha tekstuuriks muuta.
Pärast lülitamist viiakse joonistusprotsess läbi samamoodi nagu peaaknas joonistamisel.
GraphicsDevice.Clear
Puhastab joonistusteabe ja joonistabSpriteBatch
spraidi.
Selleks, et kontrollida, kas te tõesti joonistate tekstuuri vastu, täpsustasin teadlikult joonistusasendit nii, et sprait ulatub seekord välja.
Kui olete renderdamise sihtmärgini joonistamise lõpetanud, GraphicsDevice.SetRenderTarget
määrake null
meetod.
See võimaldab teil joonise sihtmärgi peaaknasse tagasi saata.
RenderTarget2D
saab kasutada tekstuurina sellisena, nagu see on, seega SpriteBatch.Draw
täpsustan _renderTarget
meetodi selle joonistamiseks spraidina.
Täitmise
Kui olete koodi kirjutanud, proovige seda käivitada. Kui see näeb välja nagu joonis, on see OK.
Renderdussihtmärgi täitevärv ja peaakna täitevärv on eraldatud, nii et näete, kus tekstuur renderdamise sihtmärgina loodi. Joonistasin spraidi nii, et see ulatuks vastu renderdamise sihtmärki, kuid arvan, et näete, et see on korralikult kärbitud ja seda ei tõmmata peaakna poole.
See on kõik kood, mis saavutab renderduseesmärgi. Miski pole eriti raske.
Ma arvan, et ainus asi, millest ma hoolin, on joonistamise sihtkohtade vahetamise haldamine ja RenderTarget2D
haldamine .
Proovige seda teisaldada
Eelmise täitmise tulemus näeb välja nii, et pilt on lihtsalt kärbitud ja joonistatud, nii et Järgmisena tahaksin spraiti liigutada, et veenduda, et see on renderdamise sihtmärgis õigesti joonistatud.
Update
Kuna tahame pöörlemist iga kord värskendada, valmistame põllul ette pöördenurga.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Meetodis suurendage _rotate
arvu .
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
Meetod seab spraidi pöörlema _rotate
.
Teil on vaja ainult teada, et see pöörleb, nii et teised väärtused on sobivalt seatud.
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);
}
Selle käivitamisel peaks see joonistama pööramise ajal, nagu joonisel näidatud.