Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Алгоритмы / Графика / demodesign 3D programming FAQ /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Разное - Программирование от RIN.RU
Разное



Субтексельная точность


Субтексельная точность сильно смахивает на субпиксельную. Необходимость в ней появляется из-за следующего факта: рисовать строку мы начинаем с какого-то нецелого sx, но с целого пиксела. Из-за этого (sx может "гулять" в пределах одного пиксела почти на единицу!) возникает дрожание текстур примерно на тот самый пиксел. Устраняется это точно таким же сдвигом, как и в субпиксельной точности, то есть перед отрисовкой строки корректируются начальные значения величин, интерполируемых по строке (u, v, освещенность...):


// ...
u_start += du_dsx * (ceil(sx) - sx);
v_start += dv_dsx * (ceil(sx) - sx);
// ...


Это уже немного замедляет работу (на величину порядка 5-10%), но улучшение качества картинки того стоит. Кроме того, субтексельную точность вполне можно совместить с 2D-отсечением и получить отсечение, которое не съедает никаких ресурсов и не замедляет работу. Вообще.


Поворот 3D вектора за шесть умножений


Обычно поворот 3D вектора делают умножением матрицы поворота на этот вектор. Эта операция требует 9 умножений и 6 сложений. Но с использованием небольшого precalculation (предварительного расчета) ее можно несколько ускорить.


Пусть нам надо умножить какую-то строку матрицы (a,b,c) на вектор (x,y,z). Результат должен быть равен


r = a*x+b*y+c*z.


То есть как раз по 3 умножения и 2 сложения на одну строку. Но с другой стороны,


r = a*x+b*y+c*z = (a*x+b*y+a*b+x*y)+c*z-a*b-x*y = (a+y)*(b+x)+c*z-a*b-x*y.


Проще эта формула явно не выглядит. Но дело в том, что x*y - это постоянная величина, так как x, y - это координаты вершины неповернутого объекта, а они обычно не меняются. А a*b достаточно посчитать при расчете матрицы поворота, и это тоже постоянная величина для каждой матрицы. Т.о.


r = (a+y)*(b+x)+c*z-c1-c2.




В результате имеем 2 умножения и 4 сложения на одну строку, то есть те самые 6 умножений и 12 сложений на вектор. Выиграли 3 умножения ценой 6 сложений.


<<<  НазадВперед  >>>
 1  2  3  4  5  6 


 8  Комментарии к статье  8 8  Обсудить в чате

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь