
- •Содержание
- •Очистка буферов графического устройства
- •Избирательная очистка буферов
- •Устранение скрытых дефектов приложения
- •Общие сведения о примитивах
- •Введение в hlsl
- •Типы данных hlsl
- •Функции и семантики hlsl
- •Техники, проходы и профили hlsl
- •IncludeHandler – объект, используемый для обработки директив #include в fx-файле. Так как наш файл не содержит директив #include, мы будем использовать значение null
- •Визуализация объекта, использующего эффект
- •Запускающее приложение
Визуализация объекта, использующего эффект
Визуализация примитивов, использующих эффект, начинается с вызова метода effect.Begin() объекта эффекта. Далее приложение должно перебрать все проходы текущей техники (коллекцияeffect.CurrentTechnique.Passes ) и вызвать метод pass.Begin() для каждого прохода. Внутри прохода нужно визуализировать примитивы с использованием метода device.DrawUserPrimitives(). Визуализацию прохода нужно закончить вызовом метода pass.End(). По окончанию визуализации всего эффекта приложение должно вызвать метод effect.End().
Через контекстное меню перейдите в режим View Designer формы, выделите на ней объект xnaPanel1 и откройте панель Properties в режиме Events
Найдите событие Paint объекта xnaPanel1 и двойным щелчком на его поле справа создайте обработчик, который заполните так
private void xnaPanel1_Paint(object sender, PaintEventArgs e)
{
if (closing)
return;
try
{
if (device.GraphicsDeviceStatus == GraphicsDeviceStatus.Lost)
throw new DeviceLostException();
if (device.GraphicsDeviceStatus == GraphicsDeviceStatus.NotReset)
device.Reset(presentParams);
// Очищаем область экрана
device.Clear(XNAGraphics.Color.CornflowerBlue);
device.RenderState.CullMode = CullMode.None;
device.VertexDeclaration = decl;
// Задаем координаты вершин из установленного в группе панелей цвета
vertices[0] = new VertexPositionColor(new Vector3(0.0f, 0.8f, 0.0f), new XNAGraphics.Color(
vertex1Color.BackColor.R, vertex1Color.BackColor.G, vertex1Color.BackColor.B));
vertices[1] = new VertexPositionColor(new Vector3(0.8f, -0.8f, 0.0f), new XNAGraphics.Color(
vertex2Color.BackColor.R, vertex2Color.BackColor.G, vertex2Color.BackColor.B));
vertices[2] = new VertexPositionColor(new Vector3(-0.8f, -0.8f, 0.0f), new XNAGraphics.Color(
vertex3Color.BackColor.R, vertex3Color.BackColor.G, vertex3Color.BackColor.B));
effect.Begin();
foreach(EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin();
device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length / 3);
pass.End();
}
effect.End();
device.Present();
}
catch (DeviceNotResetException)
{
Invalidate();
}
catch (DeviceLostException)
{
closing = true; // Больше не выполнять OnPaint()
string title = "Сбой графического устройства";
string message = "Работа программы будет завершена.\n"
+ "Закройте все ненужные программы\n"
+ "и повторите запуск этого приложения";
MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Stop);
Application.Idle += new EventHandler(Application_Idle);
return;
}
catch (Exception ext) // Все другие исключения
{
closing = true;
MessageBox.Show(ext.Message);
Application.Idle += Application_Idle;
}
}
Выделите на форме объект xnaPanel1 и через панель Properties в режиме Events создайте обработчик события Resize, который заполните так
private void xnaPanel1_Resize(object sender, EventArgs e)
{
// Устанавливаем размеры заднего буфера по клиентской области панели
presentParams.BackBufferWidth = xnaPanel1.ClientSize.Width;
presentParams.BackBufferHeight = xnaPanel1.ClientSize.Height;
// Сбрасываем устройство и применяем к нему новые параметры
// Если окно не минимизировано
if (this.WindowState != FormWindowState.Minimized)
device.Reset(presentParams);
}
Выделите саму форму щелчком на ее заголовке и через панель Properties в режиме Events создайте обработчик события FormClosed, который заполните так
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
// Удаляем (освобождаем) устройство
device.Dispose();
// На всякий случай присваиваем ссылке на устройство значение null
device = null;
}
Осторожно (чтобы не создать обработчик) выделите все три кнопки на форме (удерживая клавишу Ctrl ) и через панель Properties в режимеEvents создайте обработчик события Click с именем vertexColor_Click, который заполните так
private void vertexColor_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
colorDialog1.Color = button.BackColor;
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
button.BackColor = colorDialog1.Color;
xnaPanel1.Invalidate();
}
}
В панели Solution Explorer выделите узел проекта Application2 и через контекстное меню сделайте проект стартовым. Запустите приложение - должен получиться такой результат
Замечание. Если приложение выдаст сообщение "Ошибка при компиляции эффекта...", то добавьте к проекту файл с эффектом ColorFill.fx из прилагаемой к работе папки Source, не редактируя его. Незабудьте в этом случае изменить свойство файла Copy to Output Directory на значение Copy if newer.