Desenhe um polígono trigonal usando um buffer de vértice
resumo
Usando buffers de vértice, os polígonos podem ser desenhados rapidamente.
Ambiente operacional
Pré-requisitos
Versões do XNA suportadas |
|
Plataformas suportadas |
|
Versão do sombreador de vértice necessária para Windows | 2.0 |
Versão do sombreador de pixel necessária para Windows | 2.0 |
Ambiente operacional
plataforma |
|
substância
Ao desenhar um polígono, você pode desenhá-lo usando algo chamado "buffer de vértice". O buffer de vértice pode ser preenchido com dados de vértice a serem usados ao desenhar primitivos, como polígonos. O buffer de vértice permite que os dados de vértice sejam colocados na memória de vídeo, e o pipeline de desenho pode trocar dados muito mais rápido do que na memória principal normal, portanto, pode-se esperar que melhore a velocidade de desenho.
No caso de um único polígono como este, você não pode sentir que está desenhando em alta velocidade, mas acho que o efeito é visível ao desenhar milhares ou dezenas de milhares de polígonos.
campo
<summary>
頂点バッファ
</summary>
private VertexBuffer vertexBuffer = null;
Para usar um buffer de vértice, use a classe "VertexBuffer". Se os dados de vértice definidos pelo usuário fossem enviados para o pipeline toda vez que fossem desenhados, os dados de vértice teriam que ser mantidos o tempo todo, mas se um buffer de vértice fosse criado, o buffer de vértice gerenciaria os dados de vértice, portanto, não há necessidade de manter os dados de vértice.
Criando um buffer de vértice
// 頂点の数
int vertexCount = 3;
// 頂点バッファ作成
this.vertexBuffer = new VertexBuffer(this.GraphicsDevice,
typeof(VertexPositionColor), vertexCount, BufferUsage.None);
No método LoadGraphicsContent, estamos criando um VertexBuffer.
O primeiro argumento é um GraphicsDevice.
O segundo argumento especifica o tipo de estrutura que contém os dados de vértice ou a declaração de vértice dos dados de vértice a serem usados. Aqui, typeof é passado no tipo da estrutura. Como "posição do vértice" e "cor do vértice" são usadas para dados de vértice, a estrutura "VertexPositionColor" fornecida pela estrutura XNA é especificada como padrão.
O terceiro argumento especifica o número de vértices a serem criados.
O quarto argumento especifica o uso do buffer de vértice, mas se não houver nada em particular, você poderá especificar "BufferUsage.None".
VertexBuffer
construtor
Crie uma instância da classe "VertexBuffer" para criar dados de vértice.
Placa gráficapara dispositivos | Dispositivo gráfico | Especifica o GraphicsDevice a ser associado ao buffer de vértice. |
tipo vértice | Tipo | Especifica o tipo de dados de vértice a serem usados. |
vertexCount | int | Especifica o número de vértices a serem criados. |
uso | Uso do Buffer | Especifica o uso do buffer de vértice. Se não houver nada em particular, especifique "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);
Depois de criar o buffer de vértice, defina o buffer de vértice com dados de vértice. Para definir dados de vértice, use o método "VertexBuffer.SetData".
Depois que os dados de vértice são definidos no buffer de vértice, eles são gerenciados pelo buffer de vértice, portanto, se você não usá-lo mais, poderá descartá-lo como está.
VertexBuffer.SetData
método
Defina os dados de vértice no buffer de vértice.
T | Tipo de valor | Especifica a estrutura dos dados de vértice a serem usados. |
dados | T[] | Especifica uma matriz de dados de vértice a ser definida no buffer de vértice. O tamanho especificado no buffer de vértice deve corresponder ao tamanho dos dados de vértice a serem definidos. |
desenho
// 描画に使用する頂点バッファをセットします
this.GraphicsDevice.SetVertexBuffer(this.vertexBuffer);
// パスの数だけ繰り返し描画
foreach (EffectPass pass in this.basicEffect.CurrentTechnique.Passes)
{
// パスの開始
pass.Apply();
// 三角形を描画する
this.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
}
Para desenhar um polígono, defina o buffer de vértice a ser usado para desenhar. O GraphicsDevice tem um método "SetVertexBuffer" que define o buffer de vértice para ele.
GraphicsDevice.SetVertexBuffer
método
Especifica o buffer de vértice a ser usado para desenho.
vertexBuffer | VertexBuffer | Especifica o buffer de vértice a ser usado para desenho. |
Para desenhar os polígonos reais, use o método "GraphicsDevice.DrawPrimitives". Se você quiser usar um buffer de vértice, desenhá-lo com este método. Ao contrário do método DrawUserPrimitives, que especifica os dados de ponto definidos pelo usuário como estão, esse método é usado para desenhar usando um buffer de vértice.
O primeiro argumento é o tipo de primitivo a ser desenhado, o segundo argumento é o índice de vértice a ser desenhado e o terceiro argumento é o número de primitivos a serem desenhados.
GraphicsDevice.DrawPrimitives
método
Desenha um primitivo usando o buffer de vértice especificado.
tipo primitivo | Tipo primitivo | Especifica o tipo de primitivo a ser desenhado |
startVertex | int | O primeiro índice do vértice a ser carregado |
primitiveCount | int | Número de primitivas a serem desenhadas |
Todos os códigos
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);
}
}
}