Программирование графики с использованием Direct3D




Функция CreateDevice() - часть 3


/p>

В качестве последнего аргумента передается адрес переменной устройства, что дает возможность инициализировать указатель на новое устройство.

После того, как устройство создано, настроим его параметры для применения визуализации по методу Гуро, посредством функции SetQuality():

device->SetQuality(D3DRMRENDER_GOURAUD);

Сразу после создания устройства при визуализации по умолчанию используется равномерная закраска. Мы изменяем этот параметр, чтобы наши программы при визуализации по умолчанию применяли метод Гуро. В дальнейшем, при создании специализированных интерфейсов приложения, этот параметр можно переопределить.

Следующая задача, выполняемая функцией CreateDevice(), — получение глубины пикселей текущего видеорежима:

HDC hdc = ::GetDC(m_hWnd); int bpp = ::GetDeviceCaps(hdc, BITSPIXEL); ::ReleaseDC(m_hWnd, hdc);

Функция GetDeviceCaps() вызывается, чтобы присвоить значение, равное количеству битов, используемых для представления одного пиксела, переменной bpp. Это значение определяет максимальное количество одновременно выводимых цветов для текущего видеорежима. Затем значение переменной bpp используется в операторе switch, устанавливающем некоторые параметры объектов Direct3DRMDevice и Direct3DRM. Оптимальные значения параметров зависят от конкретного приложения. Значения, используемые в функции CreateDevice() являются хорошей отправной точкой, но только экспериментирование позволит добиться наилучших результатов для вашего приложения.

Затем, с помощью функции CreateFrame() интерфейса Direct3DRM создается корневой фрейм сцены:

r = d3drm->CreateFrame(NULL, &scene);

С технической точки зрения, корневой фрейм является частью сцены и должен создаваться в той части кода, которая зависит от приложения. Однако на практике все сцены содержат корневой фрейм, поэтому его создание в общей части вполне оправдано.

Далее вызывается функция CreateScene():

if (CreateScene() == FALSE) { AfxMessageBox("CreateScene() failed"); return FALSE; }

Функция CreateScene() переопределяется в классе SampleWin, чтобы создавать необходимые для конкретного приложения сцены.Функция CreateScene() может применяться для создания любой сцены, но с одним условием: в ней должны инициализироваться переменные camera и viewport. Чуть позже мы подробнее рассмотрим функцию CreateScene().

Последние четыре строки функции CreateDevice() выглядят следующим образом:

CreateScene(); ASSERT(camera); ASSERT(viewport); return TRUE;

Макроопределение ASSERT проверяет инициализированы ли переменные camera и viewport и прерывает выполнение приложения с соответствующим сообщением, если этого не было сделано.

Наконец, функция CreateDevice() возвращает TRUE. Если вы вернетесь к листингу 4.1, то увидите, что при возникновении какой-либо ошибки, макроопределение TRACE выводит сообщение и возвращается FALSE. Возврат значения FALSE уведомляет класс RMWin о необходимости прервать исполнение приложения.




Содержание  Назад  Вперед