Войти
ПрограммированиеФорумГрафика

Зачем нам эти жирные матрицы? (6 стр)

Страницы: 1 2 3 4 5 6
#75
0:00, 23 июня 2016

Aslan
> Для ортогональной матрицы - получаем ее собственный вектор (=ось вращения) и соотв-й угол, угол умножаем на 0<=t<=1,
> получаем обратно матрицу поворота
Такой изврат надо еще поискать:)


#76
2:25, 23 июня 2016

Простите, а в чём разница между скалярными и векторными блоками в видеокартах? они же вроде как все во float'ах?

#77
3:05, 23 июня 2016

Aslan
> Для ортогональной матрицы - получаем ее собственный вектор
Я б посмотрел, как ты будешь находить собственный вектор матрицы 3*3.
На самом деле, нет, можешь не рассказывать. Я и так знаю, что за то время, сколько будет решаться кубическое уравнение, можно интерполировать кватернионов десять.

#78
8:43, 23 июня 2016

Ruins007
> Простите, а в чём разница между скалярными и векторными блоками в видеокартах?
> они же вроде как все во float'ах?

Разница в параллельном/последовательном выполнении вычислений в рамках одной конкретной вершины.

И да, Executor прав, посыпаю голову пеплом.

+ Показать
#79
8:45, 23 июня 2016

nonamezerox
> enum CacheMode
> {
>   CACHE_CA,            // cache at all levels
>   CACHE_WB = CACHE_CA, // cache write back
>   CACHE_CG,            // cache at global level
>   CACHE_CS,            // cache streaming
>   CACHE_CV,            // cache as volatile
>   CACHE_WT = CACHE_CV  // cache write-through
> };
Окуда выкопал? :)

#80
8:52, 23 июня 2016

Andrey

https://github.com/freedreno/mesa/blob/master/src/gallium/drivers… gen/nv50_ir.h

там еще ранее мякотка

+ Показать

Мде, не ожидал, что по функционалу тераскейл так конкретно был в пролете в свое время.

#81
10:57, 23 июня 2016

Andrey
> Окуда выкопал?

Теперь точно видишь, что байткод DX9 и код реальных GPU сильно отличаются ? Где там регистры ?

#82
18:45, 23 июня 2016

Delfigamer

template<class T>
Mat3<T> Rot(const Vec3<T>& l,const T fi)
{
  Mat3<T> m;
  Vec3<T> v(l.x*l.x,l.y*l.y,l.z*l.z);
  T d=1./(v.x+v.y+v.z),cf=cos(fi),o=(1.-cf)*d,t;
  Vec3<T> s=T(sin(fi)*sqrt(d))*l;
  m.m[0][0]=v.x*o+cf;
  m.m[1][1]=v.y*o+cf;
  m.m[2][2]=v.z*o+cf;
  t=l.x*l.y*o; m.m[0][1]=t-s.z; m.m[1][0]=t+s.z;
  t=l.x*l.z*o; m.m[0][2]=t+s.y; m.m[2][0]=t-s.y; 
  t=l.y*l.z*o; m.m[1][2]=t-s.x; m.m[2][1]=t+s.x;
  return m;
};

template<class T>
void Mat3<T>::Decomp(Vec3<T>& l,T& fi)
{
  T cf=0.5*(m[0][0]+m[1][1]+m[2][2]-1.); // cos(fi), 0<=fi<=pi
  if(cf>=1.0-eps) {
    fi=0;
    l=Vec3<T>(0,0,0);
  }
  else
  if(cf<=-1.0+eps) {
    // cosf=-1, sinf=0
    //  | 2*lx^2-1 2*lx*ly  2*lx*lz |
    //  | 2*lx*ly  2*ly^2-1 2*ly*lz |
    //  | 2*lx*lz  2*ly*lz  2*lz^2-1|
    fi=M_PI; 
    if(m[0][0]>=-1+eps) {
      l.x=sqrt((m[0][0]+1)*0.5);
      T d=0.5/l.x;
      l.y=m[0][1]*d;
      l.z=m[0][2]*d;
    } 
    else {
      l.x=0;
      if(m[1][1]>=-1+eps) {
        l.y=sqrt((m[1][1]+1)*0.5);
        l.z=m[1][2]/(l.y*2.);
      }
      else {
        l.y=0;
        l.z=1;
      };
    };
  }
  else {
    fi=acos(cf);
    T sf=0.5/sqrt(1-cf*cf);
    l.x=(m[2][1]-m[1][2])*sf;
    l.y=(m[0][2]-m[2][0])*sf;
    l.z=(m[1][0]-m[0][1])*sf;
  };
};
#83
0:51, 24 июня 2016

Aslan
О чём я и говорю, куча приседаний ради того, чтобы сделать ещё десять приседаний.

#84
18:24, 2 июля 2016

Ruins007
>> сабж
Как захочешь, так трансформации в шейдер и передашь. Кватернионы или матрицы - разницы в производительности возникнуть не должно, это же операции над вертексами, а не над пикселями, вертексов-то меньше :) А можно разложить матрицу и на три вектора, чтобы было понятней, или вообще вычислять какими-то другими способами (синусами-косинусами?). Все удовольствия за ваш счёт :)

ИМХО, спорить о производительности на примере количества сложений-вычитаний в отдельных инструкциях бессмысленно. Иногда проще посчитать кватернионом, иногда - перемножениями матриц. В зависимости от задачи. А что проще, то, как правило, и быстрее :)

Страницы: 1 2 3 4 5 6
ПрограммированиеФорумГрафика

Тема в архиве.