Använda RenderTarget som textur efter att ha ritat på en textur
Verifiering miljö
- Windows
-
- Fönster 10
- Fönster 11
- Visuell studio
-
- Visual Studio 2022
- Monospel
-
- 3.8.1
Om renderingsmål
När du ritar visas ritningsinnehållet normalt på skärmen, men du kan använda ett renderingsmål för att skriva ritningen till en textur. Innehållet skrivet i texturen kan användas som en textur som den är. Om du till exempel skriver innehållet på TV:n till en textur och sedan klistrar in texturen på TV-skärmen kan du flytta en annan bild i TV:n. Naturligtvis kan den också användas som en stillbild, och du kan skapa en textur dynamiskt utan att förbereda en bildfil för texturen i förväg.
Förbereda bilder
Du behöver ingen bildfil för att använda renderingsmålet, men jag ska förbereda en bildfil för att göra den lättare att förstå som ett exempel.
Den kommer att användas som en vanlig innehållsfil, så registrera den i MGCB. Texture
Lämna namnet som .
fält
Game1
Låt oss skriva det i klassen. Den befintliga koden kommer inte att ändras i synnerhet, så jag kommer bara att beskriva det tillagda beloppet utan att beskriva det.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Fälten är för att ladda de förberedda bilderna och är inte särskilt relevanta för innehållet i detta tips.
RenderTarget2D
Fält som definieras i klassen blir renderingsmål.
Eftersom det är nödvändigt att GraphicsDevice
instansiera , det kan inte skapas i detta skede, så det definieras bara.
Game1 konstruktör
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Det finns inget speciellt att göra här. För närvarande har jag specificerat spelets upplösning så att den kan jämföras med renderingsmålet.
LoadContent
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 användningen Texture2D
Content.Load
för att rita med .
GraphicsDevice
Om det finns RenderTarget2D
kan du generera det var som helst, men i exemplet skapar vi det i LoadContent
metoden.
Renderingsmålet är en riktig struktur, så det har en storlek. Konstruktorn GraphicsDevice
anger också storleken tillsammans med .
Rita
Om du använder ett renderingsmål är koden här den viktigaste.
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);
}
Eftersom ritning i princip GraphicsDevice
utförs på , även om ritningsprocessen utförs som den är, kommer den att dras mot huvudfönstret.
GraphicsDevice.SetRenderTarget
Genom att ange en metod kan du växla ritningsmålet till en RenderTarget2D
textur.
Efter växling utförs ritningsprocessen på samma sätt som vid ritning i huvudfönstret.
GraphicsDevice.Clear
Rensar ritningsinformationen och ritarSpriteBatch
spriten.
För att kontrollera om du verkligen ritar mot texturen specificerade jag medvetet ritningspositionen så att spriten sticker ut den här gången.
När du är klar med ritningen till renderingsmålet GraphicsDevice.SetRenderTarget
anger null
du metoden.
Detta gör att du kan återställa ritningsmålet till huvudfönstret.
RenderTarget2D
kan användas som en textur som den är, så SpriteBatch.Draw
jag anger metoden för att rita den _renderTarget
som en sprite.
avrättning
När du har skrivit koden kan du prova att köra den. Om det ser ut som figuren är det OK.
Fyllningsfärgen för renderingsmålet och fyllningsfärgen för huvudfönstret separeras så att du kan se var texturen skapades som renderingsmål. Jag ritade spriten så att den sticker ut mot renderingsmålet, men jag tror att du kan se att den är ordentligt klippt och inte ritad mot huvudfönstret.
Det är all kod som uppnår renderingsmålet. Det finns inget särskilt svårt.
Jag tror att det enda jag bryr mig om är att hantera byte av ritningsdestinationer och RenderTarget2D
hantera .
Prova att flytta den
Resultatet av föregående körning ser ut som att bilden helt enkelt beskärs och ritas, så Därefter vill jag flytta sprite för att se till att den ritas korrekt i renderingsmålet.
Update
Eftersom vi vill uppdatera rotationen varje gång kommer vi att förbereda rotationsvinkeln i fältet.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
I metoden ökar _rotate
du antalet .
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 ställer in sprite att _rotate
rotera.
Du behöver bara veta att den roterar, så de andra värdena ställs in på lämpligt sätt.
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ör den ska den rita medan den roterar som visas i figuren.