Використання RenderTarget як текстури після малювання текстурою
Середовище перевірки
- Вікна
-
- вікна 10
- вікна 11
- Visual Studio
-
- Visual Studio 2022
- Моногра
-
- 3.8.1
Про цілі візуалізації
Зазвичай під час малювання вміст малюнка відображається на екрані, але ви можете використовувати ціль візуалізації, щоб записати малюнок до текстури. Вміст, написане текстурою, можна використовувати як текстуру, як воно є. Наприклад, якщо записати вміст телевізора в текстуру, а потім вставити текстуру на екран телевізора, можна перемістити інше зображення в телевізорі. Звичайно, його також можна використовувати як нерухоме зображення, і ви можете створити текстуру динамічно, не готуючи заздалегідь файл зображення для текстури.
Підготовка зображень
Вам не потрібен файл зображення для використання об'єкта візуалізації, але я підготую файл зображення, щоб його було легше зрозуміти як зразок.
Він буде використовуватися як звичайний файл вмісту, тому, будь ласка, зареєструйте його в MGCB. Texture
Залиште ім'я як .
поле
Game1
Давайте напишемо це в класі. Існуючий код особливо змінений не буде, тому буду тільки описувати додану суму без її опису.
<summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;
<summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;
_texture
Поля призначені для завантаження підготовлених зображень і не особливо відповідають змісту цієї поради.
RenderTarget2D
Поля, визначені в класі, стають цілями візуалізації.
Оскільки необхідно GraphicsDevice
створити екземпляр , він не може бути створений на цьому етапі, тому він лише визначений.
Конструктор Game1
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
// ゲームの解像度の設定
_graphics.PreferredBackBufferWidth = 1280;
_graphics.PreferredBackBufferHeight = 720;
}
Тут робити особливо нічого. Поки що я вказав дозвіл гри, щоб його можна було порівняти з метою рендера.
LoadContent
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: this.Content を使用してゲーム コンテンツをここに読み込みます
// コンテンツからテクスチャーを読み込みます
_texture = Content.Load<Texture2D>("Texture");
_renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}
Спочатку прочитайте використання Texture2D
Content.Load
для малювання з .
GraphicsDevice
Якщо є RenderTarget2D
, ви можете згенерувати його де завгодно, але в прикладі ми створимо його в LoadContent
методі.
Ціль візуалізації є справжньою текстурою, тому вона має розмір. Конструктор GraphicsDevice
також вказує розмір разом з .
Малювати
Якщо ви використовуєте об'єкт візуалізації, код тут є основним.
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);
}
Оскільки малювання в основному GraphicsDevice
виконується на , навіть якщо процес малювання виконується так, як є, він буде намальований проти головного вікна.
GraphicsDevice.SetRenderTarget
Указавши RenderTarget2D
метод, можна змінити ціль креслення на текстуру.
Після перемикання процес малювання виконується так само, як і при малюванні в головному вікні.
GraphicsDevice.Clear
Очищення відомостей про креслення та малюванняSpriteBatch
спрайту.
Для того щоб перевірити, чи дійсно ви малюєте проти текстури, я навмисно вказав положення малюнка, щоб спрайт на цей раз виступав.
Коли ви закінчите малювати до об'єкта візуалізації, GraphicsDevice.SetRenderTarget
вкажіть null
метод.
Це дозволяє повернути об'єкт креслення в головне вікно.
RenderTarget2D
можна використовувати як текстуру, як вона є, тому SpriteBatch.Draw
я вказую метод, _renderTarget
щоб намалювати її як спрайт.
виконання
Написавши код, спробуйте запустити його. Якщо це схоже на малюнок, це нормально.
Колір заливки для цілі візуалізації та колір заливки для головного вікна розділяються, щоб ви могли побачити, де текстура була створена як ціль візуалізації. Я намалював спрайт так, щоб він виступав проти цілі візуалізації, але, думаю, ви можете побачити, що він правильно обрізаний, а не намальований до головного вікна.
Ось і весь код, який досягає мети візуалізації. Тут немає нічого особливо складного.
Я думаю, що єдине, що мене хвилює, - це управління перемиканням місць малювання та RenderTarget2D
управління .
Спробуйте перемістити його
Результат попереднього виконання виглядає так, ніби зображення просто обрізається і намальовується, тому Далі я хотів би перемістити спрайт, щоб переконатися, що він правильно намальований у цілі візуалізації.
Update
Так як ми хочемо кожен раз оновлювати поворот, то підготуємо кут повороту в полі.
<summary>テクスチャーを回転させる角度。</summary>
private float _rotate;
Update
У методі збільшують _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
Метод встановлює спрайт для _rotate
обертання.
Потрібно лише знати, що він обертається, тому інші значення встановлюються відповідним чином.
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);
}
Коли ви його запустите, він повинен малювати під час обертання, як показано на малюнку.