Uso de RenderTarget como textura después de dibujar en una textura
Entorno de verificación
- Windows
-
- Ventanas 10
- Ventanas 11
- Visual Studio
-
- Visual Studio 2022
- Monojuego
-
- 3.8.1
Acerca de los destinos de renderizado
Normalmente, al dibujar, el contenido del dibujo se muestra en la pantalla, pero puede utilizar un destino de procesamiento para escribir el dibujo en una textura. El contenido escrito en la textura se puede utilizar como una textura tal cual. Por ejemplo, si escribe el contenido del televisor en una textura y, a continuación, pega la textura en la pantalla del televisor, puede mover una imagen diferente en el televisor. Por supuesto, también se puede usar como una imagen fija, y puede crear una textura dinámicamente sin preparar un archivo de imagen para la textura de antemano.
Preparación de imágenes
No necesita un archivo de imagen para usar el destino de renderizado, pero prepararé un archivo de imagen para que sea más fácil de entender como muestra.
Se utilizará como un archivo de contenido normal, así que regístrelo en MGCB. Texture
Deje el nombre como .
campo
Game1
Vamos a escribirlo en la clase. El código existente no se cambiará en particular, por lo que solo describiré la cantidad agregada sin describirla.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Los campos son para cargar las imágenes preparadas y no son particularmente relevantes para el contenido de este consejo.
RenderTarget2D
Los campos definidos en la clase se convierten en destinos de representación.
Dado que es necesario GraphicsDevice
crear una instancia, no se puede crear en esta etapa, por lo que solo se define.
Constructor de Game1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
No hay nada especial que hacer aquí. Por el momento, he especificado la resolución del juego para que se pueda comparar con el objetivo de renderizado.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Primero, lea el uso Texture2D
Content.Load
para dibujar con .
GraphicsDevice
Si lo hay, puedes generarlo en cualquier lugar, pero en el ejemplo lo RenderTarget2D
crearemos en LoadContent
el método.
El objetivo de renderizado es una textura real, por lo que tiene un tamaño. El GraphicsDevice
constructor también especifica el tamaño junto con .
Dibujar
Si utiliza un destino de renderizado, el código aquí es 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);
}
Dado que el dibujo se realiza básicamente GraphicsDevice
en , incluso si el proceso de dibujo se realiza tal como está, se dibujará contra la ventana principal.
GraphicsDevice.SetRenderTarget
Al especificar un RenderTarget2D
método, puede cambiar el destino del dibujo a una textura.
Después de cambiar, el proceso de dibujo se realiza de la misma manera que cuando se dibuja en la ventana principal.
GraphicsDevice.Clear
Borra la información del dibujo y dibujaSpriteBatch
el sprite.
Para verificar si realmente estás dibujando contra la textura, especificé deliberadamente la posición de dibujo para que el sprite sobresalga esta vez.
Cuando haya terminado de dibujar en el destino de representación, GraphicsDevice.SetRenderTarget
especifique el null
método.
Esto le permite devolver el destino de dibujo a la ventana principal.
RenderTarget2D
se puede usar como una textura tal como está, así que SpriteBatch.Draw
especifico el _renderTarget
método para dibujarlo como un sprite.
ejecución
Una vez que haya escrito el código, intente ejecutarlo. Si se parece a la figura, está bien.
El color de relleno para el destino de procesamiento y el color de relleno para la ventana principal están separados, por lo que puede ver dónde se creó la textura como destino de procesamiento. Dibujé el sprite para que sobresalga contra el objetivo de renderizado, pero creo que puedes ver que está correctamente recortado y no dibujado hacia la ventana principal.
Ese es todo el código que logra el objetivo de renderizado. No hay nada particularmente difícil.
Creo que lo único que me importa es gestionar el cambio de destino de dibujo y RenderTarget2D
administrar .
Intenta moverlo
El resultado de la ejecución anterior parece que la imagen simplemente está recortada y dibujada, por lo que A continuación, me gustaría mover el sprite para asegurarme de que está dibujado correctamente en el destino de renderizado.
Update
Como queremos actualizar la rotación cada vez, prepararemos el ángulo de rotación en el campo.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
En el método, aumente el _rotate
número 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étodo establece el sprite para que _rotate
gire.
Solo necesita saber que está girando, por lo que los otros valores se establecen adecuadamente.
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);
}
Cuando lo ejecute, debe dibujarse mientras gira como se muestra en la figura.