Да, это возможно.Вам нужно будет использовать TriangleStrip в качестве PrimitiveType.В вашем VertexBuffer Вы определяете свои вершины в следующем порядке:
1---3
|\ |
| \ |
| \|
0---2
РЕДАКТИРОВАТЬ, чтобы адресовать Ваш измененный вопрос
Я не знаю, как выглядит Ваш код, но в целом информация о числе примитивовиспользуется в следующих местах:
- Создание буфера:
public VertexBuffer (
GraphicsDevice graphicsDevice,
int sizeInBytes,
BufferUsage usage
)
// sizeInBytes зависит от числа примитивов. - Вызов Draw:
public void DrawPrimitives (
PrimitiveType primitiveType,
int startVertex,
int primitiveCount
)
Обратите внимание, что информация о размере вашего формата вершин необходима еще в нескольких местах, но это не должно быть проблемой, поскольку размер не должен изменяться.
Обновление
Спасибо за разъяснение, теперь я знаю, чего Ты хочешь достичь.Правильный способ решить вашу проблему - использовать буфер вершин в сочетании с буфером индекса.Буфер вершин содержит вершины, индексный буфер содержит порядок, в котором соединяются вершины для формирования треугольников.Представьте, что вы хотите нарисовать следующий квад на вашем экране:
(0,1)________(1,1)
| |
| |
|________|
(0,0) (1,0)
То, что вы сделали раньше, было так:
Vector3 v0, v1, v2, v3;
v0 = new Vector3(0, 0, 0);
v1 = new Vector3(1, 0, 0);
v2 = new Vector3(0, 1, 0);
v3 = new Vector3(1, 1, 0);
List vertices = new List();
//first triangle
vertices.add(v0);
vertices.add(v2);
vertices.add(v1);
//second triangle
vertices.add(v2);
vertices.add(v1);
vertices.add(v3);
VertexBuffer vb = new VertexBuffer(...);
vb.setData(verticesToDraw);
//draw the scene using PrimitiveType.TriangleList and primitive count 2
То, что вы делаете сейчас, это:
//vertices stay the same as in the example above!
List vertices = new List();
vertices.add(v0);
vertices.add(v1);
vertices.add(v2);
vertices.add(v3);
int[] indices = new int[6];
//first triangle
indices[0] = 0;
indices[1] = 2;
indices[2] = 1;
//second triangle
indices[3] = 2;
indices[4] = 1;
indices[5] = 3;
VertexBuffer vb = new VertexBuffer(...);
IndexBuffer ib = new IndexBuffer(...);
vb.setData(vertices);
ib.setData(indices);
/*draw using the DrawIndexedPrimitives() method rather than the
DrawPrimitives() method and use PrimitiveType.TriangleList and
primitive count 2.*/
Видите ли, вы сохраняете 2 вершины на каждый квад, но вместо этого должны использовать 6 индексов, которые определяют порядок, в котором строится треугольник из вершин.Так что этот метод полезен, только если у вас большие вершины (много информации, например, нормали, координаты текстуры и т. Д.), И они разделены многими треугольниками.
Riemers.net имеет очень хороший, короткийи простой в понимании учебник по вершинным и индексным буферам.