Sử dụng RenderTarget làm kết cấu sau khi vẽ trên kết cấu
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.