ارسم مضلعا مثلثيا باستخدام مخزن مؤقت للرأس
ملخص
باستخدام مخازن الرأس ، يمكن رسم المضلعات بسرعة.
بيئة التشغيل
المتطلبات المسبقه
إصدارات XNA المدعومة |
|
المنصات المدعومة |
|
ويندوز المطلوبة قمة الإصدار شادر | 2.0 |
ويندوز المطلوبة بكسل شادر الإصدار | 2.0 |
بيئة التشغيل
رصيف |
|
مادة
عندما ترسم مضلعا ، يمكنك رسمه باستخدام شيء يسمى "المخزن المؤقت للرأس". يمكن ملء المخزن المؤقت للقمة ببيانات الرأس لاستخدامها عند رسم الأوليات مثل المضلعات. يسمح المخزن المؤقت للقمة بوضع بيانات قمة الرأس على ذاكرة الفيديو ، ويمكن لخط أنابيب الرسم تبادل البيانات بشكل أسرع بكثير مما يفعل من الذاكرة الرئيسية العادية ، لذلك من المتوقع أن يحسن سرعة الرسم.
في حالة مضلع واحد مثل هذا ، لا يمكنك أن تشعر أنك ترسم بسرعة عالية ، لكنني أعتقد أن التأثير مرئي عند رسم آلاف أو عشرات الآلاف من المضلعات.
ميدان
<summary>
頂点バッファ
</summary>
private VertexBuffer vertexBuffer = null;
لاستخدام مخزن مؤقت لقمة الرأس، استخدم الفئة "VertexBuffer". إذا تم إرسال بيانات الرأس المعرفة من قبل المستخدم إلى خط الأنابيب في كل مرة يتم سحبها ، فيجب الاحتفاظ ببيانات الرأس في جميع الأوقات ، ولكن إذا تم إنشاء مخزن مؤقت للقمة ، فإن المخزن المؤقت للقمة يدير بيانات الرأس ، لذلك ليست هناك حاجة للاحتفاظ ببيانات الرأس.
إنشاء مخزن مؤقت لقمة الرأس
// 頂点の数
int vertexCount = 3;
// 頂点バッファ作成
this.vertexBuffer = new VertexBuffer(this.GraphicsDevice,
typeof(VertexPositionColor), vertexCount, BufferUsage.None);
في أسلوب لودغرافيكسكونتينت، نقوم بإنشاء فيرتكسبوفير.
الوسيطة الأولى هي GraphicsDevice.
تحدد الوسيطة الثانية نوع البنية التي تحتوي على بيانات الرأس ، أو إعلان الرأس لبيانات الرأس المراد استخدامها. هنا ، يتم تمرير نوع في نوع الهيكل. نظرا لاستخدام "موضع الرأس" و "لون الرأس" لبيانات الرأس ، يتم تحديد بنية "VertexPositionColor" التي يوفرها إطار عمل XNA كمعيار.
تحدد الوسيطة الثالثة عدد الرؤوس المراد إنشاؤها.
تحدد الوسيطة الرابعة استخدام المخزن المؤقت للرأس ، ولكن إذا لم يكن هناك شيء على وجه الخصوص ، فيمكنك تحديد "BufferUsage.None".
VertexBuffer
منشئ
إنشاء مثيل للفئة "VertexBuffer" لإنشاء بيانات قمة الرأس.
الرسومياتالجهاز | الرسومياتالجهاز | يحدد GraphicsDevice لإقرانه بالمخزن المؤقت للرأس. |
نوع الرأس | نوع | يحدد نوع بيانات الرأس المراد استخدامها. |
فيرتكسكونت | الباحث | يحدد عدد الرؤوس المراد إنشاؤها. |
استخدام | التخزين المؤقت | يحدد استخدام المخزن المؤقت للرأس. إذا لم يكن هناك شيء على وجه الخصوص ، فحدد "BufferUsage.None". |
// 頂点データを作成する
VertexPositionColor[] pointList = new VertexPositionColor[vertexCount];
pointList[0] = new VertexPositionColor(new Vector3(0.0f, 3.0f, 0.0f), Color.Red);
pointList[1] = new VertexPositionColor(new Vector3(3.0f, -2.0f, 0.0f), Color.Blue);
pointList[2] = new VertexPositionColor(new Vector3(-3.0f, -2.0f, 0.0f), Color.Green);
// 頂点データを頂点バッファに書き込む
this.vertexBuffer.SetData(pointList);
بعد إنشاء المخزن المؤقت للقمة ، قم بتعيين المخزن المؤقت للقمة ببيانات الرأس. لتعيين بيانات قمة الرأس، استخدم الأسلوب "VertexBuffer.SetData".
بمجرد تعيين بيانات الرأس في المخزن المؤقت للقمة ، تتم إدارتها بواسطة المخزن المؤقت للقمة ، لذلك إذا لم تعد تستخدمها ، فيمكنك تجاهلها كما هي.
VertexBuffer.SetData
أسلوب
قم بتعيين بيانات الرأس في المخزن المؤقت للرأس.
T | نوع القيمة | يحدد بنية بيانات الرأس المراد استخدامها. |
بيانات | T[] | يحدد صفيف من بيانات الرأس ليتم ضبطه في المخزن المؤقت للرأس. يجب أن يتطابق الحجم المحدد في المخزن المؤقت للقمة مع حجم بيانات الرأس المراد تعيينها. |
رسم
// 描画に使用する頂点バッファをセットします
this.GraphicsDevice.SetVertexBuffer(this.vertexBuffer);
// パスの数だけ繰り返し描画
foreach (EffectPass pass in this.basicEffect.CurrentTechnique.Passes)
{
// パスの開始
pass.Apply();
// 三角形を描画する
this.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
}
لرسم مضلع ، قم بتعيين المخزن المؤقت للرأس لاستخدامه في الرسم. يحتوي GraphicsDevice على طريقة "SetVertexBuffer" التي تقوم بتعيين المخزن المؤقت للقمة إليه.
GraphicsDevice.SetVertexBuffer
أسلوب
يحدد المخزن المؤقت للرأس لاستخدامه في الرسم.
فيرتكس بوفير | فيرتكس بوفير | يحدد المخزن المؤقت للرأس لاستخدامه في الرسم. |
لرسم المضلعات الفعلية، استخدم الأسلوب "GraphicsDevice.DrawPrimitives". إذا كنت ترغب في استخدام مخزن مؤقت لقمة الرأس ، فسوف ترسمه بهذه الطريقة. على عكس طريقة DrawUserPrimitives ، التي تحدد بيانات النقطة المعرفة من قبل المستخدم كما هي ، يتم استخدام هذه الطريقة للرسم باستخدام مخزن مؤقت للرأس.
الوسيطة الأولى هي نوع البدائية المراد رسمها ، والوسيطة الثانية هي مؤشر الرأس لبدء الرسم ، والوسيطة الثالثة هي عدد الأوليات المراد رسمها.
GraphicsDevice.DrawPrimitives
أسلوب
يرسم بدائية باستخدام المخزن المؤقت قمة الرأس المحدد.
النوع البدائي | النوع البدائي | يحدد نوع البدائية المراد رسمها |
ستارت فيرتكس | الباحث | المؤشر الأول للقمة المراد تحميله |
العد البدائي | الباحث | عدد الأوليات لرسم |
جميع الرموز
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif
namespace VertexBufferTriangle
{
<summary>
ゲームメインクラス
</summary>
public class GameMain : Microsoft.Xna.Framework.Game
{
<summary>
グラフィックデバイス管理クラス
</summary>
private GraphicsDeviceManager graphics = null;
<summary>
スプライトのバッチ化クラス
</summary>
private SpriteBatch spriteBatch = null;
<summary>
頂点バッファ
</summary>
private VertexBuffer vertexBuffer = null;
<summary>
基本エフェクト
</summary>
private BasicEffect basicEffect = null;
<summary>
GameMain コンストラクタ
</summary>
public GameMain()
{
// グラフィックデバイス管理クラスの作成
this.graphics = new GraphicsDeviceManager(this);
// ゲームコンテンツのルートディレクトリを設定
this.Content.RootDirectory = "Content";
#if WINDOWS_PHONE
// Windows Phone のデフォルトのフレームレートは 30 FPS
this.TargetElapsedTime = TimeSpan.FromTicks(333333);
// バックバッファサイズの設定
this.graphics.PreferredBackBufferWidth = 480;
this.graphics.PreferredBackBufferHeight = 800;
// フルスクリーン表示
this.graphics.IsFullScreen = true;
#endif
}
<summary>
ゲームが始まる前の初期化処理を行うメソッド
グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
</summary>
protected override void Initialize()
{
// TODO: ここに初期化ロジックを書いてください
// コンポーネントの初期化などを行います
base.Initialize();
}
<summary>
ゲームが始まるときに一回だけ呼ばれ
すべてのゲームコンテンツを読み込みます
</summary>
protected override void LoadContent()
{
// テクスチャーを描画するためのスプライトバッチクラスを作成します
this.spriteBatch = new SpriteBatch(this.GraphicsDevice);
// エフェクトを作成
this.basicEffect = new BasicEffect(this.GraphicsDevice);
// エフェクトで頂点カラーを有効にする
this.basicEffect.VertexColorEnabled = true;
// ビューマトリックスをあらかじめ設定 ((0, 0, 15) から原点を見る)
this.basicEffect.View = Matrix.CreateLookAt(
new Vector3(0.0f, 0.0f, 15.0f),
Vector3.Zero,
Vector3.Up
);
// プロジェクションマトリックスをあらかじめ設定
this.basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45.0f),
(float)this.GraphicsDevice.Viewport.Width /
(float)this.GraphicsDevice.Viewport.Height,
1.0f,
100.0f
);
// 頂点の数
int vertexCount = 3;
// 頂点バッファ作成
this.vertexBuffer = new VertexBuffer(this.GraphicsDevice,
typeof(VertexPositionColor), vertexCount, BufferUsage.None);
// 頂点データを作成する
VertexPositionColor[] pointList = new VertexPositionColor[vertexCount];
pointList[0] = new VertexPositionColor(new Vector3(0.0f, 3.0f, 0.0f), Color.Red);
pointList[1] = new VertexPositionColor(new Vector3(3.0f, -2.0f, 0.0f), Color.Blue);
pointList[2] = new VertexPositionColor(new Vector3(-3.0f, -2.0f, 0.0f), Color.Green);
// 頂点データを頂点バッファに書き込む
this.vertexBuffer.SetData(pointList);
}
<summary>
ゲームが終了するときに一回だけ呼ばれ
すべてのゲームコンテンツをアンロードします
</summary>
protected override void UnloadContent()
{
// TODO: ContentManager で管理されていないコンテンツを
// ここでアンロードしてください
}
<summary>
描画以外のデータ更新等の処理を行うメソッド
主に入力処理、衝突判定などの物理計算、オーディオの再生など
</summary>
<param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
protected override void Update(GameTime gameTime)
{
// Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
// ゲームを終了させます
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
{
this.Exit();
}
// TODO: ここに更新処理を記述してください
// 登録された GameComponent を更新する
base.Update(gameTime);
}
<summary>
描画処理を行うメソッド
</summary>
<param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
protected override void Draw(GameTime gameTime)
{
// 画面を指定した色でクリアします
this.GraphicsDevice.Clear(Color.CornflowerBlue);
// 描画に使用する頂点バッファをセットします
this.GraphicsDevice.SetVertexBuffer(this.vertexBuffer);
// パスの数だけ繰り返し描画
foreach (EffectPass pass in this.basicEffect.CurrentTechnique.Passes)
{
// パスの開始
pass.Apply();
// 三角形を描画する
this.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
}
// 登録された DrawableGameComponent を描画する
base.Draw(gameTime);
}
}
}