Пушыстый (_winnie) wrote,
Пушыстый
_winnie

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 )
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments