Поделиться через


Смешивание геометрии (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, могут улучшить реалистичность их персонажей, избегая серьезных последствий для производительности.

Смешивание состояний преобразования и отрисовки

Метод IDirect3Device9::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 матриц, может иметь n - 1 значений весов смешивания, по одному для каждой матрицы смешения, за исключением последней. Система автоматически присваивает вес последней матрице миров так, чтобы сумма всех весов была равна 1,0, выраженная здесь в обозначении сигма. Эта формула может быть упрощена для каждого из вариантов, поддерживаемых Direct3D, которая показана в следующих уравнениях.

уравнения линейного смешивания для трех вариантов смешивания

Это упрощенные формы полной формулы смешивания для двух, трех и четырех вариантов матрицы смешения.

Заметка

Хотя Direct3D включает дескрипторы FVF для определения вершин, содержащих до пяти весов смешения, в этом выпуске DirectX можно использовать только три.

 

Дополнительные сведения содержатся в следующих разделах.

конвейер обработки вершин