October 5th, 2007

nyaload

GF8800 и D3DTTFF_PROJECTED

На NVidia GF8800 возникла такая проблема не работает D3DTTFF_COUNT4 | D3DTTFF_PROJECTED. Точнее, работает, но не так, как должен. Вот подробное описание как оно должно работать:
(x, y) в вершине -> (x, y, 1, 0) -> умножение на матрицу -> деление на четвёртный компонент w

Кстати, там у Тома вообще много информации, которая будет интересная живущих в прошлом "казуальным" программистам живущим с Fixed Pipeline на DX8 (всякие недокументированые ловушки в Direct3D).
Collapse )

updated: см. следующий пост
nyaload

1 + 0 == 0 + 1

По поводу предыдущего поста. Придумал как объехать (багу?). Хак так понравился, что решил его тут выложить :)

Проблема: NV-карта где-то внутри себя входную текстурную коордианту (x, y) превращает в (x, y, 0, 1) а ATI - (x, y, 1, 0), после чего оно умножается на мою матрицу

tmp = (x, y, 0, 1) * M
и в качестве результирущей текстурной координаты берутся
(tmp.x / tmp.w, tmp.y / tmp.w)

Проблема в том, что левый сомножитель - это или (x, y, 0, 1), или (x, y, 1, 0).

Добавим в матрицу M домножение, которое и из (x, y, 0, 1), и из (x, y, 1, 0) всегда делает вектор (x, y, 1, 0):


     (1, 0, 0, 0)
M' = (0, 1, 0, 0)  * M
     (0, 0, 1, 0)
     (0, 0, 1, 0)


(x, y, z, w) -> (x, y, z+w, 0)

(напоминаю для OpenGL-щиков, в D3D вектор стоит слева от матрицы)
И теперь вне зависимости от видеокарты оно работает одинаковым образом.

Ня! ^_^

PS. Изменить формат вершины спрайта, как один из выходов, я, к сожалению, простым образом не мог.
PPS. Железо от NVida сурово настолько, что может делить на ноль не задумываясь!

( http://halshop.files.wordpress.com/2007/03/phpw9jvl0pm.jpg )
nyaload

MA.2.Rus

вышла русская версия Маджонг Артефакт!
Collapse )
Так уж вышло, но сейвы совместимы с английской версией. Поэтому если вы ещё не купили английскую версию - можете получить ещё полчаса в русской :)