Uporaba RenderTarget kot tekstura po risbi na teksturi
Okolje za preverjanje
- Windows
-
- Windows 10
- Windows 11
- Vizualni studio
-
- Vizualni studio 2022
- MonoGame
-
- 3.8.1
O ujemanju ciljev
Običajno se pri risanju na zaslonu prikaže vsebina risbe, vendar lahko s ciljnim prikazom zapišete risbo v teksturo. Vsebina, zapisana v teksturo, se lahko uporablja kot tekstura, kot je. Če na primer vsebino televizorja napišete v teksturo in nato prilepite teksturo na zaslon televizorja, lahko v televizorju premaknete drugo sliko. Seveda se lahko uporablja tudi kot še vedno slika, teksturo pa lahko ustvarite dinamično, ne da bi vnaprej pripravljali slikovno datoteko za teksturo.
Priprava slik
Za uporabo cilja renderja ne potrebujete slikovne datoteke, vendar bom pripravil slikovno datoteko, da bo lažje razumeti kot vzorec.
To bo uporabljena kot običajna vsebinska datoteka, zato jo registrirajte v MGCB. Texture
Pustite ime kot .
polje
Game1
Napišimo to v razredu. Obstoječa koda se ne bo spremenila zlasti, zato bom dodal samo dodani znesek, ne da bi ga opisal.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Polja so za nalaganje pripravljenih slik in niso posebej pomembna za vsebino tega namiga.
RenderTarget2D
Polja, opredeljena v razredu, postanejo cilji za under.
Ker je treba GraphicsDevice
instantiate , ga ni mogoče ustvariti v tej fazi, zato je le opredeljen.
Konstruktor igre 1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Tukaj ni nič posebnega. Za zdaj sem določil resolucijo igre, tako da jo je mogoče primerjati s ciljnim renderjem.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Najprej preberite uporabo za Texture2D
Content.Load
risanje z .
GraphicsDevice
Če obstaja RenderTarget2D
, ga lahko ustvarite kjerkoli, vendar v primeru bomo ustvarili LoadContent
v metodi.
Cilj renderja je prava tekstura, zato ima velikost. Konstruktor določi GraphicsDevice
tudi velikost skupaj z .
Risati
Če uporabite cilj renderja, je tukaj glavna koda.
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);
}
Ker je GraphicsDevice
risba v osnovi izvedena na , tudi če se risba proces izvaja, kot je, bo risana ob glavnem oknu.
GraphicsDevice.SetRenderTarget
Če določite metodo RenderTarget2D
, lahko cilj risbe preklopite na teksturo.
Po preklopu se postopek risbe izvaja na enak način kot pri risanju v glavnem oknu.
GraphicsDevice.Clear
izprazni informacije o risbi in narišeSpriteBatch
sprit.
Da bi preverili, ali res rišete proti teksturi, sem načrtno določil položaj risbe, tako da bo šprica tokrat štrlela.
Ko končate risanje na cilj ugasnjenja, navedite GraphicsDevice.SetRenderTarget
metodo null
.
Tako lahko cilj risbe vrnete v glavno okno.
RenderTarget2D
se lahko uporablja kot tekstura, kot je, SpriteBatch.Draw
_renderTarget
tako da sem določiti metodo za risanje kot sprite.
usmrtitev
Ko boste napisali kodo, jo poskusite zaganati. Če je videti kot številka, je v redu.
Barva polnila za cilj ugasnjenja in barva polnila za glavno okno sta ločeni, tako da lahko vidite, kje je bila tekstura ustvarjena kot cilj ugasnjenega. Sprit sem narisal tako, da je štrleč proti render tarči, ampak mislim, da lahko vidite, da je pravilno ošiljan in ne vleče proti glavnemu oknu.
To je vsa koda, ki doseže cilj. Nič ni posebej težko.
Mislim, da je edina stvar, ki mi je mar, upravljanje preklapljanje risbe destinacij RenderTarget2D
in upravljanje .
Poskusi ga premakni.
Rezultat prejšnje usmrtitve kaže, da je slika preprosto obrezana in narisana, tako da Nato bi rad premaknil sprit, da se prepričam, da je pravilno narisan v ciljni render.
Update
Ker želimo vrtenje posodabljati vsakič, bomo v polju pripravili kot vrtenja.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Pri metodi povečajte _rotate
število .
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
Metoda določa vrtenje sprita _rotate
.
Vedeti morate le, da se vrti, zato so druge vrednosti nastavljene ustrezno.
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);
}
Ko ga zaženete, naj nariše med vrtenjem, kot je prikazano na sliki.