(x, y) в вершине -> (x, y, 1, 0) -> умножение на матрицу -> деление на четвёртный компонент w
Кстати, там у Тома вообще много информации, которая будет интересная
На Intel/ATI картах нормально работает код типа
device->SetTransform(D3DTRANSFORMSTATETYPE(D3DTS_TEXTURE0 + i), (D3DMATRIX*)(&stages[i].texTransform)); device->SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT4 | D3DTTFF_PROJECTED);
На GF8800 данный код приводит к случайно разбросаным текстурным координатам.
Если же поменять четвёртую и третью строки матрицы -
for (int i = 0; i < 4; ++i) Swap(m.m[2][i], m.m[3][i]);
то всё начинает рисоваться корректно. Зато перестаёт рисоваться на остальных видеокартах. Из чего я делаю вывод, что на GF из (x, y) получается не (x, y, 1, 0), а (x, y, 0, 1)
Кто-нибудь знаком с такими приколами и как их обходить?
Баг повторяется и в DX8, и в DX9.
Что интересно, в аналогичном коде в Managed DX(который обёртка для 9-го) такого бага нет. На NV-картах отличных от 8800 повторить не пробовал, так как нет под рукой.
Драйвера поменять пробовал, в DX Debug смотрел, не помогло.
updated: см. следующий пост