В прошлых главах мы разобрали работу с минимальной единицей 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 ( ) ;