"RenderTarget" naudojimas kaip tekstūros po piešimo ant tekstūros
Tikrinimo aplinka
- Windows
-
- Langai 10
- Langai 11
- Vizualinė studija
-
- "Visual Studio 2022"
- Monožaidimas
-
- 3.8.1
Apie "Render Targets"
Paprastai, kai piešiate, piešinio turinys rodomas ekrane, tačiau galite naudoti atvaizdavimo tikslą, kad parašytumėte piešinį į tekstūrą. Tekstūroje parašytas turinys gali būti naudojamas kaip tekstūra, kokia ji yra. Pavyzdžiui, jei televizoriaus turinį įrašote į tekstūrą ir įklijuojate tekstūrą į televizoriaus ekraną, televizoriuje galite perkelti kitą vaizdą. Žinoma, jis taip pat gali būti naudojamas kaip nejudantis vaizdas, ir jūs galite dinamiškai sukurti tekstūrą, iš anksto neparuošę tekstūros vaizdo failo.
Vaizdų paruošimas
Jums nereikia vaizdo failo, kad galėtumėte naudoti pateikimo tikslą, bet aš paruošiu vaizdo failą, kad jį būtų lengviau suprasti kaip pavyzdį.
Jis bus naudojamas kaip įprastas turinio failas, todėl užregistruokite jį MGCB. Texture
Palikite pavadinimą kaip .
laukas
Game1
Parašykime tai klasėje. Esamas kodas visų pirma nebus pakeistas, todėl aprašysiu tik pridėtą sumą, jos neaprašydamas.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Laukai skirti paruoštiems vaizdams įkelti ir nėra ypač susiję su šio patarimo turiniu.
RenderTarget2D
Klasėje apibrėžti laukai tampa generavimo tikslais.
Kadangi būtina GraphicsDevice
momentuoti , jis negali būti sukurtas šiame etape, todėl jis yra tik apibrėžtas.
Game1 konstruktorius
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Čia nėra nieko ypatingo. Kol kas nurodžiau žaidimo skiriamąją gebą, kad ją būtų galima palyginti su atvaizdavimo tikslu.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Pirmiausia perskaitykite piešimo naudojimą Texture2D
Content.Load
su .
GraphicsDevice
Jei yra RenderTarget2D
, galite jį generuoti bet kur, bet pavyzdyje mes jį LoadContent
sukursime metode.
Atvaizdavimo tikslas yra tikra tekstūra, todėl jis turi dydį. Konstruktorius GraphicsDevice
taip pat nurodo dydį kartu su .
Piešti
Jei naudojate atvaizdavimo tikslą, čia esantis kodas yra pagrindinis.
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);
}
Kadangi piešimas iš esmės GraphicsDevice
atliekamas , net jei piešimo procesas bus atliekamas taip, kaip yra, jis bus nupieštas prieš pagrindinį langą.
GraphicsDevice.SetRenderTarget
Nurodę RenderTarget2D
metodą, piešimo paskirties vietą galite perjungti į tekstūrą.
Po perjungimo piešimo procesas atliekamas taip pat, kaip piešiant pagrindiniame lange.
GraphicsDevice.Clear
išvalo piešimo informaciją ir nupiešiaSpriteBatch
sprite.
Norėdamas patikrinti, ar tikrai piešiate pagal tekstūrą, sąmoningai nurodžiau piešimo padėtį, kad sprite šį kartą išsikištų.
Baigę piešti pagal atvaizdavimo tikslą, GraphicsDevice.SetRenderTarget
nurodykite null
metodą.
Tai leidžia grąžinti piešimo tikslą į pagrindinį langą.
RenderTarget2D
gali būti naudojamas kaip tekstūra, kokia ji yra, todėl SpriteBatch.Draw
nurodau metodą, _renderTarget
kaip jį nupiešti kaip sprite.
Vykdymo
Parašę kodą, pabandykite jį paleisti. Jei tai atrodo kaip paveikslas, tai gerai.
Atvaizdavimo paskirties užpildo spalva ir pagrindinio lango užpildo spalva yra atskirtos, todėl galite matyti, kur tekstūra buvo sukurta kaip atvaizdavimo paskirties vieta. Aš nupiešiau sprite taip, kad jis išsikištų prieš atvaizdavimo taikinį, bet manau, kad matote, kad jis yra tinkamai nukirptas ir nėra traukiamas link pagrindinio lango.
Tai visas kodas, kuris pasiekia atvaizdavimo tikslą. Nėra nieko ypatingo sunkumo.
Manau, kad vienintelis dalykas, kuris man rūpi, yra valdyti piešimo paskirties vietų perjungimą ir RenderTarget2D
valdymą .
Pabandykite jį perkelti
Ankstesnio vykdymo rezultatas atrodo, kad vaizdas yra tiesiog apkarpytas ir nupieštas, todėl Tada norėčiau perkelti sprite, kad įsitikinčiau, jog jis tinkamai nupieštas atvaizdavimo tiksle.
Update
Kadangi norime kiekvieną kartą atnaujinti sukimąsi, paruošime sukimosi kampą lauke.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Metode padidinkite _rotate
skaičių .
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
Metodas nustato sprite _rotate
suktis.
Jums tereikia žinoti, kad jis sukasi, todėl kitos vertės nustatomos tinkamai.
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);
}
Kai jį paleisite, jis turėtų piešti sukdamasis, kaip parodyta paveikslėlyje.