Brug af RenderTarget som tekstur efter tegning af en tekstur
Miljø til bekræftelse
- Windows
-
- Windows 10
- Windows 11
- Visual Studio
-
- Visual Studio 2022
- Monospil
-
- 3.8.1
Om gengivelsesmål
Når du tegner, vises tegneindholdet normalt på skærmen, men du kan bruge et gengivelsesmål til at skrive tegningen til en struktur. Indholdet skrevet i tekstur kan bruges som en tekstur, som den er. Hvis du f.eks. skriver indholdet af tv'et til en tekstur og derefter indsætter teksturen på tv-skærmen, kan du flytte et andet billede i tv'et. Selvfølgelig kan den også bruges som et stillbillede, og du kan oprette en tekstur dynamisk uden at forberede en billedfil til tekstur på forhånd.
Forberedelse af billeder
Du behøver ikke en billedfil for at bruge gengivelsesmålet, men jeg forbereder en billedfil for at gøre den lettere at forstå som et eksempel.
Det vil blive brugt som en normal indholdsfil, så registrer den venligst i MGCB. Texture
Lad navnet være .
mark
Game1
Lad os skrive det i klassen. Den eksisterende kode vil ikke blive ændret specielt, så jeg vil kun beskrive det tilføjede beløb uden at beskrive det.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Felterne er til indlæsning af de forberedte billeder og er ikke særlig relevante for indholdet af dette tip.
RenderTarget2D
Felter, der er defineret i klassen, bliver gengivelsesmål.
Da det er nødvendigt at GraphicsDevice
instantiere , det kan ikke oprettes på dette stadium, så det er kun defineret.
Spil1 konstruktør
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Der er ikke noget særligt at gøre her. Indtil videre har jeg specificeret opløsningen af spillet, så det kan sammenlignes med gengivelsesmålet.
Indlæs indhold
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Læs først brugen Texture2D
Content.Load
til tegning med .
GraphicsDevice
Hvis der er RenderTarget2D
, kan du generere det hvor som helst, men i eksemplet opretter vi det i LoadContent
metoden.
Gengivelsesmålet er en ægte tekstur, så det har en størrelse. Konstruktøren GraphicsDevice
angiver også størrelsen sammen med .
Tegne
Hvis du bruger et gengivelsesmål, er koden her den vigtigste.
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);
}
Da tegning grundlæggende GraphicsDevice
udføres på , selvom tegningsprocessen udføres som den er, tegnes den mod hovedvinduet.
GraphicsDevice.SetRenderTarget
Ved at angive en metode kan du skifte tegningsdestinationen til en RenderTarget2D
tekstur.
Efter skift udføres tegningsprocessen på samme måde som ved tegning i hovedvinduet.
GraphicsDevice.Clear
rydder tegningsoplysningerne og tegnerSpriteBatch
spriten.
For at kontrollere, om du virkelig tegner mod teksturen, specificerede jeg bevidst tegnepositionen, så spriten stikker ud denne gang.
Når du er færdig med at tegne til gengivelsesmåletnull
, GraphicsDevice.SetRenderTarget
skal du angive metoden.
Dette giver dig mulighed for at returnere tegningsmålet til hovedvinduet.
RenderTarget2D
kan bruges som en tekstur som den er, så SpriteBatch.Draw
jeg specificerer metoden til at tegne den _renderTarget
som en sprite.
henrettelse
Når du har skrevet koden, kan du prøve at køre den. Hvis det ligner figuren, er det OK.
Fyldfarven for gengivelsesmålet og fyldfarven for hovedvinduet er adskilt, så du kan se, hvor teksturen blev oprettet som gengivelsesmål. Jeg tegnede spritten, så den stikker ud mod gengivelsesmålet, men jeg tror, du kan se, at den er korrekt klippet og ikke trukket mod hovedvinduet.
Det er al den kode, der opnår gengivelsesmålet. Der er ikke noget særligt vanskeligt.
Jeg tror, at det eneste, jeg bekymrer mig om, er at styre skiftet af tegningsdestinationer og RenderTarget2D
administrere .
Prøv at flytte den
Resultatet af den foregående udførelse ser ud som om billedet simpelthen er beskåret og tegnet, så Dernæst vil jeg gerne flytte spritten for at sikre, at den er korrekt tegnet i gengivelsesmålet.
Update
Da vi ønsker at opdatere rotationen hver gang, forbereder vi rotationsvinklen i marken.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
I metoden øges _rotate
antallet af .
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
Metoden indstiller spritten til at _rotate
rotere.
Du behøver kun at vide, at den roterer, så de andre værdier indstilles korrekt.
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);
}
Når du kører det, skal det tegne, mens du roterer som vist på figuren.