Учитывая возможности полноэкранного режима, можно сделать вывод, что в данном случае функциональные возможности DirectX значительно разнообразнее и разработчик всегда может выбрать вариант реализации, концептуально не уступающий или превосходящий OpenGL. Но следует учитывать, что если драйвер одной из библиотек будет более эффективно использовать ускоритель и быстрее выполнять базовые функции, то никакие ухищрения при работе со второй библиотекой не помогут достичь такого же быстродействия.
Настройка конвейера Как известно, аналогом предназначенных для настройки конвейера функций gl Enabl е( ) и gl Di sabl е( ) в DirectX является метод SetRenderState(D3DSAMPLERSTATETYPE. DWORD). Первый параметр этой функции является значением перечислимого типа D3DSAMPLERSTATETYPE, при помощи которого задается операция конвейера. Второй параметр функции позволяет указывать параметры выполняемой операции.
Например, для задания плоской закраски в предыдущем примере можно было выполнить следующий оператор:
правила экономии ведут к богатству.
Device->SetRenderState( D3DRS_SHADEM0DE, D3DSHADEJLAT)
Если включить его в функцию рисования, это покажет, что DirectX использует для плоской закраски первую вершину треугольника. Впрочем, при выполнении подобной программы на разных компьютерах мне приходилось видеть, что назначение цвета вершина зависит от установленного ускорителя.
Разработчики библиотеки постоянно указывают, что второй параметр функции может задавать три варианта закраски. Значение D3DSHADE_FLAT инициирует плоскую закраску, значение D3DSHADEG0URAUD - закраску по Гуро, а значение D3DSHADE_PH0NG - закраску по Фонгу. При этом указывается, что закраска по Фонгу не реализована. Напомним, что закраска по Фонгу вместо линейной интерполяции цвета предполагает линейную интерполяцию направления вектора нормали.
Применение библиотеки DirectX
В результате определение цвета каждой внутренней точки примитива требует вычисления скалярного произведения векторов.
Удаление тыльных граней
OpenGL позволяла включить или выключить удаление одной из сторон грани. В DirectX тот же результат достигается при помощи метода SetRenderStateC ) с первым параметром D3DRS_CULLM0DE. Оператор Device->SetRender-State(D3DRS_CULLM0DE, D3DCULL-NONE) выключает контроль и удаление одной стороны грани. Для удаления одной из сторон в качестве второго параметра следует указать константу D3DCULL_CW или D3DCULL_CCW. По умолчанию удаление тыльных граней включено.