Trigonális sokszög rajzolása csúcspontpuffer használatával
összefoglalás
A csúcspontpufferek használatával a sokszögek gyorsan rajzolhatók.
Működési környezet
Előfeltételek
Támogatott XNA verziók |
|
Támogatott platformok |
|
Windows Szükséges Vertex Shader verzió | 2.0 |
Windows Szükséges Pixel Shader verzió | 2.0 |
Működési környezet
peron |
|
lényeg
Amikor sokszöget rajzol, azt úgynevezett "csúcspontpuffer" segítségével rajzolhatja meg. A csúcspontpuffer kitölthető csúcspontadatokkal, amelyeket primitívek, például sokszögek rajzolásakor lehet használni. A csúcspontpuffer lehetővé teszi a csúcspontadatok videomemóriába helyezését, és a rajzolási csővezeték sokkal gyorsabban tud adatokat cserélni, mint a normál fő memóriából, így várhatóan javítja a rajzolási sebességet.
Egyetlen sokszög esetében, mint ez, nem érezheti, hogy nagy sebességgel rajzol, de úgy gondolom, hogy a hatás több ezer vagy tízezer sokszög rajzolásakor látható.
mező
<summary>
頂点バッファ
</summary>
private VertexBuffer vertexBuffer = null;
Csúcspontpuffer használatához használja a "VertexBuffer" osztályt. Ha a felhasználó által definiált csúcspontadatokat minden alkalommal elküldték a csővezetéknek, akkor a csúcspontadatokat mindig meg kellett őrizni, de ha csúcspontpuffer jött létre, akkor a csúcspontpuffer kezeli a csúcspontadatokat, így nincs szükség a csúcspontadatok megőrzésére.
Csúcspontpuffer létrehozása
// 頂点の数
int vertexCount = 3;
// 頂点バッファ作成
this.vertexBuffer = new VertexBuffer(this.GraphicsDevice,
typeof(VertexPositionColor), vertexCount, BufferUsage.None);
A LoadGraphicsContent metódusban létrehozunk egy VertexBuffert.
Az első argumentum egy GraphicsDevice.
A második argumentum határozza meg a csúcspontadatokat tartalmazó műtárgy típusát vagy a használni kívánt csúcspontadatok csúcspontdeklarációját. Itt typeof a szerkezet típusában kerül átadásra. Mivel a csúcspontadatokhoz a "csúcspontpozíció" és a "csúcspont színe" használatos, az XNA keretrendszer által biztosított "VertexPositionColor" struktúra szabványként van megadva.
A harmadik argumentum a létrehozandó csúcspontok számát adja meg.
A negyedik argumentum a csúcspontpuffer-használatot adja meg, de ha nincs semmi különös, megadhatja a "BufferUsage.None" értéket.
VertexBuffer
Konstruktor
Hozzon létre egy "VertexBuffer" osztálypéldányt csúcspontadatok létrehozásához.
grafikaEszköz | GrafikaEszköz | Megadja a csúcspontpufferhez társítandó GraphicsDevice eszközt. |
csúcspont típusa | Típus | Megadja a használni kívánt csúcspontadatok típusát. |
vertexCount | Int | A létrehozandó csúcspontok számát adja meg. |
használat | Pufferhasználat | A csúcspontpuffer használatát adja meg. Ha nincs semmi különös, adja meg a "BufferUsage.None" értéket. |
// 頂点データを作成する
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);
A csúcspontpuffer létrehozása után állítsa be a csúcspontpuffert csúcspontadatokkal. A csúcspontadatok beállításához használja a "VertexBuffer.SetData" metódust.
Miután a csúcspontadatokat beállította a csúcspontpufferben, azokat a csúcspontpuffer kezeli, így ha már nem használja, elvetheti őket úgy, ahogy van.
VertexBuffer.SetData
módszer
Állítsa be a csúcspont adatait a csúcspont pufferében.
T | ValueType | Megadja a használni kívánt csúcspontadatok szerkezetét. |
adat | T[] | Megadja a csúcspontpufferben beállítandó csúcspontadatok tömbjét. A csúcspontpufferben megadott méretnek meg kell egyeznie a beállítandó csúcspontadatok méretével. |
rajz
// 描画に使用する頂点バッファをセットします
this.GraphicsDevice.SetVertexBuffer(this.vertexBuffer);
// パスの数だけ繰り返し描画
foreach (EffectPass pass in this.basicEffect.CurrentTechnique.Passes)
{
// パスの開始
pass.Apply();
// 三角形を描画する
this.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
}
Sokszög rajzolásához állítsa be a rajzoláshoz használni kívánt töréspontpuffert. A GraphicsDevice rendelkezik egy "SetVertexBuffer" metódussal, amely beállítja a csúcspontpuffert.
GraphicsDevice.SetVertexBuffer
módszer
Megadja a rajzoláshoz használandó töréspontpuffert.
vertexBuffer | VertexBuffer | Megadja a rajzoláshoz használandó töréspontpuffert. |
A tényleges sokszögek rajzolásához használja a "GraphicsDevice.DrawPrimitives" módszert. Ha csúcspontpuffert szeretne használni, akkor ezzel a módszerrel fogja megrajzolni. A DrawUserPrimitives metódustól eltérően, amely a felhasználó által definiált pontadatokat adja meg, ez a módszer csúcspontpuffer használatával történő rajzolásra szolgál.
Az első argumentum a rajzolandó primitív típusa, a második argumentum a rajzolás megkezdéséhez használt csúcsindex, a harmadik argumentum pedig a rajzolandó primitívek száma.
GraphicsDevice.DrawPrimitives
módszer
Primitívet rajzol a megadott csúcspontpuffer használatával.
primitiveType | PrimitiveType | Megadja a rajzolandó primitív típusát |
startVertex | Int | A csúcspont első betöltendő indexe |
primitiveCount | Int | A rajzolandó primitívek száma |
Minden kód
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);
}
}
}