New Page 2
Пишем компьютерную игру на
C#. Урок 5. Немного поизгаляемся с VertexBuffer.
Исходники к уроку вы можете скачать
здесь.
На
прошлом уроке
мы пробовали рисовать треугольники при помощи класса VertexBuffer.Сегодня изучим
этот класс более подробно. Попробуем для начала нарисовать не один, а два
треугольника. И так, открываем исходники
прошлого урока. Переписываем процедуру OnCreateDevice:
public void
OnCreateDevice(object sender,
EventArgs e)
{
//создаем
буфер
для
вершин
треугольника
vertexBuffer = new
VertexBuffer(
typeof(CustomVertex.TransformedColored),
6,
device,
0,
CustomVertex.TransformedColored.Format,
Pool.Default);
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer,null);
} |
Изменения я выделил оранжевым цветом. Как видим, изменился
только один параметр, указываем в конструкторе VertexBuffer - это количество
вершин отображаемой фигуры (фигур).
Теперь переделаем процедуру создание фигуры (фигур):
public void
OnCreateVertexBuffer(object sender,
EventArgs e)
{
GraphicsStream graphicsStream
= vertexBuffer.Lock(0, 0, 0);
CustomVertex.TransformedColored[]
vertex = new
CustomVertex.TransformedColored[6];
//вершина
0
vertex[0].X = 30;
vertex[0].Y = 30;
vertex[0].Z = 0.5f;
vertex[0].Rhw = 1;
vertex[0].Color = System.Drawing.Color.Black.ToArgb();
//вершина
1
vertex[1].X = 130;
vertex[1].Y = 30;
vertex[1].Z = 0.5f;
vertex[1].Rhw = 1;
vertex[1].Color = System.Drawing.Color.LightPink.ToArgb();
//вершина
2
vertex[2].X = 80;
vertex[2].Y = 130;
vertex[2].Z = 0.5f;
vertex[2].Rhw = 1;
vertex[2].Color = System.Drawing.Color.Red.ToArgb();
//вершина
0
vertex[3].X = 85;
vertex[3].Y = 130;
vertex[3].Z = 0.5f;
vertex[3].Rhw = 1;
vertex[3].Color = System.Drawing.Color.DeepSkyBlue.ToArgb();
//вершина
1
vertex[4].X = 230;
vertex[4].Y = 30;
vertex[4].Z = 0.5f;
vertex[4].Rhw = 1;
vertex[4].Color = System.Drawing.Color.LightPink.ToArgb();
//вершина
2
vertex[5].X = 130;
vertex[5].Y = 230;
vertex[5].Z = 0.5f;
vertex[5].Rhw = 1;
vertex[5].Color = System.Drawing.Color.Red.ToArgb();
//вывод
графической
фигуры
graphicsStream.Write(vertex);
vertexBuffer.Unlock();
} |
Ну, и собственно, сам рендеринг (тоже изменения минимальные,
выделено оранжевым):
public void
rendering()
{
if (device ==
null) return;
//очищает и заливает белым цветом устройство
(форму)
device.Clear(ClearFlags.Target,
System.Drawing.Color.White, 1.0f, 0);
//выводим
сцену
device.BeginScene();
device.SetStreamSource(0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleList,
0, 2);
device.EndScene();
device.Present();
} |
Изменили параметр вызова процедуры DrawPrimitives - вместо
одного примитива поставили два. Все, запускаем программу на исполнение:
Теперь поэкспериментируем с первым параметром DrawPrimitives
- типом примитива. Попробуем сделать, например, ленту треугольников:
public void
rendering()
{
if (device ==
null) return;
//очищает и заливает белым цветом устройство
(форму)
device.Clear(ClearFlags.Target,
System.Drawing.Color.White, 1.0f, 0);
//выводим
сцену
device.BeginScene();
device.SetStreamSource(0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleStrip,
0, 3);
device.EndScene();
device.Present();
} |
На этот раз у нас будет три фигуры: связанные в ленту
треугольники. Вершин будет 5, так что подправьте вызов конструктора VertexBuffer
в OnCreateDevice:
public void
OnCreateDevice(object sender,
EventArgs e)
{
//создаем
буфер
для
вершин
треугольника
vertexBuffer = new
VertexBuffer(
typeof(CustomVertex.TransformedColored),
5,
device,
0,
CustomVertex.TransformedColored.Format,
Pool.Default);
vertexBuffer.Created += new
System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer,null);
} |
И саму процедуру заполнения вершин:
public void
OnCreateVertexBuffer(object sender,
EventArgs e)
{
GraphicsStream graphicsStream
= vertexBuffer.Lock(0, 0, 0);
CustomVertex.TransformedColored[]
vertex = new
CustomVertex.TransformedColored[5];
//вершина
0
vertex[0].X = 30;
vertex[0].Y = 30;
vertex[0].Z = 0.5f;
vertex[0].Rhw = 1;
vertex[0].Color = System.Drawing.Color.Black.ToArgb();
//вершина
1
vertex[1].X = 130;
vertex[1].Y = 30;
vertex[1].Z = 0.5f;
vertex[1].Rhw = 1;
vertex[1].Color = System.Drawing.Color.LightPink.ToArgb();
//вершина
2
vertex[2].X = 80;
vertex[2].Y = 130;
vertex[2].Z = 0.5f;
vertex[2].Rhw = 1;
vertex[2].Color = System.Drawing.Color.Red.ToArgb();
//вершина
0
vertex[3].X = 185;
vertex[3].Y = 100;
vertex[3].Z = 0.5f;
vertex[3].Rhw = 1;
vertex[3].Color = System.Drawing.Color.DeepSkyBlue.ToArgb();
//вершина
1
vertex[4].X = 200;
vertex[4].Y = 180;
vertex[4].Z = 0.5f;
vertex[4].Rhw = 1;
vertex[4].Color = System.Drawing.Color.LightPink.ToArgb();
//вывод
графической
фигуры
graphicsStream.Write(vertex);
vertexBuffer.Unlock();
} |
И вот у нас рисуется лента из треугольников:
Скриншоты, приведенные в данной статье,
являются цитатами и иллюстрациями программного
продукта "Microsoft Visual Studio 2010", авторское право на
который принадлежит Microsoft.
|