שימוש ב- 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);
}
כאשר אתה מפעיל אותו, הוא אמור לצייר תוך כדי סיבוב כפי שמוצג באיור.