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

Только 5 вершин из 6 уникальны в данном случае, а оставшаяся дублируется. Есть способ, как определить только уникальные вершины и построить оба треугольника по ним.

Изменим процедуру декларации вершин на следующую:

C#
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);
 }

С серединой данного метода у вас не должно возникнуть сложностей, если вы знакомы с предыдущими уроками. Первой строкой создается буффер вершин, который позже будет использован для связи с вершинами. Последней строкой мы передает вершины в буффер. Так же вам нужно будет создать переменную для буффера:

C#
1
 private VertexBuffer vb;

Вы сразу можете создать переменные для индекса вершин тут же:

C#
1
2
 private int[] indices;
 private IndexBuffer ib;

Теперь мы создаем метод определения индексов:

C#
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 метод:

C#
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();