7.2.Альфа-тест По сути, альфа-тест – возможность графического акселератора, в чем-то аналогичная z-тесту. Она позволяет не ставить пиксель в буфер кадра (и z-буфер) если не выполняется условие:
source alpha <функция сравнения> reference alpha.
У пользователя есть возможность установить следующие настройки (через SetRenderState()):
D3DRS_ALPHATESTENABLE – включить/выключить тест
D3DRS_ALPHAFUNC – задать функцию сравнения (>, <, =, ≤,≥,≠)
D3DRS_ALPHAREF – задать константу (reference alpha) в интервале 0x00 .. 0xFF, с которой осуществляется сравнение.
Рис. 15. Слева – дерево без альфа-теста. Для среднего дерева задан альфа-тест
alpha > 0. Для правого альфа-тест: alpha = 0xFF. Следует обратить внимание на наличие белой окантовки вокруг дерева в центре. Это область, где значение альфа-канала в связи с интерполяцией отлично от 0 или 1.
Таким образом, если задать сравнение альфа = 0xFF, то мы будем ставить в буфер кадра только непрозрачные пиксели, что позволит не закрывать объекты прозрачными пикселями и избежать артефактов, описанных выше. При этом включение смешивания с буфером кадра становится не нужным.
Следует обратить внимание, что даже для текстуры, содержащей в альфа-канале только 0 и 1, сравнения альфа = 0xFF и альфа > 0 не эквивалентны. Это связано с тем, что при линейной фильтрации текстуры возникают промежуточные значения альфа-канала.
8.Библиография 1. Документация к DirectX 9.0с SDK.
2. Станислав Горнаков, DirectX 9: Уроки программирования на С++, СПб: БХВ-Петербург, 2004 г.
3. Михаил Фленов, DirectX и С++. Искусство программирования, СПб: БХВ-Петербург, 2006 г.
4. А. И. Евченко, OpenGL и DirectX. Программирование графики, СПб: Питер, 2006 г.
9.Дополнения 9.1.Определение возможностей устройства Так как Direct3D9.0c работает на очень широком спектре оборудования: от старых графических плат типа NVidia Riva 128, до современных типа ATI Radeon X1850. Поэтому автор приложения, использующего Direct3D должен в первую очередь определиться на каком множестве оборудования будет работать его приложение, а потом использовать информацию о возможностях устройства (capabilities), чтобы подстроить работу приложения под его возможности (выбрать техники, основанные на поддерживаемых возможностях; использовать правильные размеры текстур и их форматы; и т.д.). Для получения информации о возможностях устройства нужно вызвать метод GetDeviceCaps(), который заполняет структуру D3DCAPS9.
В настоящем пособии не ставится цель полностью осветить содержимое этой структуры. В лабораторных работах используются определенные предположения, которые выполняются для практически всех видеокарт, имеющихся в распоряжении у читателя. Однако следует помнить, что далеко не все заявленные в документации Direct3D возможности, поддерживаются вашей графической платой. Возможности вашего конкретного устройства можно посмотреть в DirectX Caps Viewer – приложении, поставляющемся вместе с SDK.
9.2.Использование отладочных возможностей библиотеки Direct3D 9.0c поставляется в двух версиях: отладочной (debug) и финальной (release). Первый вариант работает медленнее, зато позволяет получать отладочные сообщения о неправильном использовании API, утечках памяти (memory leaks) и пр. Переключать версии Direct3D можно в Control Panel (см. рис. 16). Там же можно настроить объем отладочных сообщений, попадающих в output панель Visual Studio. Для большинства ситуаций достаточно среднего положения слайдера.
В случае возникновения утечек памяти библиотека выводит огромное количество невразумительных сообщений вида:
Direct3D9: (WARN) :Memory Address: 022ea3c0 lAllocID=6342 dwSize=00000030, (pid=00000f3c)
Direct3D9: (WARN) : Stack Back Trace
Direct3D9: (ERROR) : [0] : Address 0155AA18
Direct3D9: (ERROR) : [1] : Address 01579B2B
Direct3D9: (ERROR) : [2] : Address 01581A1B
Direct3D9: (ERROR) : [3] : Address 015C017F
Direct3D9: (ERROR) : [4] : Address 005620CE
………………………………………
Direct3D9: (ERROR) : [15] : Address 00000000
Рис. 16. Окно Control Panel, управляющее настройками отладочной версии Direct3D 9.0c. (1) – слайдер, контролирующий объем отладочных сообщений, (2) – переключение между отладочной и финальной версиями библиотеки, (3) – включает точку останова (break point) на обнаружение утечек памяти, (4) – включает точку останова на возникновение ошибки. По ним не возможно распознать причину возникновения утечки, поэтому следует внимательно следить, чтобы эти сообщения отсутствовали в output. При этом следует помнить, что они не появятся, если программа не завершилась. То есть выходить из программы следует, не прекращая отладку, тем самым прерывая программу, а в обычном штатном режиме.
В случае возникновения этих сообщений следует внимательно просмотреть код, написанный после последнего запуска, на предмет ошибок забытых вызовов Release(). В большинстве случаев утечки памяти в Direct3D возникают из-за того, что пользователь забывает освободить указатель на объект Direct3D.
9.3.Словарь англоязычных терминов Таблица 6. Словарь англоязычных терминов.
Термин
| Объяснение
| Использованный в руководстве термин
| Alpha-channel
| Дополнительная (четвертая) компонента цвета, обычно использующаяся в качестве прозрачности.
| альфа-канал
| Aspect ratio
| Отношение ширины к высоте
| форматное соотношение
| Capability
| В контексте Direct3D API – возможность графической платы
| возможность устройства
| FPS
| Frames per second. Количество кадров в секунду. Обычно используется как показатель производительности приложения.
| FPS
| GPU
| Graphics Processor Unit (по аналогии с CPU = Central Processor Unit). Процессор графической платы.
| GPU
| Index
| В контексте Direct3D API обычно индекс вершины.
| Индекс
| Memory leaks
| Утечки памяти. В контексте Direct3D API утечкой памяти обычно является ситуация, в которой пользователь считает, что он уже не пользуется ресурсом, в то время как Direct3D считает обратное.
| Утечки памяти
| Mipmap
| Уменьшенные копии текстуры. Используются для того, чтобы убрать эффект шума в ситуации, когда объект с детальной текстурой находится достаточно далеко и выборка из текстуры получается почти случайной.
| Мипмапы
| Pipeline
| Конвейер. В контексте Direct3D API может пониматься как
графический конвейер – последовательность действий от начала обработки вызова DrawIndexedPrimitive() до результирующих пикселов в буфере кадра
пиксельный конвейер – смешивание текстур в определенном порядке по определенным формулам
| Конвейер
| Render(-ing)
| Визуализация (см. подробности в разделе 2).
| Рендеринг
| Stage
| В контексте Direct3D API – этап пиксельного конвейера.
| Этап
| State
| В контексте Direct3D API – некоторая установка/настройка API. Устанавливаются state следующими функциями:
SetRenderState()
SetTextureStageState()
SetSamplerState()
| Настройка
| Texture sampling
| Выборка цвета из текстуры по текстурным координатам, включающая в себя весь процесс получения цвета: адресация, выбор мипмапа, выборка нескольких цветов с целью фильтрации, фильтрация, фильтрация мипмапов.
| Выборка из текстуры
| Vertex
| Вершина. В контексте Direct3D API – комплекс данных, включающих позицию, соответствующий вершине объекта.
| Вершина
|
|