· Гостей: 2
· Пользователей: 0
· Всего пользователей: 7,142
· Новый пользователь: Sarahseato
|
|
|
Урок 3. Как рисовать простые 3D-объекты с помощью BasicEffect |
|
Генерация массива вершин и рисование на его основе 3D-объекта с помощью BasicEffect. Перед изучением данного урока вам нужно ознакомиться со следующими уроками:
Шаг 1. Добавьте в класс Program новые поля для массива вершин, описания формата вершин и для базового эффекта.
class Program : Game { // графический компонент GraphicsDeviceManager graphics; // массив вершин VertexPositionColor[] vertexList; // описание формата вершин VertexDeclaration vertexDeclaration; // эффект BasicEffect BasicEffect effect; ...
Шаг 2. Добавьте в метод LoadContent() код создания массива вершин и заполнения его тремя вершинами. Вершины будут иметь типVertexPositionColor. В этом типе вершин можно задать позицию и цвет каждой вершины - их мы указываем в конструкторе при создании объектов вершин.
protected override void LoadContent() { // создать массив-контейнер для хранения трёх вершин vertexList = new VertexPositionColor[3]; // создать в массиве вершин три вершины типа VertexPositionColor описывающих 3D-треугольник vertexList[0] = new VertexPositionColor(new Vector3(0, 0.5f, 0), Color.Gray); vertexList[1] = new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0), Color.Gray); vertexList[2] = new VertexPositionColor(new Vector3(0.5f, -0.5f, 0), Color.Gray); }
Шаг 3. Добавьте в метод LoadContent() код создающий объект-описание формата вершин которые мы используем для рисования.
protected override void LoadContent() { // создать массив-контейнер для хранения трёх вершин vertexList = new VertexPositionColor[3]; // создать в массиве вершин три вершины типа VertexPositionColor // описывающих 3D-треугольник vertexList[0] = new VertexPositionColor(new Vector3(0, 0.5f, 0), Color.Gray); vertexList[1] = new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0), Color.Gray); vertexList[2] = new VertexPositionColor(new Vector3(0.5f, -0.5f, 0), Color.Gray); // создать описание формата вершин vertexDeclaration = new VertexDeclaration( graphics.GraphicsDevice, VertexPositionColor.VertexElements); }
Шаг 4. Добавьте в метод LoadContent() код создающий объект класса BasicEffect. Объекты данного класса содержат в себе код простого шейдера что избавляет нас от необходимости писать свой шейдер руками.
protected override void LoadContent() { // создать массив-контейнер для хранения трёх вершин vertexList = new VertexPositionColor[3]; // создать в массиве вершин три вершины типа VertexPositionColor //описывающих 3D-треугольник vertexList[0] = new VertexPositionColor(new Vector3(0, 0.5f, 0), Color.Gray); vertexList[1] = new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0), Color.Gray); vertexList[2] = new VertexPositionColor(new Vector3(0.5f, -0.5f, 0), Color.Gray); // создать описание формата вершин vertexDeclaration = new VertexDeclaration( graphics.GraphicsDevice, VertexPositionColor.VertexElements); // создать эффект BasicEffect effect = new BasicEffect(graphics.GraphicsDevice, null); }
Шаг 5. В метод Draw() нужно добавить код рисования треугольника. Этот код начинается с "включения" эффекта и его первого прохода.
protected override void Draw(GameTime gameTime) { // отчистка экрана в синий цвет graphics.GraphicsDevice.Clear(Color.Blue); // использовать для отрисовки эффект BasicEffect effect.Begin(); // начать отрисовку первого прохода effect.CurrentTechnique.Passes[0].Begin(); // вывод сцены на экран base.Draw(gameTime); }
Шаг 6. В методе Draw() после "включения" эффекта укажите описание формата вершин которые будут выводиться на экран и отключите отсечение невидимых поверхностей - мы хотим видеть треугольник всегда не зависимо от того какой стороной он повернётся к экрану.
protected override void Draw(GameTime gameTime) { // отчистка экрана в синий цвет graphics.GraphicsDevice.Clear(Color.Blue); // использовать для отрисовки эффект BasicEffect effect.Begin(); // начать отрисовку первого прохода effect.CurrentTechnique.Passes[0].Begin(); // указать описание формата вершин graphics.GraphicsDevice.VertexDeclaration = vertexDeclaration; // отключить отсечение невидимых поверхностей graphics.GraphicsDevice.RenderState.CullMode = CullMode.None; // вывод сцены на экран base.Draw(gameTime); }
Шаг 7. И наконец вызовом метода DrawUserPrimitives() мы рисуем треугольник используя массив вершин.
protected override void Draw(GameTime gameTime) { // отчистка экрана в синий цвет graphics.GraphicsDevice.Clear(Color.Blue); // использовать для отрисовки эффект BasicEffect effect.Begin(); // начать отрисовку первого прохода effect.CurrentTechnique.Passes[0].Begin(); // указать описание формата вершин graphics.GraphicsDevice.VertexDeclaration = vertexDeclaration; // отключить отсечение невидимых поверхностей graphics.GraphicsDevice.RenderState.CullMode = CullMode.None; // нарисовать треугольник используя массив вершин graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor> (PrimitiveType.TriangleList, vertexList, 0, 1); // вывод сцены на экран base.Draw(gameTime); }
Шаг 8. После отрисовки треугольника мы должны "выключить" эффект.
protected override void Draw(GameTime gameTime) { // отчистка экрана в синий цвет graphics.GraphicsDevice.Clear(Color.Blue); // использовать для отрисовки эффект BasicEffect effect.Begin(); // начать отрисовку первого прохода effect.CurrentTechnique.Passes[0].Begin(); // указать описание формата вершин graphics.GraphicsDevice.VertexDeclaration = vertexDeclaration; // отключить отсечение невидимых поверхностей graphics.GraphicsDevice.RenderState.CullMode = CullMode.None; // нарисовать треугольник используя массив вершин graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor> (PrimitiveType.TriangleList, vertexList, 0, 1); // завершить первый проход effect.CurrentTechnique.Passes[0].End(); // завершить использование эффекта BasicEffect effect.End(); // вывод сцены на экран base.Draw(gameTime); }
Теперь при запуске приложения мы увидим пустое окно в котором будет нарисован треугольник.
В секции загрузок лежит архив с исходным кодом этого и других уроков.
|
Пожалуйста, залогиньтесь для добавления комментария.
|
|
|
Забыли пароль? Запросите новый здесь.
|
Вы должны авторизироваться, чтобы добавить сообщение.
|
|