استفاده از 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;
}

اینجا کار خاصی برای انجام دادن وجود ندارد. در حال حاضر، من وضوح بازی را مشخص کرده ام تا بتوان ان را با هدف رندر مقایسه کرد.

بارContent

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 به عنوان یک روح مشخص می کنم.

اعدام

هنگامی که کد را نوشتید، سعی کنید ان را اجرا کنید. اگر به نظر می رسد مانند شکل، ان را OK است.

رنگ fill برای هدف رندر و رنگ fill برای پنجره اصلی از هم جدا شده اند، بنابراین می توانید ببینید که بافت به عنوان هدف رندر ایجاد شده است. من روح را کشیدم به طوری که ان را در برابر هدف رندر بیرون زده است، اما من فکر می کنم شما می توانید ببینید که ان را به درستی قطع شده و به سمت پنجره اصلی کشیده نشده است.

این تمام کدی است که هدف رندر را به دست می اورد. هیچ چیز به خصوص دشوار وجود دارد. من فکر می کنم تنها چیزی که من در مورد مراقبت مدیریت تعویض مقصد طراحی و 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);
}

هنگامی که شما ان را اجرا، ان را باید در حالی که چرخش به عنوان در شکل نشان داده شده قرعه کشی.