שימוש ב- RenderTarget כמרקם לאחר ציור על מרקם

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 10
  • חלונות 11
Visual Studio
  • Visual Studio 2022
מונוגיים
  • 3.8.1

אודות יעדי רינדור

בדרך כלל, בעת ציור, תוכן הציור מוצג על המסך, אך באפשרותך להשתמש ביעד עיבוד כדי לכתוב את הציור לפי מרקם. התוכן הכתוב במרקם יכול לשמש כמרקם כפי שהוא. לדוגמה, אם אתה כותב את תוכן הטלוויזיה למרקם ולאחר מכן מדביק את המרקם על מסך הטלוויזיה, באפשרותך להזיז תמונה אחרת בטלוויזיה. כמובן שניתן להשתמש בה גם כתמונת סטילס, וניתן ליצור מרקם באופן דינמי מבלי להכין מראש קובץ תמונה למרקם.

הכנת תמונות

אינך זקוק לקובץ תמונה כדי להשתמש ביעד הרינדור, אך אכין קובץ תמונה כדי שיהיה קל יותר להבין אותו כמדגם.

הוא ישמש כקובץ תוכן רגיל, לכן אנא רשום אותו ב- MGCB. Texture השאר את השם כ- .

שדה

Game1 בואו נכתוב את זה בכיתה. הקוד הקיים לא ישתנה במיוחד, ולכן אתאר רק את הסכום שנוסף מבלי לתאר אותו.

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

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

_texture השדות מיועדים לטעינת התמונות המוכנות ואינם רלוונטיים במיוחד לתוכן של טיפ זה.

RenderTarget2D שדות המוגדרים במחלקה הופכים ליעדי רינדור. מאז יש צורך GraphicsDevice מיידי , זה לא יכול להיווצר בשלב זה, ולכן זה רק מוגדר.

בנאי משחק 1

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 השיטה לצייר אותו כמו ספרייט.

הוצאה להורג

לאחר שכתבת את הקוד, נסה להפעיל אותו. אם זה נראה כמו הדמות, זה בסדר.

צבע המילוי של יעד הרינדור וצבע המילוי של החלון הראשי מופרדים, כך שניתן לראות היכן נוצר המרקם כיעד הרינדור. ציירתי את הספרייט כך שיבלוט כנגד מטרת הרינדור, אבל אני חושב שאפשר לראות שהוא חתוך כראוי ולא נמשך לכיוון החלון הראשי.

זה כל הקוד שמשיג את יעד הרינדור. אין שום דבר קשה במיוחד. אני חושב שהדבר היחיד שמעניין אותי זה לנהל את החלפת יעדי השרטוט ולנהל 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);
}

כאשר אתה מפעיל אותו, הוא אמור לצייר תוך כדי סיבוב כפי שמוצג באיור.