.
Пишем компьютерную игру на C#. Урок 5. Немного поизгаляемся с VertexBuffer.
Автор megabax   
08.10.2011 г.
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 - вместо одного примитива поставили два. Все, запускаем программу на исполнение:

Пишем компьютерную игру на C#. Урок 5. Немного поизгаляемся с VertexBuffer.

Теперь поэкспериментируем с первым параметром 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();

        }

И вот у нас рисуется лента из треугольников:

Пишем компьютерную игру на C#. Урок 5. Немного поизгаляемся с VertexBuffer.


Скриншоты, приведенные в данной статье, являются цитатами и иллюстрациями   программного продукта "Microsoft Visual Studio 2010", авторское право на который принадлежит Microsoft


 

 

Последнее обновление ( 07.11.2011 г. )