Обработка вершин методом индексов
В прошлых главах мы разобрали работу с минимальной единицей 3D графики – треугольником. В этой главе мы рассмотрим работу сразу с несколькими треугольниками. Для каждого из них вам необходимо определить 3 вершины:

Только 5 вершин из 6 уникальны в данном случае, а оставшаяся дублируется. Есть способ, как определить только уникальные вершины и построить оба треугольника по ним.
Изменим процедуру декларации вершин на следующую:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void VertexDeclaration()
{
vb = new VertexBuffer(typeof(CustomVertex.PositionColored), 5, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
vertices = new CustomVertex.PositionColored[5];
vertices[0].Position = new Vector3(0f, 0f, 0f);
vertices[0].Color = Color.White.ToArgb();
vertices[1].Position = new Vector3(5f, 0f, 0f);
vertices[1].Color = Color.White.ToArgb();
vertices[2].Position = new Vector3(10f, 0f, 0f);
vertices[2].Color = Color.White.ToArgb();
vertices[3].Position = new Vector3(5f, 5f, 0f);
vertices[3].Color = Color.White.ToArgb();
vertices[4].Position = new Vector3(10f, 5f, 0f);
vertices[4].Color = Color.White.ToArgb();
vb.SetData(vertices, 0 ,LockFlags.None);
} |
С серединой данного метода у вас не должно возникнуть сложностей, если вы знакомы с предыдущими уроками. Первой строкой создается буффер вершин, который позже будет использован для связи с вершинами. Последней строкой мы передает вершины в буффер. Так же вам нужно будет создать переменную для буффера:
|
1 |
private VertexBuffer vb; |
Вы сразу можете создать переменные для индекса вершин тут же:
|
1 2 |
private int[] indices;
private IndexBuffer ib; |
Теперь мы создаем метод определения индексов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void IndicesDeclaration()
{
ib = new IndexBuffer(typeof(int), 6, device, Usage.WriteOnly, Pool.Default);
indices = new int[6];
indices[0]=3;
indices[1]=1;
indices[2]=0;
indices[3]=4;
indices[4]=2;
indices[5]=1;
ib.SetData(indices, 0, LockFlags.None);
} |
Как вы видите вершина №1 использована дважды и нам потребовалось только 5 вершин для задания 2-х треугольников. В данном случае экономия минимальна, но в настоящих, не учебных, приложениях выгода от использования этого метода ощутима. Не забудьте вызвать исполнение этого метода при запуске программы.
Для завершения этой главы необходимо немного изменить OnPaint метод:
|
1 2 3 4 5 6 7 8 9 |
device.BeginScene();
device.VertexFormat = CustomVertex.PositionColored.Format;
device.SetStreamSource(0, vb, 0);
device.Indices = ib;
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 5, 0, 2);
device.EndScene(); |