Геометрическое смешение (Direct3D 9)
Direct3D позволяет приложению повысить реалистичность своих сцен за счет отрисовки сегментированных многоугольных объектов, особенно символов, которые имеют плавное соединение. Эти эффекты часто называют скиннингом. Система достигает этого эффекта, применяя дополнительные матрицы преобразования мира к одному набору вершин для создания нескольких результатов, а затем выполняя линейную смесь между результирующими вершинами для создания единого набора геометрии для отрисовки. На следующем рисунке банана показан этот процесс.
На предыдущем рисунке показано, как можно представить себе процесс смешивания геометрии. В одном вызове отрисовки система принимает вершины для банана, преобразует их дважды - один раз без изменений, а один раз с простым поворотом - и смешивает результаты, чтобы создать согнутый банан. Система смешивает положение вершины, а также норму вершины при включенном освещении. Приложения не ограничиваются двумя путями смешивания; Direct3D может смешивать геометрию между четырьмя матрицами мира, включая стандартную матрицу мира , D3DTS_WORLD.
Примечание
Если освещение включено, нормали вершин преобразуются с помощью соответствующей обратной матрицы представления мира, взвешенной так же, как и при вычислениях положения вершин. Система нормализует результирующий нормальный вектор, если D3DRS_NORMALIZENORMALS состоянии отрисовки имеет значение TRUE.
Без смешивания геометрии динамические шарнирные модели часто отображаются в сегментах. Например, рассмотрим трехмерную модель человеческой руки. В самом простом представлении рука состоит из двух частей: верхняя рука, которая соединяется с телом, и нижняя рука, которая соединяется с рукой. Они соединены в локте, а нижняя рука вращается в этой точке. Приложение, которое отрисовывает руку, может хранить данные вершин для верхней и нижней рук, каждое из которых имеет отдельную матрицу преобразования мира. Это показано в следующем примере кода.
typedef struct _Arm
{
VERTEX upper_arm_verts[200];
D3DMATRIX matWorld_Upper;
VERTEX lower_arm_verts[200];
D3DMATRIX matWorld_Lower;
} ARM, *LPARM;
ARM MyArm; // This needs to be initialized.
Для отрисовки руки выполняются два вызова отрисовки, как показано в следующем коде.
// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
На следующем рисунке показан банан, измененный для использования этого метода.
Различия между смешиваемой геометрией и небеленой геометрией очевидны. Этот пример является несколько экстремальным. В реальном приложении соединения сегментированных моделей спроектированы таким образом, чтобы швы не были столь очевидными. Однако время от времени швы видны, что создает постоянные проблемы для разработчиков моделей.
Смешивание геометрии в Direct3D представляет собой альтернативу классическому сценарию сегментированного моделирования. Однако улучшенное визуальное качество сегментированных объектов происходит за счет вычислений смешения во время отрисовки. Чтобы свести к минимуму влияние этих дополнительных операций, геометрический конвейер Direct3D оптимизирован для смешивания геометрии с минимальными затратами. Приложения, которые интеллектуально используют службы смешивания геометрии, предлагаемые Direct3D, могут улучшить реалистичность своих персонажей, избегая серьезных последствий для производительности.
Состояния преобразования и отрисовки смешения
Метод IDirect3DDevice9::SetTransform распознает макросы D3DTS_WORLD и D3DTS_WORLDn , которые соответствуют значениям, которые могут быть определены макросом D3DTS_WORLDMATRIX . Эти макросы используются для определения матриц, между которыми будет смешиваться геометрия.
Перечислимый тип D3DRENDERSTATETYPE включает состояние D3DRS_VERTEXBLEND отрисовки для включения смешивания геометрии и управления ими. Допустимые значения для этого состояния отрисовки определяются перечислимым типом D3DVERTEXBLENDFLAGS . Если включено наложение геометрии, формат вершины должен включать соответствующее количество весовых коэффициентов.
Весовые коэффициенты смешения
Вес смешения, иногда называемый бета-весом, определяет степень, в которой данная мировая матрица влияет на вершину. Весы смешения — это значения с плавающей запятой в диапазоне от 0,0 до 1,0, закодированные в формате вершины, где значение 0,0 означает, что вершина не смешивается с этой матрицей, а 1,0 означает, что на вершину полностью влияет матрица.
Геометрические весовые коэффициенты смешивания кодируются в формате вершины, который отображается сразу после положения каждой вершины, как описано в разделе Фиксированные коды FVF функции (Direct3D 9). Количество весовых коэффициентов смешения передается в формате вершин путем включения одной из констант FVF в описание вершины , которое вы предоставляете методам отрисовки.
Система выполняет линейную смесь между взвешенную результаты матриц смешения. Следующая формула является полной формулой смешивания.
В предыдущем уравнении vBlend — это выходная вершина, v-элементы — это вершины, созданные примененной мировой матрицей (D3DTS_WORLDn). Элементы W — это соответствующие весовые значения в формате вершины. Вершина, смешающаяся между n матрицами, может иметь - 1 значения веса смешения, по одному для каждой матрицы смешения, за исключением последнего. Система автоматически создает вес для последней мировой матрицы, чтобы сумма всех весов была 1,0, выраженная здесь в сигме. Эту формулу можно упростить для каждого из вариантов, поддерживаемых Direct3D, как показано в следующих уравнениях.
Это упрощенные формы полной формулы смешивания для двух, трех и четырех матричных вариантов.
Примечание
Хотя Direct3D включает дескрипторы FVF для определения вершин, содержащих до пяти весовых коэффициентов смешения, в этом выпуске DirectX можно использовать только три.
Дополнительные сведения содержатся в следующих разделах.
- Использование геометрического смешивания (Direct3D 9)
- Индексированное наложение вершин (Direct3D 9)
- Вертекс tweening (Direct3D 9)
Связанные темы