Utilizarea RenderTarget ca textură după desenarea pe o textură
Mediul de verificare
- Windows
-
- Windows 10
- Windows 11
- Visual Studio
-
- Visual Studio 2022
- MonoGame
-
- 3.8.1
Despre randarea țintelor
În mod normal, atunci când desenați, conținutul desenului este afișat pe ecran, dar puteți utiliza o țintă de randare pentru a scrie desenul la o textură. Conținutul scris în textură poate fi folosit ca textură așa cum este. De exemplu, dacă scrieți conținutul televizorului într-o textură și apoi lipiți textura pe ecranul televizorului, puteți muta o altă imagine în televizor. Desigur, poate fi folosit și ca imagine statică și puteți crea o textură dinamică fără a pregăti un fișier imagine pentru textură în avans.
Pregătirea imaginilor
Nu aveți nevoie de un fișier imagine pentru a utiliza ținta de randare, dar voi pregăti un fișier imagine pentru a-l face mai ușor de înțeles ca eșantion.
Acesta va fi folosit ca un fișier de conținut normal, așa că vă rugăm să-l înregistrați în MGCB. Texture
Lăsați numele ca .
câmp
Game1
Să o scriem în clasă. Codul existent nu va fi modificat în special, așa că voi descrie doar suma adăugată fără a o descrie.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Câmpurile sunt pentru încărcarea imaginilor pregătite și nu sunt deosebit de relevante pentru conținutul acestui sfat.
RenderTarget2D
Câmpurile definite în clasă devin ținte de randare.
Deoarece este necesar să GraphicsDevice
se instantieze , nu poate fi creat în acest stadiu, deci este doar definit.
Constructor game1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Nu este nimic special de făcut aici. Pentru moment, am specificat rezoluția jocului, astfel încât să poată fi comparată cu ținta de randare.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
În primul rând, citiți utilizarea Texture2D
Content.Load
pentru desen cu .
GraphicsDevice
Dacă există RenderTarget2D
, îl puteți genera oriunde, dar în exemplu îl vom crea în LoadContent
metodă.
Ținta de randare este o textură reală, deci are o dimensiune. Constructorul GraphicsDevice
specifică, de asemenea, dimensiunea împreună cu .
Desena
Dacă utilizați o țintă de randare, codul de aici este cel principal.
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);
}
Deoarece desenul este practic GraphicsDevice
efectuat pe , chiar dacă procesul de desen este efectuat așa cum este, acesta va fi desenat pe fereastra principală.
GraphicsDevice.SetRenderTarget
Specificând o RenderTarget2D
metodă, puteți comuta destinația desenului la o textură.
După comutare, procesul de desen se efectuează în același mod ca atunci când desenați în fereastra principală.
GraphicsDevice.Clear
șterge informațiile de desen și deseneazăSpriteBatch
sprite.
În scopul de a verifica dacă sunteți într-adevăr desen împotriva textura, am specificat în mod deliberat poziția de desen, astfel încât sprite iese de data aceasta.
După ce ați terminat de desenat la ținta de randare, GraphicsDevice.SetRenderTarget
specificați null
metoda.
Acest lucru vă permite să returnați ținta de desen la fereastra principală.
RenderTarget2D
poate fi folosit ca o textura asa cum este, asa ca SpriteBatch.Draw
am specifica _renderTarget
metoda de a trage ca un sprite.
execuție
După ce ați scris codul, încercați să îl rulați. Dacă arată ca cifra, este OK.
Culoarea de umplere pentru ținta de randare și culoarea de umplere pentru fereastra principală sunt separate, astfel încât să puteți vedea unde a fost creată textura ca țintă de randare. Am desenat sprite, astfel încât să iasă împotriva țintă face, dar cred că puteți vedea că acesta este corect tuns și nu trase spre fereastra principală.
Acesta este tot codul care atinge ținta de randare. Nu este nimic deosebit de dificil.
Cred că singurul lucru care îmi pasă este gestionarea trecerea de destinații de desen și RenderTarget2D
de gestionare .
Încercați să-l mutați
Rezultatul execuției anterioare arată ca imaginea este pur și simplu decupată și desenată, astfel încât Apoi, aș dori să se mute sprite pentru a vă asigura că acesta este corect trase în țintă face.
Update
Deoarece dorim să actualizăm rotația de fiecare dată, vom pregăti unghiul de rotație în câmp.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
În metodă, creșteți _rotate
numărul de .
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 setează sprite să se _rotate
rotească.
Trebuie doar să știți că se rotește, astfel încât celelalte valori sunt setate în mod corespunzător.
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);
}
Când îl rulați, ar trebui să deseneze în timp ce se rotește așa cum se arată în figură.