Народный учебник по OpenGL


Урок 22. Наложение микрорельефа - часть 17


 

Кроме того, вы, вероятно, поняли, что нам придется проводить умножения матриц на матрицы и матриц на вектора. Но об этом можно не беспокоиться: в OpenGL операция умножения матриц реализована (если точность правильная) и умножения матрицы на вектор реализована в функции VMatMult(M,v), где матрица M умножается на вектор v и результат сохраняется в v, то есть v:=M*v. Все передаваемые матрицы и вектора должны быть гомогенны (то бишь в одной системе координат — прим. перев.) и представлять собой матрицы 4x4 и четырехмерные вектора. Такие требования гарантируют быстрое и правильное умножение векторов и матриц по правилам OpenGL.

 

// Вычисляет v=vM, M — матрица 4x4 в порядке столбец-строка, v — четырехмерный вектор-строка (т.е. транспонированный)

void VMatMult(GLfloat *M, GLfloat *v) {

  GLfloat res[3];

  res[0]=M[ 0]*v[0]+M[ 1]*v[1]+M[ 2]*v[2]+M[ 3]*v[3];

  res[1]=M[ 4]*v[0]+M[ 5]*v[1]+M[ 6]*v[2]+M[ 7]*v[3];

  res[2]=M[ 8]*v[0]+M[ 9]*v[1]+M[10]*v[2]+M[11]*v[3];

  v[0]=res[0];

  v[1]=res[1];

  v[2]=res[2];

  v[3]=M[15];  // Гомогенные координаты

}

 

Начало теории ( Алгоритмы наложения микрорельефа методом тиснения )

 

Сейчас мы обсудим два разных алгоритма. Первый я нашел несколько дней назад здесь:

http://www.nvidia.com/marketing/Developer/DevRel.nsf/TechnicalDemosFrame?OpenPage

 

Программа называется GL_BUMP и была написана Диего Тартара (Diego Tartara) в 1999 году. Диего создал очень симпатичный пример наложения микрорельефа, хотя и не лишенный некоторых недостатков.

 

Однако давайте взглянем на алгоритм:

  1. Все вектора должны быть заданы ЛИБО в координатах объекта, ЛИБО в мировых координатах.
  2. Вычисляется вектор v направления из текущей вершины к источнику света
  3. v нормализуется
  4. v проецируется на касательную плоскость (Касательная плоскость — такая, которая касается поверхности в данной точке. Для нас эта точка — текущая вершина.).
  5. (s,t) сдвигается на величины соответственно x и y координат спроецированного вектора v.



  6. - Начало -  - Назад -  - Вперед -



    Книжный магазин