На главную страницу Написать письмо Добавить в избранное Сделать www.comprog.ru стартовой

Использование буфера глубины (Z-буфера)


Запустив пример к предыдущему уроку вы должны были заметить некоторые погрешности в выводе полигонов на экран, они перекрывались не правильно, и это нарушало видимость настоящего 3D. Все это происходило потому, что мы не использовали буфер глубина (или Z-буфер) для обеспечения правильного вывода наших полигонов. В данном уроке мы исправим это и научимс яиспользовать буферы глубины.

Само использование буфера глубины не вызывает ни каких проблем. Для этого при создании устройства D3D8 вам необходимо указать следующие строки :

где depthBufferFormat может быть одним из следующих форматов :

D3DFMT_D15S1
D3DFMT_D24X8
D3DFMT_D24S8
D3DFMT_D24X4S4
D3DFMT_D32

Это просто разные форматы глубинных буферов.

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

Теперь я могу выбирать необходимый мне формат. Но для возможности выбора мне нужно еще заполнить список доступных форматов. Это делается в функции обработки диалоговых сообщений и заполнение выполняется следующим способом :

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

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

Кроме того что мы это все инициализировали и использовали, нужно еще немного изменить строки, где мы инициализируем для работы Direct3D8, а также в том месте, где мы производим отрисовку экрана. В первом случае мы добавляем :

это дает Direct3D8 понять, что нужно использовать буфер глубины, и задаем его формат. Кроме того, для того чтобы начать использовать этот буфер, необходимо установить один флаг для рендеринга :

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

тут мы показываем, что нам необходимо очищать буфер глубины.

Это все на данный момент. Запустив пример к данному уроку вы можете увидеть следующую картинку :

  Поиск по сайту
  
Яндекс цитирования