Microsoft Direct3D

Библиотека Direct3D является составной частью пакета DirectX, встроенного во все версии Windows, начиная с Windows 95 OSR2. Последняя версия - DirectX 7.0 (Windows 2000 и Windows 98 SE). Для работы с материалом данной главы надо иметь Microsoft DirectX SDK.

1. Окна, ракурсы и устройства

Термин окно обладает множеством значений. В традиционном графическом программировании он соответствует способу проектирования изображения на плоскую поверхность, а у многих из нас он вызовет ассоциации с объектами в знакомой операционной системе с громадным количеством разных API.

Окно - объект Microsoft Windows, который обрабатывает сообщения и отображается в приложениях. Ракурсом называется математическое описание того, как набор объектов в трехмерном пространстве отображается в окне. Устройством (device) называется программа, связанная с реальным устройством, отвечающим за работу видеосистемы на вашем компьютере. Чтобы создать трехмерный макет в приложении, необходимо иметь окно, ракурс и устройство. На самом деле с одним устройством может быть связано несколько ракурсов и несколько окон, однако мы построим систему с одним окном, одним ракурсом и одним устройством. Вы управляете работой окна; управление ракурсом и устройством осуществляет механизм визуализации.

2. GDI и DirectDraw

Спустимся на аппаратный уровень и посмотрим на карту памяти видеоадаптера. Допустим, у вас установлен видеоадаптер с 2 Мб видеопамяти. Вы работаете в разрешении 1024х768 с 256 цветами, так что ваша видеокарта фактически использует только 786,432 байта (1024х768) видеопамяти. Эта часть - активная видеопамять. Открытое окно имеет размеры приблизительно 512х400 пикселов, для хранения которых необходимо 204,800 байт видеопамяти.

Теперь предположим, что вы хотите воспроизвести в своем открытом окне трехмерную анимацию. Для этого вы задаете размеры окна и его положение на рабочем столе. Тем самым определяется область видеопамяти, используемая для отображения содержимого окна ("область памяти окна"). Если бы для рисования в вашем окне применялись стандартные функции Windows GDI, то при получении запроса на вывод модуль GDI обратился бы к драйверу видеоустройства для установки тех пикселей в видеопамяти, которые бы приводили к нужному эффекту. На рис. 1 изображена программная иерархия, с которой обычно приходится иметь дело в Windows-программах:

Рис. 1

Например, для того чтобы нарисовать в окне прямоугольник, следует вызвать функцию Rectangle. GDI спрашивает драйвер видеоустройства, умеет ли тот рисовать прямоугольники; если не умеет, GDI "договаривается" с драйвером о каком-нибудь другом способе рисования прямоугольника (построение множества линий или чего-нибудь в этом роде). Затем драйвер устройства обращается к содержимому видеопамяти или пользуется аппаратными особенностями видеокарт для непосредственно рисования прямоугольника. Как вы думаете, быстро проходит этот процесс или медленно? Правильный ответ - не очень медленно, но и быстрым его никак не назовешь. Все дело в универсальности GDI, за которую приходится расплачиваться.

Разве не замечательно было бы обойти GDI и драйвер видеоустройства и напрямую работать с видеопамятью? Конечно, это будет гораздо быстрее, но тогда вам придется досконально изучить работу всех видеокарт. Библиотека DirectDraw предлагает идеальный вариант - вы обращаетесь к драйверу видеоустройства с запросом на прямой доступ к видеопамяти, и, если драйвер разрешит, вы сможете непосредственно изменять значения пикселов на экране. Если же драйвер не сможет предоставить прямого доступа к видеопамяти, он по крайней мере создаст иллюзию того, что вы работаете с ней, хотя часть работы при этом будет выполняться самим драйвером. Приложение может пользоваться функциями GDI или функциями DirectDraw в зависимости от своих требований к производительности. При установке DirectDraw процесс графического вывода происходит в соответствии с рис. 2.


Рис. 2

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

DirectDraw обладает еще одной важнейшей особенностью. Посмотрите внимательнее на рис. 2. Для хранения изображения на экране используется менее половины имеющейся видеопамяти, а весь остаток пропадает даром. Нельзя ли распорядиться им более разумно? Если видеокарта на рис. 2 обладает аппаратным блиттером (специальная система, предназначенная для выполнения блитовых операций), то в свободной памяти можно хранить вспомогательные спрайты, текстуры и т. д. Аппаратный блиттер позволит напрямую переносить изображения из внеэкранной видеопамяти в активную. Вам уже не приходится тратить время на пересылку видеоданных по компьютерной шине данных, благодаря чему возрастает скорость графического вывода. DirectDraw управляет свободной видеопамятью и позволяет создавать в ней внеэкранные поверхности или использовать ее любым другим способом. Фрагмент свободной памяти можно даже выделить под вторичный буфер, размеры которого совпадают с буфером главного окна, и построить в нем следующий кадр анимации, после чего воспользоваться исключительно быстрой блитовой операцией для обновления содержимого активной видеопамяти и смены изображения.

3. Пересылка видеоданных

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


Рис. 3

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

На самом деле пересылку данных в видеопамяти можно ускорить и дальше. Если ваше приложение будет работать в полноэкранном исключительном режиме (mil-screen exclusive mode), видеокарта сможет переключаться между двумя страницами видеопамяти, благодаря чему анимация достигает производительности, присущей разве что играм для DOS.

Так какое же отношение все сказанное имеет к механизму визуализации? Он должен очень быстро производить графический вывод (прямо в видеопамять или, еще предпочтительнее, с использованием аппаратных средств видеокарты для поддержки работы с трехмерной графикой). Как же происходит пересылка данных в этих условиях? Механизм визуализации обращается к функциям промежуточного программного уровня (в данном случае - непосредственного режима Direct3D), который сообщает видеокарте о необходимости выполнить ряд примитивных операций по обсчету трехмерной графики. Если видеокарта не может справиться с подобной задачей, необходимые функции эмулируются с привлечением программных драйверов Direct3D. При наличии таких программных компонентов мы получаем новую модель (рис. 4), при которой любое приложение (не только механизм визуализации) сможет вызвать набор трехмерных функций, которые будут реализованы с максимальной производительностью .


Рис. 4

Кто же выигрывает от всего этого? Конечно же, приложения. Отныне ваша программа может выбрать любой путь, который обеспечит ей необходимую производительность при работе под Windows.

4. Создание устройства и ракурса

Рассмотрим, какое же место в этой схеме занимает устройство и ракурс. Устройством называется программный компонент механизма визуализации, работающий с промежуточным уровнем Direct3D (см. рис. 4). Ракурс определяет, каким образом устройство используется при выводе в область видеопамяти, соответствующую окну. Следовательно, единственное назначение создаваемого окна заключается в том, чтобы указать устройству область видеопамяти, с которой оно будет работать. При создании трехмерного окна мы одновременно создаем устройство и указываем, к какому участку видеопамяти оно будет обращаться. Сделать это можно несколькими способами.

Проще всего вызвать функцию, которая непосредственно создает устройство по логическому номеру (handle) окна. Это очень удобно, поскольку совершенно не приходится думать о том, как работает промежуточный уровень Direct3D - указываете логический номер окна, а механизм визуализации делает все остальное. Кроме того, можно воспользоваться функциями DirectDraw для выделения памяти под видеобуферы, а также функциями Direct3D для создания Z-буфера (Z-буфером называется специальный видеобуфер, содержащий информацию о "глубине" каждого пикселя изображения). Затем вся эта информация передается механизму визуализации, который и создает устройство.

Разумеется, создать устройство непосредственно по логическому номеру окна гораздо проще, чем возиться с поверхностями DirectDraw.

5. Проекционная система

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

Рис. 5

Положение передней и задней отсекающих плоскостей задается функциями IRL Viewport: :SetFront и IRL Viewport: :SetBack. СОМ-интерфейс IRLViewport применяется для управления ракурсом. Величину угла камеры можно изменить функцией IRL Viewport: :SetField. При создании объекта некоторым параметрам присваиваются начальные значения, а другие остаются как есть. Чтобы точно определить положение трехмерного объекта на экране, необходимо применить к его вершинам преобразование, которое отображает трехмерные пространственные координаты на двухмерные координаты окна. Преобразование координат осуществляется с помощью матрицы размером 4х4, которая является суперпозицией отдельных преобразований перспективы, масштабирования и переноса. В сущности, для получения двухмерных координат вершины следует умножить вектор трехмерных координат на матрицу преобразования.

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

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

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

При создании фрейма сцены камера находится перед сценой и направляется на ее центр. Другими словами, камера располагается в отрицательной области оси Z. На рис. 6 показано взаимное расположение фреймов камеры и сцены.

Рис. 6

6. Создание фигур

DirectX SDK позволяет создавать приложения, работающие с механизмом визуализации. Однако SDK не содержит ни отдельных программ, ни простых функций для создания фигур. Предполагается, что у вас имеются собственные средства для построения трехмерных объектов, текстур и т. д. Тем не менее есть другой сценарий. На самом деле SDK все же содержит функции для построения фигур: вы составляете список координат вершин и набор списков лицевых вершин, после чего вызываете функцию для создания фигуры. Существует функция для загрузки фигуры из файла с расширением *.X. В состав SDK входит специальная утилита для преобразования сцен 3Dstudio *.3DS в формат *.X.

В документации по DirectX SDK сказано, что к фрейму могут присоединяться визуальные элементы (один и более). Визуальным элементом (visual) называется фигура или текстура, отображаемая на экране. Визуальный элемент не имеет собственного положения; его необходимо присоединить к фрейму таким образом, чтобы при выполнении преобразования он появился в нужном месте окна. Наличие фрейма и визуального элемента позволяет определить положение объекта и его геометрическую форму, благодаря чему он становится больше похож на реальный объект. Недостаток такой схемы заключается в том, что если в макет входят 23 совершенно одинаковых дерева, то для создания леса понадобится 23 фрейма и 23 визуальных элемента, а это не очень эффективно. Гораздо лучше было бы создать всего одну фигуру (визуальный элемент) и воспроизвести ее в 23 различных местах. Другими словами, присоединить один визуальный элемент к 23 разным фреймам и добиться существенной экономии памяти за счет данных, необходимых для определения 22 оставшихся фигур.

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

7. Работа с интерфейсами СОМ-объектов

Давайте в общих чертах познакомимся с составной объектной моделью (СОМ - Component Object Model) и работой СОМ-интерфейсов.

Интерфейс представляет собой набор функций, объединенных общим назначением. Интерфейсные функции напоминают функции классов C++, за тем исключением, что функции интерфейса только определяются, но не реализуются. Можно считать их чем-то вроде плана для класса C++, который вы только собираетесь написать.

СОМ-объектом называют фрагмент кода, реализующий один или несколько интерфейсов. СОМ-объекты могут быть чрезвычайно простыми (например, объекты классов C++ со статической компоновкой) или чрезвычайно сложными (программа, работающая на сервере на другом краю Земли). Если вы представляете себе работу библиотек динамической компоновки (DLL), то СОМ-объекты при программировании на C++ играют ту же роль, что и DLL при программировании на С.

Любой СОМ-объект в обязательном порядке должен поддерживать интерфейс с именем lUnknown, обеспечивающий два базовых свойства СОМ-объектов: подсчет обращений и способность запрашивать другие интерфейсы. При помощи интерфейса lUnknown можно определить, какие еще интересующие вас интерфейсы поддерживаются объектом. Предположим, мы только что создали трехмерный объект средствами механизма визуализации и теперь хотим изменить его положение в макете. Поскольку нужная функция для изменения положения присутствует в интерфейсе IDirect3DRMFrame, желательно выяснить, поддерживается ли этот интерфейс созданным объектом, и, если результат проверки окажется положительным, вызвать соответствующую функцию IDirect3DRMFrame для изменения положения объекта. Для определения того, поддерживается ли тот или иной интерфейс данным объектом, следует вызвать функцию lUnknown: :Querylnterface.

Интерфейс lUnknown является базовым для всех остальных СОМ-интерфейсов, так что при наличии указателя на любой интерфейс можно вызвать Queryinterface для любого интерфейса, которым вы хотите пользоваться.

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

Кроме того, любой интерфейс или СОМ-объект может наследовать функции и свойства от другого интерфейса или целой группы интерфейсов. Однако выяснить это программными средствами невозможно; приходится смотреть на определение интерфейса. Например, если заглянуть в заголовочный файл d3drmobj.h в DirectX SDK, вы увидите, что интерфейс IDirect3DRMFrame является производным от IDirect3DRMVisual. Следовательно, IDirect3DRMFrame заведомо поддерживает все функции интерфейса IDirect3DRMVisual. IDirect3DRMVisual является производным от IDirect3DRMObject, который, в свою очередь, порожден от lUnknown. Следовательно, интерфейс Idirect3DRMFrame поддерживает все функции Idirect3DRMFrame, а также все функции интерфейсов Idirect3DRMVisual, Idirect3DRMObject и lUnknown

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

Любая функция, которая возвращает указатель на интерфейс, перед тем как вернуть управление, вызывает AddRef для увеличения счетчика обращений; после завершения работы с указателем необходимо вызвать Release, чтобы избежать ненужного хранения объектов в памяти. Если вы копируете указатель на интерфейс, вызовите AddRef для копии и освободите оба указателя функцией Release, когда надобность в них отпадет. Помните о том, что возврат указателя на интерфейс одной из ваших функций фактически равносилен его копированию. Перед тем, как возвращать указатель, не забудьте вызвать для него AddRef.

Если вы стопроцентно уверены в том, что делаете, то при копировании указателя можно обойтись и без вызова AddRef, однако при этом следует неуклонно следить за тем, чтобы функция Release была вызвана нужное количество раз. Лишние вызовы Release приведут к уничтожению используемого объекта, их нехватка - к непроизводительным расходам памяти.

8. Интерфейсы трехмерной графики

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

lUnknown

lDirect3DRMObject

lDirect3DRMDevice

lDirect3DRMViewport

lDirect3DRMFace

lDirect3DRMLight

lDirect3DRMWrap

lDirect3DRMMaterial

lDirect3DRMVisual

lDirect3DRMFrame

lDirect3DRMMesh

lDirect3DRMShadow

lDirect3DRMMeshBuilder

lDirect3DRMTexture

Как видите, в иерархии существуют две основные группы: интерфейсы, производные от IDirect3DRMObject, и интерфейсы, производные от IDirect3DRMVisual.

IDirectSDRMDevice

Интерфейс содержит управляющие функции, которые влияют на отображение макета в вашем окне. Функции работают со вспомогательным слоем Direct3D и, в сущности, со многими аспектами физического устройства вывода. Например, вы будете пользоваться этим интерфейсом для изменения качества визуализации с помощью функции SetQuality. Кроме того, функция SetShades интерфейса IDirect3DRMDevice служит для ограничения количества цветовых оттенков при работе с палитрами.

Качество визуализации может соответствовать нескольким уровням - от простейшего "проволочного каркаса" до закраски методом Гуро, как показано в таблице.

Возможные значения параметров функции SetQuality

Качество визуализации

Закраска

Освещение

3аполнение

D3DRMRENDER WIREFRAME Однородная

Нет

Нет("проволочный каркас")
D3DRMRENDERUNLITFLAT D3DRMRENDER FLAT D3DRMRENDERGOURARD D3DRMRENDERPHONG Однородная Однородная Метод Гуро Метод Фонга

Нет

Да

Да

Да

Сплошное

Сплошное

Сплошное

Сплошное*

* He поддерживается в Direct3D  

 

 

 

 

 

IDirect3DRMViewport

Интерфейс IDirect3DRMViewport управляет работой проекционной системы, изображенной на рис. 7 и преобразующей пространственные координаты в двухмерные координаты на экране компьютера. Функция SetBack используется для задания положения задней отсекающей плоскости на оси Z. Функция SetField изменяет фокальное расстояние камеры, воспроизводящей макет.

Рис. 7

Функция SetProjection определяет, следует ли применять к изображению корректировку перспективы или же объекты должны воспроизводиться в простой ортогональной проекции. В большинстве случаев следует пользоваться перспективной проекцией для повышения реализма. Помимо определения исходных условий, основное назначение этого интерфейса связано с выбором объектов в макете. Функция Pick определяет, какой объект (если он имеется) лежит под заданной точкой экрана.

IDirect3DRMFace

Интерфейс IDirect3DRMFace позволяет определить или задать атрибуты одной грани трехмерного объекта. Например, вы можете задать цвет грани функцией SetColor или же получить вектор, направленный по нормали к ней функцией GetNormal. Для получения указателя на интерфейс IDirect3DRMFace обычно следует запросить у интерфейса IDirect3DRMMeshBuilder список граней, после чего выбрать из возвращаемого массива одну конкретную грань.

IDirect3DRMLight

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

IDirectSDRMWrap

Покрытие (wrap) определяет способ наложения текстуры на объект. Покрытия могут быть плоскими, цилиндрическими, сферическими и хромовыми. Для наложения покрытий (за исключением хромовых) на сетку используется функция Apply. Хромовое покрытие, предназначенное для имитации отражающих поверхностей, накладывается функцией Apply Relative; при этом текстура ориентируется по отношению к фрейму, а не к объекту, благодаря чему достигается правильное поведение "отражений" даже при вращении объекта. Покрытие также можно наложить на одну грань объекта.

IDirect3DRMMaterial

Материал определяет отражающие свойства поверхности. Используя их, вы можете регулировать блеск поверхности и придавать ей вид, характерный для металла или пластика.

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

IDirect3DRMVisual

Интерфейс IDirect3DRMVisual не содержит собственных функций. Он лишь является базой, на которой порождаются все интерфейсы, которые могут использоваться в качестве визуальных элементов. Хотя в документации по SDK интерфейс IDirect3DRMVisual упоминается довольно часто, обычно он используется лишь как тип аргументов различных функций, как показано в объявлении AddVisual.

IDirect3DRMFrame

IDirect3DRMFrame используется чаще других интерфейсов и служит для изменения свойств фрейма. Например, можно задать положение фрейма функцией SetPosition или определить его ориентацию функцией SetOrientation. Приведу другой пример : функция SetTexture закрепляет за фреймом текстуру, которая используется сетками, прикрепленными к фрейму в качестве визуальных элементов. Таким образом, одна сетка, определяющая форму объекта, может использоваться с различными текстурами.

Функция SetRotation задает вращение фрейма вокруг заданного вектора, а функция SetVelocity - скорость вращения. Такая возможность оказывается полезной, если в вашем макете происходит непрерывное движение и вы не хотите постоянно пересчитывать положение объектов. Если фрейм является корневым (то есть не имеет родительского фрейма), можно задать для него фоновое изображение функцией SceneSetBackground или просто выбрать цвет фона функцией SceneSetBackGroundRGB.

IDirect3DRMMesh

Интерфейс сеток Idirect3DRMMesh в основном используется для задания атрибутов групп внутри сетки. Группой называется набор вершин с общими атрибутами (например, цветом). Группировка сходных элементов повышает производительность визуализации и часто используется абстрактным режимом Direct3D.

Интерес представляют еще две функции этого интерфейса - функция Save, сохраняющая сетку в файле на диске, и функция Translate, прибавляющая заданное смещение к каждой вершине сетки. Последняя функция особенно полезна для присоединения нескольких сеток к общему фрейму при построении сложной фигуры.

IDirectSDRMShadow

Интерфейс IDirectSDRMShadow не содержит собственных функций и служит в качестве типа данных для объектов - теней, которые являются разновидностью визуальных элементов.

IDirectSDRMMeshBuilder

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

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

IDirectSDRMTexture

Текстурой (texture) называется изображение, которое накладывается на фигуры или на их отдельные грани для придания им большего реализма. Функции интерфейса IDirect3DRMTexture чаще всего используются для управления процессом визуализации текстур. Например, если вы желаете ограничить количество цветов при воспроизведении текстуры, следует вызвать функцию SetShades. В противном случае одна насыщенная цветами текстура может заполнить всю палитру и не оставить в ней места для других фигур и текстур. Функция SetDecalTransparencyColor задает прозрачные области текстуры.

Декалом (decal) называется текстура, которая воспроизводится непосредственно как визуальный элемент и обычно представляет собой что-то вроде плоского спрайта, всегда обращенного лицевой стороной к камере. Тем не менее прозрачные текстуры вовсе не обязаны использоваться в качестве декалов.


Главная страница