Последовательность преобразований: проективное текстурирование (HLSL) - PullRequest
6 голосов
/ 02 июля 2011

Когда я читал эту статью о проективном текстурировании (9.3.2) на nvidia, я наткнулся на этот график:

http://http.developer.nvidia.com/CgTutorial/elementLinks/252equ01.jpg

Порядок вкакие преобразования написаны, смутили меня.Это потому, что я научился читать умножение матриц слева направо, а также потому, что я думал, что последовательность преобразований должна идти в следующем порядке:

http://http.developer.nvidia.com/CgTutorial/elementLinks/fig4_1.jpg

Теперь мои вопросы следующие:

Поскольку умножение матриц не является коммутативным, в каком порядке я должен выполнять умножения?

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

Под тем же порядком последовательности я подразумеваю что-то вроде этого кода hlsl:

float4 worldPosition        = mul(input.Position, World);
float4 viewPosition         = mul(worldPosition, View);
output.Position             = mul(viewPosition, Projection);

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

1 Ответ

4 голосов
/ 03 июля 2011

Ваше преобразование может быть записано символически как

y = TPVW x

где:

x = (x0, y0, z0, w0) T : координаты объекта (вектор столбца 4x1) y = (s, t, r, q) T : координаты пространства окна (вектор столбца 4x1) Ш : матрица моделирования мира (4x4) V : просмотр матрицы моделирования (4x4) P : матрица проекции (4x4) T : матрица преобразования области просмотра (4x4)

Расчет выполняется следующим образом:

y = T (P (V (W x)))

т.е. справа налево.Код HLSL будет:

float4 worldPosition  = mul(World, input.Position);     // W x
float4 viewPosition   = mul(View, worldPosition);       // V (W x)
float4 projPosition   = mul(Projection, viewPosition);  // P (V (W x))
float4 vportPosition  = mul(Viewport, projPosition);    // T (P (V (W x)))
...