Използване на RenderTarget като текстура след рисуване върху текстура
Среда за проверка
- Уиндоус
-
- Прозорци 10
- Прозорци 11
- Визуално студио
-
- Визуално студио 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;
}
Тук няма нищо специално за правене. За момента съм уточнил резолюцията на играта, така че да може да се сравни с целта на рендера.
Зареждане на съдържание
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);
}
Когато го стартирате, той трябва да рисува, докато се върти, както е показано на фигурата.