Начертайте тригонален многоъгълник с помощта на върхов буфер
резюме
С помощта на върхови буфери полигоните могат да бъдат начертани бързо.
Работна среда
Предпоставки
Поддържани версии на XNA |
|
Поддържани платформи |
|
Необходима версия на Vertex Shader за Windows | 2.0 |
Необходима версия на пикселния шейдър за Windows | 2.0 |
Работна среда
платформа |
|
вещество
Когато начертаете многоъгълник, можете да го начертаете с помощта на нещо, наречено "буфер на върхове". Върховият буфер може да бъде запълнен с върхови данни, които да се използват при чертане на примитиви като многоъгълници. Върховият буфер позволява данните от върховете да бъдат поставени във видео паметта и чертожният тръбопровод може да обменя данни много по-бързо, отколкото от нормалната основна памет, така че може да се очаква да подобри скоростта на чертане.
В случай на един многоъгълник като този, не можете да почувствате, че рисувате с висока скорост, но мисля, че ефектът е видим, когато рисувате хиляди или десетки хиляди многоъгълници.
поле
<summary>
頂点バッファ
</summary>
private VertexBuffer vertexBuffer = null;
За да използвате върхов буфер, използвайте класа "VertexBuffer". Ако дефинираните от потребителя върхови данни се изпращат до конвейера всеки път, когато са начертани, данните за върховете трябва да се съхраняват през цялото време, но ако е създаден върхов буфер, върховият буфер управлява данните за върховете, така че няма нужда да се съхраняват данните за върховете.
Създаване на върхов буфер
// 頂点の数
int vertexCount = 3;
// 頂点バッファ作成
this.vertexBuffer = new VertexBuffer(this.GraphicsDevice,
typeof(VertexPositionColor), vertexCount, BufferUsage.None);
В метода LoadGraphicsContent създаваме VertexBuffer.
Първият аргумент е GraphicsDevice.
Вторият аргумент определя типа структура, която съдържа данните за върха, или декларацията на върха на данните от върха, които ще се използват. Тук типът се предава в типа на конструкцията. Тъй като "позиция на върха" и "цвят на върха" се използват за данни за върхове, структурата "VertexPositionColor", предоставена от XNA Framework, е посочена като стандарт.
Третият аргумент определя броя на върховете, които трябва да се създадат.
Четвъртият аргумент определя използването на върховия буфер, но ако няма нищо конкретно, можете да посочите "BufferUsage.None".
VertexBuffer
Конструктор
Създайте екземпляр на класа "VertexBuffer" за създаване на върхови данни.
графикаУстройство | Графично устройство | Указва GraphicsDevice, който да се свърже с буфера на върховете. |
vertexType | Вид | Указва типа данни за върхове, които да се използват. |
vertexCount | int | Указва броя на върховете за създаване. |
Използване | Използване на буфера | Указва използването на буфера на върховете. Ако няма нищо конкретно, посочете "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
метод
Указва върховия буфер, който да се използва за рисуване.
vertexBuffer | VertexBuffer | Указва върховия буфер, който да се използва за рисуване. |
За да начертаете действителните полигони, използвайте метода "GraphicsDevice.DrawPrimitives". Ако искате да използвате върхов буфер, ще го начертаете с този метод. За разлика от метода DrawUserPrimitives, който определя дефинираните от потребителя точкови данни такива, каквито са, този метод се използва за рисуване с помощта на върхов буфер.
Първият аргумент е типът примитив за рисуване, вторият аргумент е индексът на върха, за да започнете да рисувате, а третият аргумент е броят на примитивите, които трябва да се начертаят.
GraphicsDevice.DrawPrimitives
метод
Чертае примитив с помощта на зададения буфер на върховете.
primitiveType | Примитивен тип | Указва типа примитив за рисуване |
startVertex | int | Първият индекс на върха за зареждане |
primitiveCount | int | Брой примитиви за рисуване |
Всички кодове
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);
}
}
}