Ús de RenderTarget com a textura després de dibuixar una textura
Entorn de verificació
- Windows
-
- Windows 10
- Finestres 11
- Estudi visual
-
- Estudi visual 2022
- Monojoc
-
- 3.8.1
Sobre els objectius de renderització
Normalment, quan dibuixeu, el contingut del dibuix es mostra a la pantalla, però podeu utilitzar un objectiu de renderització per escriure el dibuix amb una textura. El contingut escrit en la textura es pot utilitzar com a textura tal com és. Per exemple, si escriviu el contingut del televisor amb una textura i després enganxeu la textura a la pantalla del televisor, podeu moure una imatge diferent al televisor. Per descomptat, també es pot utilitzar com a imatge fixa i podeu crear una textura dinàmicament sense preparar un fitxer d'imatge per a la textura amb antelació.
Preparació d'imatges
No necessiteu un fitxer d'imatge per utilitzar l'objectiu render, però prepararé un fitxer d'imatge perquè sigui més fàcil d'entendre com a mostra.
S'utilitzarà com un fitxer de contingut normal, per la qual cosa si us plau, registreu-lo a MGCB. Texture
Deixeu el nom com .
camp
Game1
Escrivim-ho a classe. El codi existent no es canviarà en particular, de manera que només descriuré la quantitat afegida sense descriure-la.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Els camps són per carregar les imatges preparades i no són especialment rellevants per al contingut d'aquest consell.
RenderTarget2D
Els camps definits a la classe es converteixen en objectius de renderització.
Com que cal instanciar GraphicsDevice
, no es pot crear en aquesta etapa, de manera que només es defineix.
Constructor de Game1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Aquí no hi ha res especial a fer. De moment, he especificat la resolució del joc perquè es pugui comparar amb l'objectiu render.
Carrega el contingut
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
En primer lloc, llegiu l'ús Texture2D
Content.Load
per dibuixar amb .
GraphicsDevice
Si n'hi ha , es pot generar en qualsevol lloc, però en l'exemple RenderTarget2D
el crearem en LoadContent
el mètode.
L'objectiu render és una textura real, per la qual cosa té una mida. El GraphicsDevice
constructor també especifica la mida juntament amb .
Dibuixar
Si utilitzeu un objectiu de renderització, el codi aquí és el 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);
}
Com que el dibuix es realitza bàsicament GraphicsDevice
sobre , fins i tot si el procés de dibuix es realitza tal qual, es dibuixarà contra la finestra principal.
GraphicsDevice.SetRenderTarget
Si especifiqueu un RenderTarget2D
mètode, podeu canviar la destinació del dibuix a una textura.
Després de canviar, el procés de dibuix es realitza de la mateixa manera que quan es dibuixa a la finestra principal.
GraphicsDevice.Clear
esborra la informació del dibuix i dibuixaSpriteBatch
el personatge.
Per comprovar si realment dibuixeu contra la textura, he especificat deliberadament la posició del dibuix perquè l'sprite sobresurti aquesta vegada.
Quan hàgiu acabat de dibuixar a l'objectiu renderitza, GraphicsDevice.SetRenderTarget
especifiqueu el mètode null
.
Això us permet tornar l'objectiu de dibuix a la finestra principal.
RenderTarget2D
es pot utilitzar com a textura tal com és, així que SpriteBatch.Draw
especifico el _renderTarget
mètode per dibuixar-lo com un sprite.
execució
Un cop hàgiu escrit el codi, proveu d'executar-lo. Si s'assembla a la xifra, està bé.
El color de farciment per a l'objectiu render i el color d'ompliment per a la finestra principal estan separats, de manera que podeu veure on es va crear la textura com a objectiu de renderització. He dibuixat l'sprite de manera que sobresurti contra l'objectiu render, però crec que es pot veure que està ben retallat i no dibuixat cap a la finestra principal.
Aquest és tot el codi que aconsegueix l'objectiu render. No hi ha res especialment difícil.
Crec que l'únic que m'importa és gestionar el canvi de destinació i RenderTarget2D
gestionar .
Proveu de moure'l
El resultat de l'execució anterior sembla que la imatge simplement es retalla i es dibuixa, de manera que A continuació, m'agradaria moure l'sprite per assegurar-me que es dibuixa correctament a l'objectiu render.
Update
Com que volem actualitzar la rotació cada vegada, prepararem l'angle de rotació al camp.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
En el mètode, augmenteu el _rotate
nombre 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
El mètode estableix que l'sprite giri _rotate
.
Només heu de saber que gira, de manera que els altres valors s'estableixen adequadament.
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);
}
Quan l'executeu, s'ha de dibuixar mentre gira tal com es mostra a la figura.