RenderTarget izmantošana kā tekstūra pēc zīmēšanas uz tekstūras
Verifikācijas vide
- Windows
-
- Operētājsistēmā Windows 10
- Operētājsistēmā Windows 11
- Visual Studio
-
- Visual Studio 2022
- MonoGame
-
- 3.8.1
Par mērķu atveidošanu
Parasti, zīmējot, zīmēšanas saturs tiek parādīts ekrānā, bet jūs varat izmantot atveidojuma mērķi, lai zīmējumu rakstītu uz faktūru. Tekstūrā rakstīto saturu var izmantot kā tekstūru, kāda tā ir. Piemēram, ja rakstāt televizora saturu uz tekstūras un pēc tam ielīmējat tekstūru televizora ekrānā, televizorā varat pārvietot citu attēlu. Protams, to var izmantot arī kā nekustīgu attēlu, un jūs varat dinamiski izveidot tekstūru, iepriekš nesagatavojot tekstūras attēla failu.
Attēlu sagatavošana
Lai izmantotu renderēšanas mērķi, attēla fails nav nepieciešams, bet es sagatavošu attēla failu, lai to būtu vieglāk saprast kā paraugu.
Tas tiks izmantots kā parasts satura fails, tāpēc, lūdzu, reģistrējiet to MGCB. Texture
Atstājiet vārdu kā .
lauks
Game1
Rakstīsim to klasē. Esošais kods netiks mainīts, tāpēc es aprakstīšu tikai pievienoto summu, to neaprakstot.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Lauki ir paredzēti sagatavoto attēlu ielādei un nav īpaši atbilstoši šī padoma saturam.
RenderTarget2D
Klasē definētie lauki kļūst par atveidošanas mērķiem.
Tā kā ir nepieciešams GraphicsDevice
uzreiz , to nevar izveidot šajā posmā, tāpēc tas ir tikai definēts.
Game1 konstruktors
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Šeit nav nekā īpaša, ko darīt. Pagaidām esmu norādījis spēles izšķirtspēju, lai to varētu salīdzināt ar renderēšanas mērķi.
Ielādēt saturu
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Vispirms izlasiet zīmēšanas lietojumu Texture2D
Content.Load
ar .
GraphicsDevice
Ja ir RenderTarget2D
, jūs varat to ģenerēt jebkur, bet piemērā mēs to LoadContent
izveidosim metodē.
Renderēšanas mērķis ir īsta tekstūra, tāpēc tam ir izmērs. Konstruktors GraphicsDevice
arī norāda izmēru kopā ar .
Zīmēt
Ja izmantojat renderēšanas mērķi, šeit redzamais kods ir galvenais.
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);
}
Tā kā zīmēšana pamatā GraphicsDevice
tiek veikta , pat ja zīmēšanas process tiek veikts tāds, kāds tas ir, tas tiks uzzīmēts pret galveno logu.
GraphicsDevice.SetRenderTarget
Norādot RenderTarget2D
metodi, varat pārslēgt zīmēšanas galamērķi uz faktūru.
Pēc pārslēgšanas zīmēšanas process tiek veikts tāpat kā zīmējot galvenajā logā.
GraphicsDevice.Clear
Notīra zīmējuma informāciju un uzzīmēSpriteBatch
sprite.
Lai pārbaudītu, vai jūs tiešām zīmējat pret tekstūru, es apzināti norādīju zīmēšanas pozīciju, lai sprite šoreiz izvirzītos.
Kad esat pabeidzis zīmēšanu uz atveidošanas mērķi, GraphicsDevice.SetRenderTarget
norādiet metodi null
.
Tas ļauj atgriezt zīmēšanas mērķi galvenajā logā.
RenderTarget2D
var izmantot kā tekstūru, kā tas ir, tāpēc SpriteBatch.Draw
es precizēju metodi, _renderTarget
kā to izdarīt kā sprite.
Izpildes
Kad esat uzrakstījis kodu, mēģiniet to palaist. Ja tas izskatās kā skaitlis, tas ir OK.
Atveidojuma mērķa aizpildījuma krāsa un galvenā loga aizpildījuma krāsa ir atdalītas, lai jūs varētu redzēt, kur faktūra tika izveidota kā atveidojuma mērķis. Es uzzīmēju sprite tā, lai tas izvirzītos pret renderēšanas mērķi, bet es domāju, ka jūs varat redzēt, ka tas ir pareizi izgriezts un nav vilkts uz galveno logu.
Tas ir viss kods, kas sasniedz renderēšanas mērķi. Nav nekas īpaši grūts.
Es domāju, ka vienīgais, kas man rūp, ir pārvaldīt zīmēšanas galamērķu maiņu un RenderTarget2D
pārvaldīt .
Mēģiniet to pārvietot
Iepriekšējās izpildes rezultāts izskatās, ka attēls ir vienkārši apgriezts un uzzīmēts, tāpēc Tālāk es gribētu pārvietot sprite, lai pārliecinātos, ka tas ir pareizi uzzīmēts renderēšanas mērķī.
Update
Tā kā mēs vēlamies katru reizi atjaunināt rotāciju, mēs sagatavosim rotācijas leņķi laukā.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
Metodē palieliniet _rotate
.
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
Metode nosaka, ka sprite griežas _rotate
.
Jums tikai jāzina, ka tas rotē, tāpēc pārējās vērtības ir iestatītas atbilstoši.
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);
}
Palaižot to, tam vajadzētu zīmēt, pagriežot, kā parādīts attēlā.