Sử dụng RenderTarget làm kết cấu sau khi vẽ trên kết cấu

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 10
  • cửa sổ 11
Visual Studio
  • Visual Studio 2022
Trò chơi đơn
  • 3.8.1

Giới thiệu về mục tiêu kết xuất

Thông thường, khi bạn vẽ, nội dung bản vẽ được hiển thị trên màn hình, nhưng bạn có thể sử dụng mục tiêu kết xuất để viết bản vẽ thành kết cấu. Các nội dung được viết trong kết cấu có thể được sử dụng như một kết cấu như nó vốn có. Ví dụ: nếu bạn ghi nội dung của TV vào một kết cấu và sau đó dán kết cấu vào màn hình Tivi, bạn có thể di chuyển một hình ảnh khác trong Tivi. Tất nhiên, nó cũng có thể được sử dụng như một hình ảnh tĩnh và bạn có thể tạo kết cấu động mà không cần chuẩn bị trước tệp hình ảnh cho kết cấu.

Chuẩn bị hình ảnh

Bạn không cần một tệp hình ảnh để sử dụng mục tiêu kết xuất, nhưng tôi sẽ chuẩn bị một tệp hình ảnh để làm cho nó dễ hiểu hơn như một mẫu.

Nó sẽ được sử dụng như một tệp nội dung bình thường, vì vậy vui lòng đăng ký nó trong MGCB. Texture Để tên là .

trường

Game1 Hãy viết nó trong lớp. Mã hiện tại sẽ không được thay đổi cụ thể, vì vậy tôi sẽ chỉ mô tả số tiền được thêm vào mà không mô tả nó.

/// <summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;

/// <summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;

_texture Các trường là để tải các hình ảnh đã chuẩn bị và không đặc biệt liên quan đến nội dung của mẹo này.

RenderTarget2D Các trường được xác định trong lớp trở thành mục tiêu kết xuất. Vì nó là cần thiết để GraphicsDevice khởi tạo , nó không thể được tạo ra ở giai đoạn này, vì vậy nó chỉ được xác định.

Xây dựng Game1

public Game1()
{
  _graphics = new GraphicsDeviceManager(this);
  Content.RootDirectory = "Content";
  IsMouseVisible = true;

  // ゲームの解像度の設定
  _graphics.PreferredBackBufferWidth = 1280;
  _graphics.PreferredBackBufferHeight = 720;
}

Không có gì đặc biệt để làm ở đây. Hiện tại, tôi đã chỉ định độ phân giải của trò chơi để nó có thể được so sánh với mục tiêu kết xuất.

LoadContent

protected override void LoadContent()
{
  _spriteBatch = new SpriteBatch(GraphicsDevice);

  // TODO: this.Content を使用してゲーム コンテンツをここに読み込みます

  // コンテンツからテクスチャーを読み込みます
  _texture = Content.Load<Texture2D>("Texture");

  _renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}

Đầu tiên, hãy đọc cách sử dụng Texture2D Content.Load để vẽ với .

GraphicsDevice Nếu có RenderTarget2D , bạn có thể tạo nó ở bất cứ đâu, nhưng trong ví dụ chúng ta sẽ tạo nó trong LoadContent phương thức. Mục tiêu kết xuất là một kết cấu thực, vì vậy nó có kích thước. Hàm GraphicsDevice tạo cũng chỉ định kích thước cùng với .

Vẽ

Nếu bạn sử dụng mục tiêu kết xuất, mã ở đây là mục tiêu chính.

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);
}

Vì bản vẽ về cơ bản GraphicsDevice được thực hiện trên , ngay cả khi quá trình vẽ được thực hiện như hiện tại, nó sẽ được vẽ dựa vào cửa sổ chính. GraphicsDevice.SetRenderTarget Bằng cách chỉ định một RenderTarget2D phương thức, bạn có thể chuyển đích vẽ sang kết cấu.

Sau khi chuyển đổi, quá trình vẽ được thực hiện theo cách tương tự như khi vẽ trong cửa sổ chính. GraphicsDevice.Clear Xóa thông tin bản vẽ và vẽSpriteBatch sprite. Để kiểm tra xem bạn có thực sự vẽ dựa trên kết cấu hay không, tôi đã cố tình chỉ định vị trí vẽ sao cho sprite nhô ra lần này.

Khi bạn đã vẽ xong đến mục tiêu kết xuất, GraphicsDevice.SetRenderTarget hãy null chỉ định phương thức. Điều này cho phép bạn đưa mục tiêu vẽ trở lại cửa sổ chính.

RenderTarget2D có thể được sử dụng như một kết cấu như nó vốn có, vì vậy SpriteBatch.Draw tôi chỉ định _renderTarget phương pháp để vẽ nó dưới dạng sprite.

Thực hiện

Khi bạn đã viết mã, hãy thử chạy nó. Nếu nó trông giống như hình, nó là OK.

Màu tô cho mục tiêu kết xuất và màu tô cho cửa sổ chính được tách ra, vì vậy bạn có thể thấy nơi kết cấu được tạo làm mục tiêu kết xuất. Tôi đã vẽ sprite sao cho nó nhô ra so với mục tiêu kết xuất, nhưng tôi nghĩ bạn có thể thấy rằng nó được cắt đúng cách và không được vẽ về phía cửa sổ chính.

Đó là tất cả các mã đạt được mục tiêu kết xuất. Không có gì đặc biệt khó khăn. Tôi nghĩ điều duy nhất tôi quan tâm là quản lý việc chuyển đổi các điểm đến bản vẽ và RenderTarget2D quản lý .

Hãy thử di chuyển nó

Kết quả của lần thực hiện trước đó trông giống như hình ảnh chỉ đơn giản là được cắt và vẽ, vì vậy Tiếp theo, tôi muốn di chuyển sprite để đảm bảo rằng nó được vẽ đúng trong mục tiêu kết xuất.

Update Vì chúng tôi muốn cập nhật vòng quay mỗi lần, chúng tôi sẽ chuẩn bị góc quay tại hiện trường.

/// <summary>テクスチャーを回転させる角度。</summary>
private float _rotate;

Update Trong phương pháp, tăng _rotate số lượng .

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 Phương pháp đặt sprite xoay _rotate . Bạn chỉ cần biết rằng nó đang xoay, vì vậy các giá trị khác được đặt một cách thích hợp.

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);
}

Khi bạn chạy nó, nó sẽ vẽ trong khi xoay như trong hình.