Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 11:

Выбор подходящего устройства в DirectX

Свопинг-связки и рендеры

Существуют несколько неявных функций и процедур обработки в устройстве (класс Microsoft.DirectX.Direct3D.Device ), которые определяют, где и как нарисовать объект. Каждое устройство имеет неявные цепочки подкачки (или свопинг-связки), использующиеся для рендеринга объекта.

Свопинг-связка представляет собой ряд буферов, управляющих рендерингом. Есть вторичный буфер, определяющий окончательный результат рисования. Когда свопинг-связка, определяемая перечислением Microsoft.DirectX.Direct3D.SwapEffect.Flip, готова, данные вторичных буферов передаются на первичный буфер, с которого их считывает графическая плата. Сразу после этого третичный буфер становится вторичным, вторичный - первичным, а первичный - третичным, т.е. смена буферов происходит по кругу.

При необходимости DirectX может создавать большее количество скрытых буферов для оперативной подготовки графической информации. Иногда программист сам должен следить за своевременной очисткой вторичного буфера перед запуском новых операций рисования.

Вторичный буфер свопинг-связки может быть использован в качестве рендера. Когда устройство создано, можно использовать свопинг-связку, ко вторичному буферу которой привязана поверхность рендеринга (рисования) устройства. Объект рендеринга представляет собой поверхность, которая будет поддерживать вывод производимых операций рисования. При использовании множественных свопинг-связок нужно своевременно переключать рендеринг на сменяющиеся вторичные буферы.

Форматы вторичных буферов и дисплеев

В большом списке форматов, выдаваемых нашим приложением, могут быть несколько подходящих для использования в качестве вторичного буфера или формата дисплея, которые использует Direct3D. В том числе такие:

A2R10G10B10 X8R8G8B8 X1R5G5B5
A8R8G8B8 A1R5G5B5 R5G6B5

Чаще всего встречаются форматы, выделенные в таблице. Если мы жестко ориентируемся на использование какого-то формата, то проверить его поддержку в системе можно с помощью следующей функции класса Manager

public static System.Boolean CheckDeviceType( 
  System.Int32 adapter, 
  Microsoft.DirectX.Direct3D.DeviceType checkType, 
  Microsoft.DirectX.Direct3D.Format displayFormat, 
  Microsoft.DirectX.Direct3D.Format backBufferFormat, 
  System.Boolean windowed, 
  System.Int32 result)
Листинг 11.4.

где

  • adapter - номер тестируемого адаптера
  • checkType - тип проверяемого устройства (обычно это DeviceType.Hardvare )
  • displayFormat - выбранный формат устройства
  • backBufferFormat - выбранный формат вторичного буфера
  • windowed - режим работы (оконный или полноэкранный)
  • result - дополнительный параметр, возвращающий целочисленный код функции ( HRESULT и COM )

Функция возвратит значение true, если проверяемый тип устройства поддерживается системой.

Важно отметить, что в оконном режиме формат вторичного буфера не должен соответствовать формату режима визуального отображения, если аппаратные средства способны поддерживать соответствующее цветовое преобразование. Возможность преобразования можно проверить функцией CheckDeviceFormatConversion() класса Manager.

Проверка возможностей устройства

Различные возможности аппаратных средств описываются термином "capability" - возможность. В Direct3D имеется опция, которая перечисляет все имеющиеся возможности используемого устройства. Как только устройство создано, ее можно использовать для определения имеющихся возможностей. Для несозданного устройства также можно узнать возможные поддерживаемые характеристики устройства с помощью определенного метода класса Manager.

Теперь можно добавить к нашему приложению код, который выдаст описание свойств и возможностей каждого найденного адаптера в системе. Из-за большого объема информации будем ее выводить не в древовидный список, а в текстовое поле.

  • Выделите на форме компонент TreeView и измените его свойство Dock на значение Left.
  • Расширьте форму и поместите на освободившееся место справа от списка TreeView компонент TextBox из вкладки Windows Forms панели Toolbox.
  • Установите для компонента TextBox свойства: Multiline=true, Dock=Fill, ScrollBars=Both, Text= пусто
  • Выделите компонент TreeView и через панель свойств, установленную в режим Events, создайте двойным щелчком для события AfterSelect обработчик, который заполните так
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
      if(e.Node.Parent == null) // Только для корня дерева
      {
        textBox1.Text = e.Node.Text 
          + " Capabilities: \r\n\r\n"
          + Manager.GetDeviceCaps(e.Node.Index, DeviceType.Hardware)
            .ToString().Replace("\n", "\r\n");
      }
    }
Листинг 11.5. Обработчик для события выбора в древовидном cписке

Для корневых папок, которые отображают названия адаптеров, при их выборе мы вызываем функцию Manager.GetDeviceCaps() для соответствующего номера адаптера.

  • Запустите приложение и должен получиться примерно такой результат

Многие возможности, перечисленные в списке, используются только в непрограммируемом конвейере. Если использовать программируемый конвейер, многие возможности не понадобятся в сцене приложения. Полученный список возможностей устройства можно разделить на две группы. Первая группа - логичесие значения, которые определяют, поддерживается ли данная аппаратная возможность или нет. Вторая группа отражает фактические значения соответствующих возможностей в данной системе. Например, MaxActiveLights определяет допустимое количество активных подсветок, реализуемых в сцене.

В следующих лабораторных работах, посвященных изучению DirectX, будут описаны отдельные возможности устройства по мере необходимости.


Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000