텍스처를 그린 후 RenderTarget을 텍스처로 사용

페이지 업데이트 :
페이지 생성 날짜 :

검증 환경

윈도우
  • 윈도우 10
  • 윈도우 11
비주얼 스튜디오
  • 비주얼 스튜디오 2022
모노게임
  • 3.8.1

렌더 타겟 정보

일반적으로 그릴 때 그리기 내용이 화면에 표시되지만 렌더링 대상을 사용하여 드로잉을 텍스처에 쓸 수 있습니다. 텍스쳐에 쓰여진 내용은 그대로 텍스쳐로 사용할 수 있습니다. 예를 들어 TV의 내용을 텍스처에 쓴 다음 텍스처를 TV 화면에 붙여넣으면 TV에서 다른 이미지를 이동할 수 있습니다. 물론 정지 이미지로도 사용할 수 있으며, 텍스처에 대한 이미지 파일을 미리 준비하지 않고도 동적으로 텍스처를 만들 수 있습니다.

이미지 준비

렌더 타겟을 사용하기 위해 이미지 파일이 필요한 것은 아니지만, 샘플로서 알기 쉽도록 이미지 파일을 준비하겠습니다.

통상의 콘텐츠 파일로 사용되므로, 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 .

실행

코드를 작성한 후 실행해 보세요. 그림처럼 보이면 OK입니다.

렌더링 대상의 채우기 색과 기본 창의 채우기 색이 분리되어 있으므로 렌더링 대상으로 텍스처가 만들어진 위치를 볼 수 있습니다. 스프라이트가 렌더 타겟에 돌출되도록 그렸는데, 제대로 잘리고 메인 창 쪽으로 그려지지 않는 것을 볼 수 있을 것 같습니다.

이것이 렌더링 대상을 달성하는 모든 코드입니다. 특별히 어려운 것은 없습니다. 내가 신경 쓰는 유일한 것은 도면 목적지의 전환을 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);
}

실행하면 그림과 같이 회전하면서 그려야 합니다.